diff options
Diffstat (limited to 'include/asm-generic')
-rw-r--r-- | include/asm-generic/bitops.h | 1 | ||||
-rw-r--r-- | include/asm-generic/bitops/lock.h | 45 |
2 files changed, 46 insertions, 0 deletions
diff --git a/include/asm-generic/bitops.h b/include/asm-generic/bitops.h index 1f9d99193df8..e022a0f59e6b 100644 --- a/include/asm-generic/bitops.h +++ b/include/asm-generic/bitops.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm-generic/bitops/sched.h> | 22 | #include <asm-generic/bitops/sched.h> |
23 | #include <asm-generic/bitops/ffs.h> | 23 | #include <asm-generic/bitops/ffs.h> |
24 | #include <asm-generic/bitops/hweight.h> | 24 | #include <asm-generic/bitops/hweight.h> |
25 | #include <asm-generic/bitops/lock.h> | ||
25 | 26 | ||
26 | #include <asm-generic/bitops/ext2-non-atomic.h> | 27 | #include <asm-generic/bitops/ext2-non-atomic.h> |
27 | #include <asm-generic/bitops/ext2-atomic.h> | 28 | #include <asm-generic/bitops/ext2-atomic.h> |
diff --git a/include/asm-generic/bitops/lock.h b/include/asm-generic/bitops/lock.h new file mode 100644 index 000000000000..308a9e22c802 --- /dev/null +++ b/include/asm-generic/bitops/lock.h | |||
@@ -0,0 +1,45 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_LOCK_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_LOCK_H_ | ||
3 | |||
4 | /** | ||
5 | * test_and_set_bit_lock - Set a bit and return its old value, for lock | ||
6 | * @nr: Bit to set | ||
7 | * @addr: Address to count from | ||
8 | * | ||
9 | * This operation is atomic and provides acquire barrier semantics. | ||
10 | * It can be used to implement bit locks. | ||
11 | */ | ||
12 | #define test_and_set_bit_lock(nr, addr) test_and_set_bit(nr, addr) | ||
13 | |||
14 | /** | ||
15 | * clear_bit_unlock - Clear a bit in memory, for unlock | ||
16 | * @nr: the bit to set | ||
17 | * @addr: the address to start counting from | ||
18 | * | ||
19 | * This operation is atomic and provides release barrier semantics. | ||
20 | */ | ||
21 | #define clear_bit_unlock(nr, addr) \ | ||
22 | do { \ | ||
23 | smp_mb__before_clear_bit(); \ | ||
24 | clear_bit(nr, addr); \ | ||
25 | } while (0) | ||
26 | |||
27 | /** | ||
28 | * __clear_bit_unlock - Clear a bit in memory, for unlock | ||
29 | * @nr: the bit to set | ||
30 | * @addr: the address to start counting from | ||
31 | * | ||
32 | * This operation is like clear_bit_unlock, however it is not atomic. | ||
33 | * It does provide release barrier semantics so it can be used to unlock | ||
34 | * a bit lock, however it would only be used if no other CPU can modify | ||
35 | * any bits in the memory until the lock is released (a good example is | ||
36 | * if the bit lock itself protects access to the other bits in the word). | ||
37 | */ | ||
38 | #define __clear_bit_unlock(nr, addr) \ | ||
39 | do { \ | ||
40 | smp_mb(); \ | ||
41 | __clear_bit(nr, addr); \ | ||
42 | } while (0) | ||
43 | |||
44 | #endif /* _ASM_GENERIC_BITOPS_LOCK_H_ */ | ||
45 | |||