lkml.org 
[lkml]   [2021]   [Apr]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 7/8] nouveau/svm: Refactor nouveau_range_fault
    Date
    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 <apopple@nvidia.com>
    ---
    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
    \
     
     \ /
      Last update: 2021-04-07 11:01    [W:4.089 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site