On Wed, Jan 15, 2025 at 4:05 AM Wei Yang <richard.weiyang@xxxxxxxxx> wrote: > > On Tue, Jan 14, 2025 at 07:12:20PM -0800, Suren Baghdasaryan wrote: > >On Tue, Jan 14, 2025 at 6:58 PM Wei Yang <richard.weiyang@xxxxxxxxx> wrote: > >> > >> On Fri, Jan 10, 2025 at 08:25:58PM -0800, Suren Baghdasaryan wrote: > >> >@@ -6354,7 +6422,6 @@ struct vm_area_struct *lock_vma_under_rcu(struct mm_struct *mm, > >> > struct vm_area_struct *vma; > >> > > >> > rcu_read_lock(); > >> >-retry: > >> > vma = mas_walk(&mas); > >> > if (!vma) > >> > goto inval; > >> >@@ -6362,13 +6429,6 @@ struct vm_area_struct *lock_vma_under_rcu(struct mm_struct *mm, > >> > if (!vma_start_read(vma)) > >> > goto inval; > >> > > >> >- /* Check if the VMA got isolated after we found it */ > >> >- if (is_vma_detached(vma)) { > >> >- vma_end_read(vma); > >> >- count_vm_vma_lock_event(VMA_LOCK_MISS); > >> >- /* The area was replaced with another one */ > >> >- goto retry; > >> >- } > >> > >> We have a little behavior change here. > >> > >> Originally, if we found an detached vma, we may retry. But now, we would go to > >> the slow path directly. > > > >Hmm. Good point. I think the easiest way to keep the same > >functionality is to make vma_start_read() return vm_area_struct* on > >success, NULL on locking failure and EAGAIN if vma was detached > >(vm_refcnt==0). Then the same retry with VMA_LOCK_MISS can be done in > >the case of EAGAIN. > > > > Looks good to me. > > >> > >> Maybe we can compare the event VMA_LOCK_MISS and VMA_LOCK_ABORT > >> to see the percentage of this case. If it shows this is a too rare > >> case to impact performance, we can ignore it. > >> > >> Also the event VMA_LOCK_MISS recording is removed, but the definition is > >> there. We may record it in the vma_start_read() when oldcnt is 0. > >> > >> BTW, the name of VMA_LOCK_SUCCESS confuse me a little. I thought it indicates > >> lock_vma_under_rcu() successfully get a valid vma. But seems not. Sounds we > >> don't have an overall success/failure statistic in vmstat. > > > >Are you referring to the fact that we do not increment > >VMA_LOCK_SUCCESS if we successfully locked a vma but have to retry the > > Something like this. I thought we would increase VMA_LOCK_SUCCESS on success. > > >page fault (in which we increment VMA_LOCK_RETRY instead)? > > > > I don't follow this. Sorry, I meant to say "in which case we increment VMA_LOCK_RETRY instead". IOW, when we successfully lock the vma but have to retry the pagefault, we increment VMA_LOCK_RETRY without incrementing VMA_LOCK_SUCCESS. > > >> > >> > /* > >> > * At this point, we have a stable reference to a VMA: The VMA is > >> > * locked and we know it hasn't already been isolated. > >> > >> -- > >> Wei Yang > >> Help you, Help me > > -- > Wei Yang > Help you, Help me