summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-04-25 18:10:58 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2011-04-25 18:10:58 -0700
commit3dd2ee4824b668a635d6d2bb6bc73f33708cab9f (patch)
tree40d8d017d9631ecefae76eb09e1bbecc23e17452 /include
parent5dd12af05ca6b7d052c06a9ca4ff755fdfa25ae4 (diff)
downloadop-kernel-dev-3dd2ee4824b668a635d6d2bb6bc73f33708cab9f.zip
op-kernel-dev-3dd2ee4824b668a635d6d2bb6bc73f33708cab9f.tar.gz
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')
-rw-r--r--include/linux/bit_spinlock.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/include/linux/bit_spinlock.h b/include/linux/bit_spinlock.h
index e612575..b4326bf 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)
preempt_disable();
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
- while (test_bit(bitnum, addr)) {
- preempt_enable();
+ preempt_enable();
+ do {
cpu_relax();
- preempt_disable();
- }
+ } while (test_bit(bitnum, addr));
+ preempt_disable();
}
#endif
__acquire(bitlock);
OpenPOWER on IntegriCloud