lock.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #ifndef _ASM_GENERIC_BITOPS_LOCK_H_
  2. #define _ASM_GENERIC_BITOPS_LOCK_H_
  3. /**
  4. * test_and_set_bit_lock - Set a bit and return its old value, for lock
  5. * @nr: Bit to set
  6. * @addr: Address to count from
  7. *
  8. * This operation is atomic and provides acquire barrier semantics.
  9. * It can be used to implement bit locks.
  10. */
  11. #define test_and_set_bit_lock(nr, addr) test_and_set_bit(nr, addr)
  12. /**
  13. * clear_bit_unlock - Clear a bit in memory, for unlock
  14. * @nr: the bit to set
  15. * @addr: the address to start counting from
  16. *
  17. * This operation is atomic and provides release barrier semantics.
  18. */
  19. #define clear_bit_unlock(nr, addr) \
  20. do { \
  21. smp_mb__before_clear_bit(); \
  22. clear_bit(nr, addr); \
  23. } while (0)
  24. /**
  25. * __clear_bit_unlock - Clear a bit in memory, for unlock
  26. * @nr: the bit to set
  27. * @addr: the address to start counting from
  28. *
  29. * This operation is like clear_bit_unlock, however it is not atomic.
  30. * It does provide release barrier semantics so it can be used to unlock
  31. * a bit lock, however it would only be used if no other CPU can modify
  32. * any bits in the memory until the lock is released (a good example is
  33. * if the bit lock itself protects access to the other bits in the word).
  34. */
  35. #define __clear_bit_unlock(nr, addr) \
  36. do { \
  37. smp_mb(); \
  38. __clear_bit(nr, addr); \
  39. } while (0)
  40. #endif /* _ASM_GENERIC_BITOPS_LOCK_H_ */