nouveau/svm: refactor nouveau_range_fault
authorAlistair Popple <apopple@nvidia.com>
Thu, 1 Jul 2021 01:54:32 +0000 (18:54 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 1 Jul 2021 18:06:03 +0000 (11:06 -0700)
Call mmu_interval_notifier_insert() as part of nouveau_range_fault().
This doesn't introduce any functional change but makes it easier for a
subsequent patch to alter the behaviour of nouveau_range_fault() to
support GPU atomic operations.

Link: https://lkml.kernel.org/r/20210616105937.23201-10-apopple@nvidia.com
Signed-off-by: Alistair Popple <apopple@nvidia.com>
Reviewed-by: Ben Skeggs <bskeggs@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hugh Dickins <hughd@google.com>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Cc: Peter Xu <peterx@redhat.com>
Cc: Ralph Campbell <rcampbell@nvidia.com>
Cc: Shakeel Butt <shakeelb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/gpu/drm/nouveau/nouveau_svm.c

index e963f7d..0a0c925 100644 (file)
@@ -567,18 +567,27 @@ static int nouveau_range_fault(struct nouveau_svmm *svmm,
        unsigned long hmm_pfns[1];
        struct hmm_range range = {
                .notifier = &notifier->notifier,
-               .start = notifier->notifier.interval_tree.start,
-               .end = notifier->notifier.interval_tree.last + 1,
                .default_flags = hmm_flags,
                .hmm_pfns = hmm_pfns,
                .dev_private_owner = drm->dev,
        };
-       struct mm_struct *mm = notifier->notifier.mm;
+       struct mm_struct *mm = svmm->notifier.mm;
        int ret;
 
+       ret = mmu_interval_notifier_insert(&notifier->notifier, mm,
+                                       args->p.addr, args->p.size,
+                                       &nouveau_svm_mni_ops);
+       if (ret)
+               return ret;
+
+       range.start = notifier->notifier.interval_tree.start;
+       range.end = notifier->notifier.interval_tree.last + 1;
+
        while (true) {
-               if (time_after(jiffies, timeout))
-                       return -EBUSY;
+               if (time_after(jiffies, timeout)) {
+                       ret = -EBUSY;
+                       goto out;
+               }
 
                range.notifier_seq = mmu_interval_read_begin(range.notifier);
                mmap_read_lock(mm);
@@ -587,7 +596,7 @@ static int nouveau_range_fault(struct nouveau_svmm *svmm,
                if (ret) {
                        if (ret == -EBUSY)
                                continue;
-                       return ret;
+                       goto out;
                }
 
                mutex_lock(&svmm->mutex);
@@ -606,6 +615,9 @@ static int nouveau_range_fault(struct nouveau_svmm *svmm,
        svmm->vmm->vmm.object.client->super = false;
        mutex_unlock(&svmm->mutex);
 
+out:
+       mmu_interval_notifier_remove(&notifier->notifier);
+
        return ret;
 }
 
@@ -727,14 +739,8 @@ nouveau_svm_fault(struct nvif_notify *notify)
                }
 
                notifier.svmm = svmm;
-               ret = mmu_interval_notifier_insert(&notifier.notifier, mm,
-                                                  args.i.p.addr, args.i.p.size,
-                                                  &nouveau_svm_mni_ops);
-               if (!ret) {
-                       ret = nouveau_range_fault(svmm, svm->drm, &args.i,
-                               sizeof(args), hmm_flags, &notifier);
-                       mmu_interval_notifier_remove(&notifier.notifier);
-               }
+               ret = nouveau_range_fault(svmm, svm->drm, &args.i,
+                                       sizeof(args), hmm_flags, &notifier);
                mmput(mm);
 
                limit = args.i.p.addr + args.i.p.size;