rwsem.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * rwsem.h: R/W semaphores implemented using CAS
  3. *
  4. * Written by David S. Miller (davem@redhat.com), 2001.
  5. * Derived from asm-i386/rwsem.h
  6. */
  7. #ifndef _SPARC64_RWSEM_H
  8. #define _SPARC64_RWSEM_H
  9. #ifndef _LINUX_RWSEM_H
  10. #error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
  11. #endif
  12. #ifdef __KERNEL__
  13. #include <linux/list.h>
  14. #include <linux/spinlock.h>
  15. #include <asm/rwsem-const.h>
  16. struct rwsem_waiter;
  17. struct rw_semaphore {
  18. signed int count;
  19. spinlock_t wait_lock;
  20. struct list_head wait_list;
  21. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  22. struct lockdep_map dep_map;
  23. #endif
  24. };
  25. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  26. # define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
  27. #else
  28. # define __RWSEM_DEP_MAP_INIT(lockname)
  29. #endif
  30. #define __RWSEM_INITIALIZER(name) \
  31. { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) \
  32. __RWSEM_DEP_MAP_INIT(name) }
  33. #define DECLARE_RWSEM(name) \
  34. struct rw_semaphore name = __RWSEM_INITIALIZER(name)
  35. extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
  36. struct lock_class_key *key);
  37. #define init_rwsem(sem) \
  38. do { \
  39. static struct lock_class_key __key; \
  40. \
  41. __init_rwsem((sem), #sem, &__key); \
  42. } while (0)
  43. extern void __down_read(struct rw_semaphore *sem);
  44. extern int __down_read_trylock(struct rw_semaphore *sem);
  45. extern void __down_write(struct rw_semaphore *sem);
  46. extern int __down_write_trylock(struct rw_semaphore *sem);
  47. extern void __up_read(struct rw_semaphore *sem);
  48. extern void __up_write(struct rw_semaphore *sem);
  49. extern void __downgrade_write(struct rw_semaphore *sem);
  50. static inline void __down_write_nested(struct rw_semaphore *sem, int subclass)
  51. {
  52. __down_write(sem);
  53. }
  54. static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
  55. {
  56. return atomic_add_return(delta, (atomic_t *)(&sem->count));
  57. }
  58. static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
  59. {
  60. atomic_add(delta, (atomic_t *)(&sem->count));
  61. }
  62. static inline int rwsem_is_locked(struct rw_semaphore *sem)
  63. {
  64. return (sem->count != 0);
  65. }
  66. #endif /* __KERNEL__ */
  67. #endif /* _SPARC64_RWSEM_H */