]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/xe/userptr: Fix an incorrect assert
authorThomas Hellström <thomas.hellstrom@linux.intel.com>
Fri, 7 Mar 2025 10:01:09 +0000 (11:01 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 Mar 2025 19:54:26 +0000 (12:54 -0700)
[ Upstream commit 9106713bd2ab0cacd380cda0d3f0219f2e488086 ]

The assert incorrectly checks the total length processed which
can in fact be greater than the number of pages. Fix.

Fixes: 0a98219bcc96 ("drm/xe/hmm: Don't dereference struct page pointers without notifier lock")
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250307100109.21397-1-thomas.hellstrom@linux.intel.com
(cherry picked from commit 70e5043ba85eae199b232e39921abd706b5c1fa4)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/xe/xe_hmm.c

index d7a9408b3a97c85311dee1aaf6378952966d5189..f6bc4f29d7538ef439c118caf5014c57b53cda92 100644 (file)
@@ -138,13 +138,17 @@ static int xe_build_sg(struct xe_device *xe, struct hmm_range *range,
                i += size;
 
                if (unlikely(j == st->nents - 1)) {
+                       xe_assert(xe, i >= npages);
                        if (i > npages)
                                size -= (i - npages);
+
                        sg_mark_end(sgl);
+               } else {
+                       xe_assert(xe, i < npages);
                }
+
                sg_set_page(sgl, page, size << PAGE_SHIFT, 0);
        }
-       xe_assert(xe, i == npages);
 
        return dma_map_sgtable(dev, st, write ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE,
                               DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_NO_KERNEL_MAPPING);