blob: 8ef0ccbf8167857c1c16c8235b745b1a8f37b3b0 [file] [log] [blame]
Nick Piggin26333572007-10-18 03:06:39 -07001#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) \
22do { \
Peter Zijlstra4e857c52014-03-17 18:06:10 +010023 smp_mb__before_atomic(); \
Nick Piggin26333572007-10-18 03:06:39 -070024 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 *
Peter Zijlstraf75d4862016-03-09 12:40:54 +010032 * A weaker form of clear_bit_unlock() as used by __bit_lock_unlock(). If all
33 * the bits in the word are protected by this lock some archs can use weaker
34 * ops to safely unlock.
35 *
36 * See for example x86's implementation.
Nick Piggin26333572007-10-18 03:06:39 -070037 */
38#define __clear_bit_unlock(nr, addr) \
39do { \
Peter Zijlstraf75d4862016-03-09 12:40:54 +010040 smp_mb__before_atomic(); \
41 clear_bit(nr, addr); \
Nick Piggin26333572007-10-18 03:06:39 -070042} while (0)
43
44#endif /* _ASM_GENERIC_BITOPS_LOCK_H_ */
45