Skip to content

Commit

Permalink
bit_spinlock: don't play preemption games inside the busy loop
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
torvalds committed Apr 26, 2011
1 parent 5dd12af commit 3dd2ee4
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions include/linux/bit_spinlock.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 3dd2ee4

Please sign in to comment.