126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#ifndef _ASM_GENERIC_BITOPS_LOCK_H_ 226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#define _ASM_GENERIC_BITOPS_LOCK_H_ 326333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin 426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin/** 526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * test_and_set_bit_lock - Set a bit and return its old value, for lock 626333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @nr: Bit to set 726333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @addr: Address to count from 826333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * 926333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * This operation is atomic and provides acquire barrier semantics. 1026333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * It can be used to implement bit locks. 1126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin */ 1226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#define test_and_set_bit_lock(nr, addr) test_and_set_bit(nr, addr) 1326333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin 1426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin/** 1526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * clear_bit_unlock - Clear a bit in memory, for unlock 1626333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @nr: the bit to set 1726333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @addr: the address to start counting from 1826333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * 1926333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * This operation is atomic and provides release barrier semantics. 2026333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin */ 2126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#define clear_bit_unlock(nr, addr) \ 2226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggindo { \ 234e857c58efeb99393cba5a5d0d8ec7117183137cPeter Zijlstra smp_mb__before_atomic(); \ 2426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin clear_bit(nr, addr); \ 2526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin} while (0) 2626333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin 2726333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin/** 2826333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * __clear_bit_unlock - Clear a bit in memory, for unlock 2926333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @nr: the bit to set 3026333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @addr: the address to start counting from 3126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * 3226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * This operation is like clear_bit_unlock, however it is not atomic. 3326333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * It does provide release barrier semantics so it can be used to unlock 3426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * a bit lock, however it would only be used if no other CPU can modify 3526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * any bits in the memory until the lock is released (a good example is 3626333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * if the bit lock itself protects access to the other bits in the word). 3726333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin */ 3826333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#define __clear_bit_unlock(nr, addr) \ 3926333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggindo { \ 4026333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin smp_mb(); \ 4126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin __clear_bit(nr, addr); \ 4226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin} while (0) 4326333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin 4426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#endif /* _ASM_GENERIC_BITOPS_LOCK_H_ */ 4526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin 46