diff options
author | Matt Fleming <matt@console-pimps.org> | 2009-06-13 17:23:27 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-06-14 11:31:17 -0400 |
commit | 0c50f6f38399685d0c9ef0f5ffd6c4955e31cb26 (patch) | |
tree | 7709bc7ab43998a08028b744ecc1a3626568bb11 /arch/sh | |
parent | 3767f3f1ee11da55760616a2c68a09c02babdd9b (diff) |
sh: Make the atomic functions safe for irqsoff tracing
The irqsoff tracer uses the atomic_* functions internally, but the
implementations of those functions in arch/sh/include/asm/atomic-irq.h
disable irqs to achieve atomicity. A continuous loop ensues where we
disable interrupts, trace the interrupt disabling, call atomic_*
functions, disable interrupts, trace the interrupt disabling, etc..
The simplest solution to all this is to just convert uses of
local_irq_save()/local_irq_restore() the raw_* equivalents because the
raw_* equivalents don't call trace_hardirqs_on()/trace_hardirqs_off().
Signed-off-by: Matt Fleming <matt@console-pimps.org>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh')
-rw-r--r-- | arch/sh/include/asm/atomic-irq.h | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/arch/sh/include/asm/atomic-irq.h b/arch/sh/include/asm/atomic-irq.h index a0b348068ca..467d9415a32 100644 --- a/arch/sh/include/asm/atomic-irq.h +++ b/arch/sh/include/asm/atomic-irq.h | |||
@@ -10,29 +10,29 @@ static inline void atomic_add(int i, atomic_t *v) | |||
10 | { | 10 | { |
11 | unsigned long flags; | 11 | unsigned long flags; |
12 | 12 | ||
13 | local_irq_save(flags); | 13 | raw_local_irq_save(flags); |
14 | v->counter += i; | 14 | v->counter += i; |
15 | local_irq_restore(flags); | 15 | raw_local_irq_restore(flags); |
16 | } | 16 | } |
17 | 17 | ||
18 | static inline void atomic_sub(int i, atomic_t *v) | 18 | static inline void atomic_sub(int i, atomic_t *v) |
19 | { | 19 | { |
20 | unsigned long flags; | 20 | unsigned long flags; |
21 | 21 | ||
22 | local_irq_save(flags); | 22 | raw_local_irq_save(flags); |
23 | v->counter -= i; | 23 | v->counter -= i; |
24 | local_irq_restore(flags); | 24 | raw_local_irq_restore(flags); |
25 | } | 25 | } |
26 | 26 | ||
27 | static inline int atomic_add_return(int i, atomic_t *v) | 27 | static inline int atomic_add_return(int i, atomic_t *v) |
28 | { | 28 | { |
29 | unsigned long temp, flags; | 29 | unsigned long temp, flags; |
30 | 30 | ||
31 | local_irq_save(flags); | 31 | raw_local_irq_save(flags); |
32 | temp = v->counter; | 32 | temp = v->counter; |
33 | temp += i; | 33 | temp += i; |
34 | v->counter = temp; | 34 | v->counter = temp; |
35 | local_irq_restore(flags); | 35 | raw_local_irq_restore(flags); |
36 | 36 | ||
37 | return temp; | 37 | return temp; |
38 | } | 38 | } |
@@ -41,11 +41,11 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
41 | { | 41 | { |
42 | unsigned long temp, flags; | 42 | unsigned long temp, flags; |
43 | 43 | ||
44 | local_irq_save(flags); | 44 | raw_local_irq_save(flags); |
45 | temp = v->counter; | 45 | temp = v->counter; |
46 | temp -= i; | 46 | temp -= i; |
47 | v->counter = temp; | 47 | v->counter = temp; |
48 | local_irq_restore(flags); | 48 | raw_local_irq_restore(flags); |
49 | 49 | ||
50 | return temp; | 50 | return temp; |
51 | } | 51 | } |
@@ -54,18 +54,18 @@ static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | |||
54 | { | 54 | { |
55 | unsigned long flags; | 55 | unsigned long flags; |
56 | 56 | ||
57 | local_irq_save(flags); | 57 | raw_local_irq_save(flags); |
58 | v->counter &= ~mask; | 58 | v->counter &= ~mask; |
59 | local_irq_restore(flags); | 59 | raw_local_irq_restore(flags); |
60 | } | 60 | } |
61 | 61 | ||
62 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | 62 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) |
63 | { | 63 | { |
64 | unsigned long flags; | 64 | unsigned long flags; |
65 | 65 | ||
66 | local_irq_save(flags); | 66 | raw_local_irq_save(flags); |
67 | v->counter |= mask; | 67 | v->counter |= mask; |
68 | local_irq_restore(flags); | 68 | raw_local_irq_restore(flags); |
69 | } | 69 | } |
70 | 70 | ||
71 | #endif /* __ASM_SH_ATOMIC_IRQ_H */ | 71 | #endif /* __ASM_SH_ATOMIC_IRQ_H */ |