From cbc1ec206d57291a775ba447e734ec2f9df9cfff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Tue, 3 Mar 2026 13:06:30 -0800 Subject: [PATCH] intel: Add support for madvise purgeable VMAs in Xe KMD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Initially this uAPI was part of the first public version of Xe KMD uAPI but as it did not had any users it was removed in some of fixes releases of the Linux version that added Xe KMD but I missed to update the comment in Mesa. At that time this uAPI had a restriction that did not allowed us to use, it was compatible with VMs created with DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE but now this flag is supported so here implementing it. Link: https://patchwork.freedesktop.org/series/156651/ Reviewed-by: Paulo Zanoni Signed-off-by: José Roberto de Souza Part-of: --- .../drivers/iris/xe/iris_kmd_backend.c | 32 +++++++++++++++---- src/intel/dev/i915/intel_device_info.c | 1 + src/intel/dev/intel_device_info.py | 1 + src/intel/dev/xe/intel_device_info.c | 2 ++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/iris/xe/iris_kmd_backend.c b/src/gallium/drivers/iris/xe/iris_kmd_backend.c index 3aeb148bbb6..d84e68ac3c9 100644 --- a/src/gallium/drivers/iris/xe/iris_kmd_backend.c +++ b/src/gallium/drivers/iris/xe/iris_kmd_backend.c @@ -31,6 +31,7 @@ #include "iris/iris_bufmgr.h" #include "iris/iris_batch.h" #include "iris/iris_context.h" +#include "util/u_debug.h" #include "drm-uapi/xe_drm.h" @@ -202,12 +203,31 @@ xe_gem_vm_unbind(struct iris_bo *bo) static bool xe_bo_madvise(struct iris_bo *bo, enum iris_madvice state) { - /* Only applicable if VM was created with DRM_XE_VM_CREATE_FAULT_MODE but - * that is not compatible with DRM_XE_VM_CREATE_SCRATCH_PAGE - * - * So returning as retained. - */ - return true; + struct iris_bufmgr *bufmgr = bo->bufmgr; + const struct intel_device_info *devinfo = iris_bufmgr_get_device_info(bufmgr); + struct drm_xe_madvise madvise = {}; + uint32_t retained_val = 0; + + /* If not supported bo are always retained */ + if (!devinfo->has_madvise_purgeable) + return true; + + madvise.start = bo->address; + madvise.range = bo->size; + madvise.vm_id = iris_bufmgr_get_global_vm_id(bufmgr); + madvise.type = DRM_XE_VMA_ATTR_PURGEABLE_STATE; + /* Same values between iris_madvice and Xe KMD */ + STATIC_ASSERT(IRIS_MADVICE_WILL_NEED == DRM_XE_VMA_PURGEABLE_STATE_WILLNEED); + STATIC_ASSERT(IRIS_MADVICE_DONT_NEED == DRM_XE_VMA_PURGEABLE_STATE_DONTNEED); + madvise.purge_state_val.val = state; + madvise.purge_state_val.retained_ptr = (uintptr_t)&retained_val; + + if (intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_XE_MADVISE, &madvise)) { + debug_warn_once("DRM_XE_VMA_ATTR_PURGEABLE_STATE failed at least once\n"); + return false; + } + + return retained_val; } static int diff --git a/src/intel/dev/i915/intel_device_info.c b/src/intel/dev/i915/intel_device_info.c index a61a7aa71e3..3bc38b467bd 100644 --- a/src/intel/dev/i915/intel_device_info.c +++ b/src/intel/dev/i915/intel_device_info.c @@ -615,6 +615,7 @@ bool intel_device_info_i915_get_info_from_fd(int fd, struct intel_device_info *d get_context_param(fd, 0, I915_CONTEXT_PARAM_GTT_SIZE, &devinfo->gtt_size); devinfo->has_tiling_uapi = has_get_tiling(fd); devinfo->has_userptr_uapi = has_userptr(fd); + devinfo->has_madvise_purgeable = true; devinfo->has_caching_uapi = devinfo->platform < INTEL_PLATFORM_DG2_START && !devinfo->has_local_mem; if (devinfo->ver > 12 || intel_device_info_is_mtl_or_arl(devinfo)) diff --git a/src/intel/dev/intel_device_info.py b/src/intel/dev/intel_device_info.py index e11d21b7ab0..fdb3623d62c 100644 --- a/src/intel/dev/intel_device_info.py +++ b/src/intel/dev/intel_device_info.py @@ -310,6 +310,7 @@ Struct("intel_device_info", Member("bool", "supports_low_latency_hint"), Member("bool", "xe2_has_no_compression_hint"), Member("bool", "xe_has_state_cache_perf_fix"), + Member("bool", "has_madvise_purgeable"), Member("bool", "has_userptr_uapi"), Member("bool", "has_coarse_pixel_primitive_and_cb", compiler_field=True, diff --git a/src/intel/dev/xe/intel_device_info.c b/src/intel/dev/xe/intel_device_info.c index b026b361cbc..f3359ef021c 100644 --- a/src/intel/dev/xe/intel_device_info.c +++ b/src/intel/dev/xe/intel_device_info.c @@ -79,6 +79,8 @@ xe_query_config(int fd, struct intel_device_info *devinfo) devinfo->xe2_has_no_compression_hint = true; if (config->info[DRM_XE_QUERY_CONFIG_FLAGS] & DRM_XE_QUERY_CONFIG_FLAG_HAS_DISABLE_STATE_CACHE_PERF_FIX) devinfo->xe_has_state_cache_perf_fix = true; + if (config->info[DRM_XE_QUERY_CONFIG_FLAGS] & DRM_XE_QUERY_CONFIG_FLAG_HAS_PURGING_SUPPORT) + devinfo->has_madvise_purgeable = true; if (!has_gmd_ip_version(devinfo)) devinfo->revision = (config->info[DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID] >> 16) & 0xFFFF;