diff options
Diffstat (limited to 'include/linux/mmap_lock.h')
| -rw-r--r-- | include/linux/mmap_lock.h | 37 | 
1 files changed, 25 insertions, 12 deletions
diff --git a/include/linux/mmap_lock.h b/include/linux/mmap_lock.h index 96e113e23d04..aab8f1b28d26 100644 --- a/include/linux/mmap_lock.h +++ b/include/linux/mmap_lock.h @@ -60,6 +60,29 @@ static inline void __mmap_lock_trace_released(struct mm_struct *mm, bool write)  #endif /* CONFIG_TRACING */ +static inline void mmap_assert_locked(struct mm_struct *mm) +{ +	lockdep_assert_held(&mm->mmap_lock); +	VM_BUG_ON_MM(!rwsem_is_locked(&mm->mmap_lock), mm); +} + +static inline void mmap_assert_write_locked(struct mm_struct *mm) +{ +	lockdep_assert_held_write(&mm->mmap_lock); +	VM_BUG_ON_MM(!rwsem_is_locked(&mm->mmap_lock), mm); +} + +#ifdef CONFIG_PER_VMA_LOCK +static inline void vma_end_write_all(struct mm_struct *mm) +{ +	mmap_assert_write_locked(mm); +	/* No races during update due to exclusive mmap_lock being held */ +	WRITE_ONCE(mm->mm_lock_seq, mm->mm_lock_seq + 1); +} +#else +static inline void vma_end_write_all(struct mm_struct *mm) {} +#endif +  static inline void mmap_init_lock(struct mm_struct *mm)  {  	init_rwsem(&mm->mmap_lock); @@ -102,12 +125,14 @@ static inline bool mmap_write_trylock(struct mm_struct *mm)  static inline void mmap_write_unlock(struct mm_struct *mm)  {  	__mmap_lock_trace_released(mm, true); +	vma_end_write_all(mm);  	up_write(&mm->mmap_lock);  }  static inline void mmap_write_downgrade(struct mm_struct *mm)  {  	__mmap_lock_trace_acquire_returned(mm, false, true); +	vma_end_write_all(mm);  	downgrade_write(&mm->mmap_lock);  } @@ -150,18 +175,6 @@ static inline void mmap_read_unlock_non_owner(struct mm_struct *mm)  	up_read_non_owner(&mm->mmap_lock);  } -static inline void mmap_assert_locked(struct mm_struct *mm) -{ -	lockdep_assert_held(&mm->mmap_lock); -	VM_BUG_ON_MM(!rwsem_is_locked(&mm->mmap_lock), mm); -} - -static inline void mmap_assert_write_locked(struct mm_struct *mm) -{ -	lockdep_assert_held_write(&mm->mmap_lock); -	VM_BUG_ON_MM(!rwsem_is_locked(&mm->mmap_lock), mm); -} -  static inline int mmap_lock_is_contended(struct mm_struct *mm)  {  	return rwsem_is_contended(&mm->mmap_lock);  |