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.

Signed-off-by: Alistair Popple <apop...@nvidia.com>
Reviewed-by: Ben Skeggs <bske...@redhat.com>

---

v9:

* Added Ben's Reviewed-By (thanks!)
---
 drivers/gpu/drm/nouveau/nouveau_svm.c | 34 ++++++++++++++++-----------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_svm.c 
b/drivers/gpu/drm/nouveau/nouveau_svm.c
index 94f841026c3b..a195e48c9aee 100644
--- a/drivers/gpu/drm/nouveau/nouveau_svm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_svm.c
@@ -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;
-- 
2.20.1

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to