mmap_lock.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #ifndef _LINUX_MMAP_LOCK_H
  2. #define _LINUX_MMAP_LOCK_H
  3. #include <linux/mmdebug.h>
  4. #define MMAP_LOCK_INITIALIZER(name) \
  5. .mmap_lock = __RWSEM_INITIALIZER((name).mmap_lock),
  6. static inline void mmap_init_lock(struct mm_struct *mm)
  7. {
  8. init_rwsem(&mm->mmap_lock);
  9. }
  10. static inline void mmap_write_lock(struct mm_struct *mm)
  11. {
  12. down_write(&mm->mmap_lock);
  13. }
  14. static inline void mmap_write_lock_nested(struct mm_struct *mm, int subclass)
  15. {
  16. down_write_nested(&mm->mmap_lock, subclass);
  17. }
  18. static inline int mmap_write_lock_killable(struct mm_struct *mm)
  19. {
  20. return down_write_killable(&mm->mmap_lock);
  21. }
  22. static inline bool mmap_write_trylock(struct mm_struct *mm)
  23. {
  24. return down_write_trylock(&mm->mmap_lock) != 0;
  25. }
  26. static inline void mmap_write_unlock(struct mm_struct *mm)
  27. {
  28. up_write(&mm->mmap_lock);
  29. }
  30. static inline void mmap_write_downgrade(struct mm_struct *mm)
  31. {
  32. downgrade_write(&mm->mmap_lock);
  33. }
  34. static inline void mmap_read_lock(struct mm_struct *mm)
  35. {
  36. down_read(&mm->mmap_lock);
  37. }
  38. static inline int mmap_read_lock_killable(struct mm_struct *mm)
  39. {
  40. return down_read_killable(&mm->mmap_lock);
  41. }
  42. static inline bool mmap_read_trylock(struct mm_struct *mm)
  43. {
  44. return down_read_trylock(&mm->mmap_lock) != 0;
  45. }
  46. static inline void mmap_read_unlock(struct mm_struct *mm)
  47. {
  48. up_read(&mm->mmap_lock);
  49. }
  50. static inline bool mmap_read_trylock_non_owner(struct mm_struct *mm)
  51. {
  52. if (down_read_trylock(&mm->mmap_lock)) {
  53. rwsem_release(&mm->mmap_lock.dep_map, _RET_IP_);
  54. return true;
  55. }
  56. return false;
  57. }
  58. static inline void mmap_read_unlock_non_owner(struct mm_struct *mm)
  59. {
  60. up_read_non_owner(&mm->mmap_lock);
  61. }
  62. static inline void mmap_assert_locked(struct mm_struct *mm)
  63. {
  64. lockdep_assert_held(&mm->mmap_lock);
  65. VM_BUG_ON_MM(!rwsem_is_locked(&mm->mmap_lock), mm);
  66. }
  67. static inline void mmap_assert_write_locked(struct mm_struct *mm)
  68. {
  69. lockdep_assert_held_write(&mm->mmap_lock);
  70. VM_BUG_ON_MM(!rwsem_is_locked(&mm->mmap_lock), mm);
  71. }
  72. static inline int mmap_lock_is_contended(struct mm_struct *mm)
  73. {
  74. return rwsem_is_contended(&mm->mmap_lock);
  75. }
  76. #endif /* _LINUX_MMAP_LOCK_H */