Commit b8dc93cbe91324b922395919cd5df4cca2fe55f6
Committed by
Linus Torvalds
1 parent
66ffb04ca5
Exists in
master
and in
7 other branches
bit_spin_lock: use lock bitops
Convert bit_spin_lock to new locking bitops. Slub can use the non-atomic store version to clear (Christoph?) Signed-off-by: Nick Piggin <npiggin@suse.de> Cc: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 22 additions and 4 deletions Side-by-side Diff
include/linux/bit_spinlock.h
... | ... | @@ -18,7 +18,7 @@ |
18 | 18 | */ |
19 | 19 | preempt_disable(); |
20 | 20 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
21 | - while (test_and_set_bit(bitnum, addr)) { | |
21 | + while (unlikely(test_and_set_bit_lock(bitnum, addr))) { | |
22 | 22 | while (test_bit(bitnum, addr)) { |
23 | 23 | preempt_enable(); |
24 | 24 | cpu_relax(); |
... | ... | @@ -36,7 +36,7 @@ |
36 | 36 | { |
37 | 37 | preempt_disable(); |
38 | 38 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
39 | - if (test_and_set_bit(bitnum, addr)) { | |
39 | + if (unlikely(test_and_set_bit_lock(bitnum, addr))) { | |
40 | 40 | preempt_enable(); |
41 | 41 | return 0; |
42 | 42 | } |
43 | 43 | |
44 | 44 | |
... | ... | @@ -50,10 +50,28 @@ |
50 | 50 | */ |
51 | 51 | static inline void bit_spin_unlock(int bitnum, unsigned long *addr) |
52 | 52 | { |
53 | +#ifdef CONFIG_DEBUG_SPINLOCK | |
54 | + BUG_ON(!test_bit(bitnum, addr)); | |
55 | +#endif | |
53 | 56 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
57 | + clear_bit_unlock(bitnum, addr); | |
58 | +#endif | |
59 | + preempt_enable(); | |
60 | + __release(bitlock); | |
61 | +} | |
62 | + | |
63 | +/* | |
64 | + * bit-based spin_unlock() | |
65 | + * non-atomic version, which can be used eg. if the bit lock itself is | |
66 | + * protecting the rest of the flags in the word. | |
67 | + */ | |
68 | +static inline void __bit_spin_unlock(int bitnum, unsigned long *addr) | |
69 | +{ | |
70 | +#ifdef CONFIG_DEBUG_SPINLOCK | |
54 | 71 | BUG_ON(!test_bit(bitnum, addr)); |
55 | - smp_mb__before_clear_bit(); | |
56 | - clear_bit(bitnum, addr); | |
72 | +#endif | |
73 | +#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) | |
74 | + __clear_bit_unlock(bitnum, addr); | |
57 | 75 | #endif |
58 | 76 | preempt_enable(); |
59 | 77 | __release(bitlock); |