Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3dd2ee48 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5dd12af0
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -23,12 +23,12 @@ 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();
		do {
			cpu_relax();
		} while (test_bit(bitnum, addr));
		preempt_disable();
	}
	}
#endif
	__acquire(bitlock);
}