nouveau_range_fault() now uses hmm_range_fault_unlocked_timeout() for
the HMM fault path. The timeout passed to that helper is meant to bound
HMM's internal mmu-notifier retry loop, not the whole nouveau retry loop
around mmu_interval_read_retry().

Pass the full relative HMM_RANGE_DEFAULT_TIMEOUT value to
hmm_range_fault_unlocked_timeout() on each attempt, and retry from the
nouveau-side mmu_interval_read_retry() check with a fresh HMM retry
budget. This lets HMM continue when it has made progress, while still
preserving a timeout for repeated notifier invalidation retries inside
one HMM fault attempt.

This also removes the open-coded absolute deadline and remaining-time
calculation from nouveau_range_fault().

Signed-off-by: Stanislav Kinsburskii <[email protected]>
---
 drivers/accel/amdxdna/aie2_ctx.c |   12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/accel/amdxdna/aie2_ctx.c b/drivers/accel/amdxdna/aie2_ctx.c
index 548ba4315554..21f2817751f9 100644
--- a/drivers/accel/amdxdna/aie2_ctx.c
+++ b/drivers/accel/amdxdna/aie2_ctx.c
@@ -1037,7 +1037,7 @@ static int aie2_populate_range(struct amdxdna_gem_obj 
*abo)
        bool found;
        int ret;
 
-       timeout = jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
+       timeout = msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
 again:
        found = false;
        down_write(&xdna->notifier_lock);
@@ -1062,13 +1062,9 @@ static int aie2_populate_range(struct amdxdna_gem_obj 
*abo)
                return -EFAULT;
        }
 
-       ret = hmm_range_fault_unlocked_timeout(&mapp->range,
-                       max_t(long, timeout - jiffies, 1));
-       if (ret) {
-               if (ret == -EBUSY)
-                       ret = -ETIME;
+       ret = hmm_range_fault_unlocked_timeout(&mapp->range, timeout);
+       if (ret)
                goto put_mm;
-       }
 
        down_write(&xdna->notifier_lock);
        if (mmu_interval_read_retry(&mapp->notifier, mapp->range.notifier_seq)) 
{
@@ -1086,7 +1082,7 @@ static int aie2_populate_range(struct amdxdna_gem_obj 
*abo)
 put_mm:
        amdxdna_umap_put(mapp);
        mmput(mm);
-       return ret;
+       return ret == -EBUSY ? -ETIME : ret;
 }
 
 int aie2_cmd_submit(struct amdxdna_hwctx *hwctx, struct amdxdna_sched_job 
*job, u64 *seq)


Reply via email to