rwbase_rt.h 876 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #ifndef _LINUX_RWBASE_RT_H
  3. #define _LINUX_RWBASE_RT_H
  4. #include <linux/rtmutex.h>
  5. #include <linux/atomic.h>
  6. #define READER_BIAS (1U << 31)
  7. #define WRITER_BIAS (1U << 30)
  8. struct rwbase_rt {
  9. atomic_t readers;
  10. struct rt_mutex_base rtmutex;
  11. };
  12. #define __RWBASE_INITIALIZER(name) \
  13. { \
  14. .readers = ATOMIC_INIT(READER_BIAS), \
  15. .rtmutex = __RT_MUTEX_BASE_INITIALIZER(name.rtmutex), \
  16. }
  17. #define init_rwbase_rt(rwbase) \
  18. do { \
  19. rt_mutex_base_init(&(rwbase)->rtmutex); \
  20. atomic_set(&(rwbase)->readers, READER_BIAS); \
  21. } while (0)
  22. static __always_inline bool rw_base_is_locked(struct rwbase_rt *rwb)
  23. {
  24. return atomic_read(&rwb->readers) != READER_BIAS;
  25. }
  26. static __always_inline bool rw_base_is_contended(struct rwbase_rt *rwb)
  27. {
  28. return atomic_read(&rwb->readers) > 0;
  29. }
  30. #endif /* _LINUX_RWBASE_RT_H */