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 | |
| 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>
| -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 a0b348068cae..467d9415a32e 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 */ |
