On Thu, May 23, 2019 at 12:34:25PM -0300, Jason Gunthorpe wrote: > From: Jason Gunthorpe <jgg@xxxxxxxxxxxx> > > This patch series arised out of discussions with Jerome when looking at the > ODP changes, particularly informed by use after free races we have already > found and fixed in the ODP code (thanks to syzkaller) working with mmu > notifiers, and the discussion with Ralph on how to resolve the lifetime model. So the last big difference with ODP's flow is how 'range->valid' works. In ODP this was done using the rwsem umem->umem_rwsem which is obtained for read in invalidate_start and released in invalidate_end. Then any other threads that wish to only work on a umem which is not undergoing invalidation will obtain the write side of the lock, and within that lock's critical section the virtual address range is known to not be invalidating. I cannot understand how hmm gets to the same approach. It has range->valid, but it is not locked by anything that I can see, so when we test it in places like hmm_range_fault it seems useless.. Jerome, how does this work? I have a feeling we should copy the approach from ODP and use an actual lock here. Jason