diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-04-25 21:10:58 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-04-25 21:10:58 -0400 |
| commit | 3dd2ee4824b668a635d6d2bb6bc73f33708cab9f (patch) | |
| tree | 40d8d017d9631ecefae76eb09e1bbecc23e17452 /include/linux | |
| parent | 5dd12af05ca6b7d052c06a9ca4ff755fdfa25ae4 (diff) | |
bit_spinlock: don't play preemption games inside the busy loop
When we are waiting for the bit-lock to be released, and are looping
over the 'cpu_relax()' should not be doing anything else - otherwise we
miss the point of trying to do the whole 'cpu_relax()'.
Do the preemption enable/disable around the loop, rather than inside of
it.
Noticed when I was looking at the code generation for the dcache
__d_drop usage, and the code just looked very odd.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/bit_spinlock.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/include/linux/bit_spinlock.h b/include/linux/bit_spinlock.h index e612575a2596..b4326bfa684f 100644 --- a/include/linux/bit_spinlock.h +++ b/include/linux/bit_spinlock.h | |||
| @@ -23,11 +23,11 @@ static inline void bit_spin_lock(int bitnum, unsigned long *addr) | |||
| 23 | preempt_disable(); | 23 | preempt_disable(); |
| 24 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) | 24 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
| 25 | while (unlikely(test_and_set_bit_lock(bitnum, addr))) { | 25 | while (unlikely(test_and_set_bit_lock(bitnum, addr))) { |
| 26 | while (test_bit(bitnum, addr)) { | 26 | preempt_enable(); |
| 27 | preempt_enable(); | 27 | do { |
| 28 | cpu_relax(); | 28 | cpu_relax(); |
| 29 | preempt_disable(); | 29 | } while (test_bit(bitnum, addr)); |
| 30 | } | 30 | preempt_disable(); |
| 31 | } | 31 | } |
| 32 | #endif | 32 | #endif |
| 33 | __acquire(bitlock); | 33 | __acquire(bitlock); |
