rwlock_rt.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #ifndef __LINUX_RWLOCK_RT_H
  3. #define __LINUX_RWLOCK_RT_H
  4. #ifndef __LINUX_SPINLOCK_RT_H
  5. #error Do not #include directly. Use <linux/spinlock.h>.
  6. #endif
  7. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  8. extern void __rt_rwlock_init(rwlock_t *rwlock, const char *name,
  9. struct lock_class_key *key);
  10. #else
  11. static inline void __rt_rwlock_init(rwlock_t *rwlock, char *name,
  12. struct lock_class_key *key)
  13. {
  14. }
  15. #endif
  16. #define rwlock_init(rwl) \
  17. do { \
  18. static struct lock_class_key __key; \
  19. \
  20. init_rwbase_rt(&(rwl)->rwbase); \
  21. __rt_rwlock_init(rwl, #rwl, &__key); \
  22. } while (0)
  23. extern void rt_read_lock(rwlock_t *rwlock);
  24. extern int rt_read_trylock(rwlock_t *rwlock);
  25. extern void rt_read_unlock(rwlock_t *rwlock);
  26. extern void rt_write_lock(rwlock_t *rwlock);
  27. extern void rt_write_lock_nested(rwlock_t *rwlock, int subclass);
  28. extern int rt_write_trylock(rwlock_t *rwlock);
  29. extern void rt_write_unlock(rwlock_t *rwlock);
  30. static __always_inline void read_lock(rwlock_t *rwlock)
  31. {
  32. rt_read_lock(rwlock);
  33. }
  34. static __always_inline void read_lock_bh(rwlock_t *rwlock)
  35. {
  36. local_bh_disable();
  37. rt_read_lock(rwlock);
  38. }
  39. static __always_inline void read_lock_irq(rwlock_t *rwlock)
  40. {
  41. rt_read_lock(rwlock);
  42. }
  43. #define read_lock_irqsave(lock, flags) \
  44. do { \
  45. typecheck(unsigned long, flags); \
  46. rt_read_lock(lock); \
  47. flags = 0; \
  48. } while (0)
  49. #define read_trylock(lock) __cond_lock(lock, rt_read_trylock(lock))
  50. static __always_inline void read_unlock(rwlock_t *rwlock)
  51. {
  52. rt_read_unlock(rwlock);
  53. }
  54. static __always_inline void read_unlock_bh(rwlock_t *rwlock)
  55. {
  56. rt_read_unlock(rwlock);
  57. local_bh_enable();
  58. }
  59. static __always_inline void read_unlock_irq(rwlock_t *rwlock)
  60. {
  61. rt_read_unlock(rwlock);
  62. }
  63. static __always_inline void read_unlock_irqrestore(rwlock_t *rwlock,
  64. unsigned long flags)
  65. {
  66. rt_read_unlock(rwlock);
  67. }
  68. static __always_inline void write_lock(rwlock_t *rwlock)
  69. {
  70. rt_write_lock(rwlock);
  71. }
  72. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  73. static __always_inline void write_lock_nested(rwlock_t *rwlock, int subclass)
  74. {
  75. rt_write_lock_nested(rwlock, subclass);
  76. }
  77. #else
  78. #define write_lock_nested(lock, subclass) rt_write_lock(((void)(subclass), (lock)))
  79. #endif
  80. static __always_inline void write_lock_bh(rwlock_t *rwlock)
  81. {
  82. local_bh_disable();
  83. rt_write_lock(rwlock);
  84. }
  85. static __always_inline void write_lock_irq(rwlock_t *rwlock)
  86. {
  87. rt_write_lock(rwlock);
  88. }
  89. #define write_lock_irqsave(lock, flags) \
  90. do { \
  91. typecheck(unsigned long, flags); \
  92. rt_write_lock(lock); \
  93. flags = 0; \
  94. } while (0)
  95. #define write_trylock(lock) __cond_lock(lock, rt_write_trylock(lock))
  96. #define write_trylock_irqsave(lock, flags) \
  97. ({ \
  98. int __locked; \
  99. \
  100. typecheck(unsigned long, flags); \
  101. flags = 0; \
  102. __locked = write_trylock(lock); \
  103. __locked; \
  104. })
  105. static __always_inline void write_unlock(rwlock_t *rwlock)
  106. {
  107. rt_write_unlock(rwlock);
  108. }
  109. static __always_inline void write_unlock_bh(rwlock_t *rwlock)
  110. {
  111. rt_write_unlock(rwlock);
  112. local_bh_enable();
  113. }
  114. static __always_inline void write_unlock_irq(rwlock_t *rwlock)
  115. {
  116. rt_write_unlock(rwlock);
  117. }
  118. static __always_inline void write_unlock_irqrestore(rwlock_t *rwlock,
  119. unsigned long flags)
  120. {
  121. rt_write_unlock(rwlock);
  122. }
  123. #define rwlock_is_contended(lock) (((void)(lock), 0))
  124. #endif /* __LINUX_RWLOCK_RT_H */