]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/madvise: Skip invalidation for purgeable state updates
authorArvind Yadav <arvind.yadav@intel.com>
Tue, 26 May 2026 13:54:47 +0000 (19:24 +0530)
committerThomas Hellström <thomas.hellstrom@linux.intel.com>
Mon, 20 Jul 2026 16:18:41 +0000 (18:18 +0200)
Purgeable state updates only change VMA/BO metadata. They do not zap
PTEs when switching between DONTNEED and WILLNEED. PTEs are zapped
later if the BO is actually purged.

xe_vm_invalidate_madvise_range() waits on the VM dma-resv before checking
vma->skip_invalidation. Since purgeable madvise marks all affected VMAs to
skip invalidation, this wait is unnecessary and can stall on unrelated
in-flight work.

Skip the invalidate path entirely for purgeable state updates.

v2:
  - Replace inline 'args->type != DRM_XE_VMA_ATTR_PURGEABLE_STATE'
    check with a small helper madvise_range_needs_invalidation().
    (Himal)

Suggested-by: Matthew Brost <matthew.brost@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Link: https://patch.msgid.link/20260526135447.2973029-1-arvind.yadav@intel.com
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
Fixes: ada7486c5668 ("drm/xe: Implement madvise ioctl for xe")
Cc: <stable@vger.kernel.org> # v6.18+
(cherry picked from commit 134377098b9c14abd31c3bcac00c9653f0f0c4c3)
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
drivers/gpu/drm/xe/xe_vm_madvise.c

index 246fe18431428bfa3307bd7be914aa5dc441695a..0474768a38aaa7d7f7cd316f122bcb373b7e2b36 100644 (file)
@@ -332,6 +332,20 @@ static int xe_vm_invalidate_madvise_range(struct xe_vm *vm, u64 start, u64 end)
        return err;
 }
 
+/**
+ * madvise_range_needs_invalidation() - Check whether madvise needs invalidation
+ * @args: madvise ioctl arguments
+ *
+ * Purgeable state updates only touch VMA/BO metadata. PTEs stay valid and are
+ * zapped only if the BO is later purged.
+ *
+ * Return: true when the update needs PTE invalidation.
+ */
+static bool madvise_range_needs_invalidation(const struct drm_xe_madvise *args)
+{
+       return args->type != DRM_XE_VMA_ATTR_PURGEABLE_STATE;
+}
+
 static bool madvise_args_are_sane(struct xe_device *xe, const struct drm_xe_madvise *args)
 {
        if (XE_IOCTL_DBG(xe, !args))
@@ -708,8 +722,9 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
        madvise_funcs[attr_type](xe, vm, madvise_range.vmas, madvise_range.num_vmas, args,
                                 &details);
 
-       err = xe_vm_invalidate_madvise_range(vm, madvise_range.addr,
-                                            madvise_range.addr + args->range);
+       if (madvise_range_needs_invalidation(args))
+               err = xe_vm_invalidate_madvise_range(vm, madvise_range.addr,
+                                                    madvise_range.addr + args->range);
 
        if (madvise_range.has_svm_userptr_vmas)
                xe_svm_notifier_unlock(vm);