Jason Gunthorpe
2019-Jul-03 19:00 UTC
[Nouveau] [PATCH 1/5] mm: return valid info from hmm_range_unregister
On Wed, Jul 03, 2019 at 11:44:58AM -0700, Christoph Hellwig wrote:> Checking range->valid is trivial and has no meaningful cost, but > nicely simplifies the fastpath in typical callers.It should not be the typical caller..> hmm_vma_range_done function, which now is a trivial wrapper around > hmm_range_unregister. > > Signed-off-by: Christoph Hellwig <hch at lst.de> > Reviewed-by: Ralph Campbell <rcampbell at nvidia.com> > drivers/gpu/drm/nouveau/nouveau_svm.c | 2 +- > include/linux/hmm.h | 11 +---------- > mm/hmm.c | 7 ++++++- > 3 files changed, 8 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/nouveau_svm.c b/drivers/gpu/drm/nouveau/nouveau_svm.c > index 8c92374afcf2..9d40114d7949 100644 > +++ b/drivers/gpu/drm/nouveau/nouveau_svm.c > @@ -652,7 +652,7 @@ nouveau_svm_fault(struct nvif_notify *notify) > ret = hmm_vma_fault(&svmm->mirror, &range, true); > if (ret == 0) { > mutex_lock(&svmm->mutex); > - if (!hmm_vma_range_done(&range)) { > + if (!hmm_range_unregister(&range)) { > mutex_unlock(&svmm->mutex); > goto again; > }In this case if we take the 'goto again' then we are pointlessly removing and re-adding the range. The pattern is supposed to be: hmm_range_register() again: .. read page tables .. lock if (!hmm_range_valid()) unlock goto again .. setup device .. unlock hmm_range_unregister() I don't think the API should be encouraging some shortcut here.. We can't do the above pattern because the old hmm_vma API didn't allow it, which is presumably a reason why it is obsolete. I'd rather see drivers move to a consistent pattern so we can then easily hoist the seqcount lock scheme into some common mmu notifier code, as discussed. Jason
Christoph Hellwig
2019-Jul-03 20:28 UTC
[Nouveau] [PATCH 1/5] mm: return valid info from hmm_range_unregister
On Wed, Jul 03, 2019 at 07:00:50PM +0000, Jason Gunthorpe wrote:> I don't think the API should be encouraging some shortcut here.. > > We can't do the above pattern because the old hmm_vma API didn't allow > it, which is presumably a reason why it is obsolete. > > I'd rather see drivers move to a consistent pattern so we can then > easily hoist the seqcount lock scheme into some common mmu notifier > code, as discussed.So you don't like the version in amdgpu_ttm_tt_get_user_pages_done in linux-next either? I can remove this and just move hmm_vma_range_done to nouveau instead. Let me know if you have other comments before I resend. Note that I'll probably be offline Thu-Sun this week.
Jason Gunthorpe
2019-Jul-03 20:40 UTC
[Nouveau] [PATCH 1/5] mm: return valid info from hmm_range_unregister
On Wed, Jul 03, 2019 at 10:28:57PM +0200, Christoph Hellwig wrote:> On Wed, Jul 03, 2019 at 07:00:50PM +0000, Jason Gunthorpe wrote: > > I don't think the API should be encouraging some shortcut here.. > > > > We can't do the above pattern because the old hmm_vma API didn't allow > > it, which is presumably a reason why it is obsolete. > > > > I'd rather see drivers move to a consistent pattern so we can then > > easily hoist the seqcount lock scheme into some common mmu notifier > > code, as discussed. > > So you don't like the version in amdgpu_ttm_tt_get_user_pages_done in > linux-next either?I looked at this for 5 mins, and I can't see the key elements of the collision retry lock: - Where is the retry loop? - Where is the lock around the final test to valid prior to using the output of range? For instance looking at amdgpu_gem_userptr_ioctl().. We can't be holding a lock when we do hmm_range_wait_until_valid() (inside amdgpu_ttm_tt_get_user_pages), otherwise it deadlocks, and there are not other locks that would encompass the final is_valid check. And amdgpu_gem_userptr_ioctl() looks like a syscall entry point, so having it fail just because the lock collided (ie is_valid == false) can't possibly be the right thing. I'm also unclear when the device data is updated in that sequence.. So.. I think this locking is wrong. Maybe AMD team can explain how it should work? Jason
Possibly Parallel Threads
- [PATCH 1/5] mm: return valid info from hmm_range_unregister
- [PATCH 18/22] mm: return valid info from hmm_range_unregister
- [PATCH 1/5] mm: return valid info from hmm_range_unregister
- [PATCH 2/6] mm: move hmm_vma_range_done and hmm_vma_fault to nouveau
- [PATCH 2/6] mm: move hmm_vma_range_done and hmm_vma_fault to nouveau