The notifier sequence must only be read once or otherwise we could work
with invalid pages.

While at it also fix the coding style, e.g. drop the pre-initialized
return value and use the common define for 2G range.

Signed-off-by: Christian König <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c
index 90d26d820bac..eb470e252399 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c
@@ -51,8 +51,6 @@
 #include "amdgpu_amdkfd.h"
 #include "amdgpu_hmm.h"
 
-#define MAX_WALK_BYTE  (2UL << 30)
-
 /**
  * amdgpu_hmm_invalidate_gfx - callback to notify about mm change
  *
@@ -170,11 +168,13 @@ int amdgpu_hmm_range_get_pages(struct 
mmu_interval_notifier *notifier,
                               void *owner,
                               struct amdgpu_hmm_range *range)
 {
-       unsigned long end;
+       const u64 max_bytes = SZ_2G;
+
+       struct hmm_range *hmm_range = &range->hmm_range;
        unsigned long timeout;
        unsigned long *pfns;
-       int r = 0;
-       struct hmm_range *hmm_range = &range->hmm_range;
+       unsigned long end;
+       int r;
 
        pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);
        if (unlikely(!pfns)) {
@@ -191,8 +191,9 @@ int amdgpu_hmm_range_get_pages(struct mmu_interval_notifier 
*notifier,
        end = start + npages * PAGE_SIZE;
        hmm_range->dev_private_owner = owner;
 
+       hmm_range->notifier_seq = mmu_interval_read_begin(notifier);
        do {
-               hmm_range->end = min(hmm_range->start + MAX_WALK_BYTE, end);
+               hmm_range->end = min(hmm_range->start + max_bytes, end);
 
                pr_debug("hmm range: start = 0x%lx, end = 0x%lx",
                        hmm_range->start, hmm_range->end);
@@ -200,7 +201,6 @@ int amdgpu_hmm_range_get_pages(struct mmu_interval_notifier 
*notifier,
                timeout = jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
 
 retry:
-               hmm_range->notifier_seq = mmu_interval_read_begin(notifier);
                r = hmm_range_fault(hmm_range);
                if (unlikely(r)) {
                        if (r == -EBUSY && !time_after(jiffies, timeout))
@@ -210,7 +210,7 @@ int amdgpu_hmm_range_get_pages(struct mmu_interval_notifier 
*notifier,
 
                if (hmm_range->end == end)
                        break;
-               hmm_range->hmm_pfns += MAX_WALK_BYTE >> PAGE_SHIFT;
+               hmm_range->hmm_pfns += max_bytes >> PAGE_SHIFT;
                hmm_range->start = hmm_range->end;
        } while (hmm_range->end < end);
 
-- 
2.43.0

Reply via email to