1
diff -Nurp nv.orig/os-interface.c nv/os-interface.c
2
--- nv.orig/os-interface.c 2009-06-26 03:59:39.000000000 +0200
3
+++ nv/os-interface.c 2009-10-25 12:51:50.542528175 +0100
4
@@ -75,7 +75,7 @@ typedef struct os_sema_s
6
struct completion completion;
7
#if defined(CONFIG_PREEMPT_RT)
9
+ atomic_spinlock_t lock;
13
@@ -101,7 +101,11 @@ RM_STATUS NV_API_CALL os_alloc_sema
15
os_sema = (os_sema_t *)*ppSema;
16
init_completion(&os_sema->completion);
17
+#if defined(CONFIG_PREEMPT_RT)
18
+ atomic_spin_lock_init(&os_sema->lock);
20
spin_lock_init(&os_sema->lock);
25
@@ -140,18 +144,30 @@ RM_STATUS NV_API_CALL os_acquire_sema
26
os_sema_t *os_sema = (os_sema_t *)pSema;
27
unsigned long old_irq;
29
+#if defined(CONFIG_PREEMPT_RT)
30
+ atomic_spin_lock_irqsave(&os_sema->lock, old_irq);
32
spin_lock_irqsave(&os_sema->lock, old_irq);
34
if (os_sema->count <= 0)
37
+#if defined(CONFIG_PREEMPT_RT)
38
+ atomic_spin_unlock_irqrestore(&os_sema->lock, old_irq);
40
spin_unlock_irqrestore(&os_sema->lock, old_irq);
42
wait_for_completion(&os_sema->completion);
47
rm_disable_interrupts();
48
+#if defined(CONFIG_PREEMPT_RT)
49
+ atomic_spin_unlock_irqrestore(&os_sema->lock, old_irq);
51
spin_unlock_irqrestore(&os_sema->lock, old_irq);
56
@@ -174,17 +190,29 @@ BOOL NV_API_CALL os_cond_acquire_sema
57
os_sema_t *os_sema = (os_sema_t *)pSema;
58
unsigned long old_irq;
60
+#if defined(CONFIG_PREEMPT_RT)
61
+ atomic_spin_lock_irqsave(&os_sema->lock, old_irq);
63
spin_lock_irqsave(&os_sema->lock, old_irq);
65
if (os_sema->count <= 0)
67
+#if defined(CONFIG_PREEMPT_RT)
68
+ atomic_spin_unlock_irqrestore(&os_sema->lock, old_irq);
70
spin_unlock_irqrestore(&os_sema->lock, old_irq);
77
rm_disable_interrupts();
78
+#if defined(CONFIG_PREEMPT_RT)
79
+ atomic_spin_unlock_irqrestore(&os_sema->lock, old_irq);
81
spin_unlock_irqrestore(&os_sema->lock, old_irq);
86
@@ -208,7 +236,11 @@ RM_STATUS NV_API_CALL os_release_sema
87
unsigned long old_irq;
90
+#if defined(CONFIG_PREEMPT_RT)
91
+ atomic_spin_lock_irqsave(&os_sema->lock, old_irq);
93
spin_lock_irqsave(&os_sema->lock, old_irq);
95
if (os_sema->count < 0)
98
@@ -219,7 +251,11 @@ RM_STATUS NV_API_CALL os_release_sema
99
rm_enable_interrupts();
102
+#if defined(CONFIG_PREEMPT_RT)
103
+ atomic_spin_unlock_irqrestore(&os_sema->lock, old_irq);
105
spin_unlock_irqrestore(&os_sema->lock, old_irq);
109
complete(&os_sema->completion);