diff options
author | Nick Piggin <npiggin@suse.de> | 2007-10-18 06:06:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-18 17:37:29 -0400 |
commit | 26333576fd0d0b52f6e4025c5aded97e188bdd44 (patch) | |
tree | a9c1f9518d940a8ef10453871f2899ca18d46efa /include/asm-generic | |
parent | 38048983e14c0fb6324175fbaf2be1baa842f5ee (diff) |
bitops: introduce lock ops
Introduce test_and_set_bit_lock / clear_bit_unlock bitops with lock semantics.
Convert all architectures to use the generic implementation.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Acked-By: David Howells <dhowells@redhat.com>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Bryan Wu <bryan.wu@analog.com>
Cc: Mikael Starvik <starvik@axis.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Greg Ungerer <gerg@uclinux.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Matthew Wilcox <willy@debian.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Cc: Richard Curnow <rc@rc0.org.uk>
Cc: William Lee Irwin III <wli@holomorphy.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Cc: Miles Bader <uclinux-v850@lsi.nec.co.jp>
Cc: Andi Kleen <ak@muc.de>
Cc: Chris Zankel <chris@zankel.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
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 | |||