From: Marcelo Tosatti Back when we were discussing the need for a memory barrier in sync_page(), it came to me (thanks Andrea!) that the bit operations can be perfectly reordered on architectures other than x86. I think the commentary on i386 bitops.h is misleading, its worth to note that that these operations are not guaranteed not to be reordered on different architectures. clear_bit() already does that: * clear_bit() is atomic and may not be reordered. However, it does * not contain a memory barrier, so if it is used for locking purposes, * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() * in order to ensure changes are visible on other processors. Signed-off-by: Andrew Morton --- 25-akpm/include/asm-i386/bitops.h | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff -puN include/asm-i386/bitops.h~x86-bitopsh-commentary-on-instruction-reordering include/asm-i386/bitops.h --- 25/include/asm-i386/bitops.h~x86-bitopsh-commentary-on-instruction-reordering Thu Aug 5 15:44:51 2004 +++ 25-akpm/include/asm-i386/bitops.h Thu Aug 5 15:44:51 2004 @@ -31,6 +31,11 @@ * * This function is atomic and may not be reordered. See __set_bit() * if you do not require the atomic guarantees. + * + * Note: there are no guarantees that this function will not be reordered + * on non x86 architectures, so if you are writting portable code, + * make sure not to rely on its reordering guarantees. + * * Note that @nr may be almost arbitrarily large; this function is not * restricted to acting on a single-word quantity. */ @@ -109,7 +114,8 @@ static inline void __change_bit(int nr, * @nr: Bit to change * @addr: Address to start counting from * - * change_bit() is atomic and may not be reordered. + * change_bit() is atomic and may not be reordered. It may be + * reordered on other architectures than x86. * Note that @nr may be almost arbitrarily large; this function is not * restricted to acting on a single-word quantity. */ @@ -127,6 +133,7 @@ static inline void change_bit(int nr, vo * @addr: Address to count from * * This operation is atomic and cannot be reordered. + * It may be reordered on other architectures than x86. * It also implies a memory barrier. */ static inline int test_and_set_bit(int nr, volatile unsigned long * addr) @@ -165,7 +172,8 @@ static inline int __test_and_set_bit(int * @nr: Bit to clear * @addr: Address to count from * - * This operation is atomic and cannot be reordered. + * This operation is atomic and cannot be reordered. + * It can be reorderdered on other architectures other than x86. * It also implies a memory barrier. */ static inline int test_and_clear_bit(int nr, volatile unsigned long * addr) _