On Wed, 8 Jan 2025 18:30:20 -0800 Suren Baghdasaryan <surenb@xxxxxxxxxx> > + > +static inline void vma_refcount_put(struct vm_area_struct *vma) > +{ > + int oldcnt; > + > + if (!__refcount_dec_and_test(&vma->vm_refcnt, &oldcnt)) { > + rwsem_release(&vma->vmlock_dep_map, _RET_IP_); In up_read() rwsem is released reguardless wakeup, which is different than what is added here. Nit. > + > + if (is_vma_writer_only(oldcnt - 1)) > + rcuwait_wake_up(&vma->vm_mm->vma_writer_wait); > + } > +} ... > @@ -735,9 +773,10 @@ static inline bool vma_start_read(struct vm_area_struct *vma) > * This pairs with RELEASE semantics in vma_end_write_all(). > */ > if (unlikely(vma->vm_lock_seq == raw_read_seqcount(&vma->vm_mm->mm_lock_seq))) { > - up_read(&vma->vm_lock.lock); > + vma_refcount_put(vma); > return false; > } void up_read(struct rw_semaphore *sem) { rwsem_release(&sem->dep_map, _RET_IP_); __up_read(sem); }