Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects
@ 2025-10-28 12:24 Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 1/9] drm/xe/uapi: Add UAPI " Arvind Yadav
                   ` (13 more replies)
  0 siblings, 14 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

This patch series introduces support for purgeable buffer objects (BOs) in the Xe driver. 
This feature allows userspace applications to provide memory usage hints to the kernel,
enabling more effective memory management, especially under system memory pressure.

When an application no longer needs the contents of a buffer, it can mark it as DONTNEED
via the DRM_XE_MADVISE ioctl. This makes the BO a candidate for purging. If the kernel
experiences memory pressure, it can reclaim the backing store of these BOs,
freeing up GPU memory and helping to prevent Out-Of-Memory (OOM) situations.

The lifecycle of a purgeable BO is as follows:

A BO starts in the default WILLNEED state.
Userspace marks it as DONTNEED when its contents are discardable.
Under memory pressure, the kernel may purge the BO, transitioning it to the PURGED state.
Any attempt to use a purged BO (e.g., binding, mapping, or CPU access) will result in an error,
signaling to the application that the contents are gone. The application can then re-validate
the BO by marking it WILLNEED, at which point new backing store is allocated. To prevent data corruption,
a critical safety check ensures that only non-shared buffers can be marked as purgeable. 

Arvind Yadav (7):
  drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo
  drm/xe/madvise: Implement purgeable buffer object support
  drm/xe/bo: Prevent purging of shared buffer objects
  drm/xe/bo: Handle CPU faults on purged buffer objects
  drm/xe/bo: Prevent mmap of purged buffer objects
  drm/xe/vm: Prevent binding of purged buffer objects
  drm/xe: Add support for querying purgeable BO states

Himal Prasad Ghimiray (2):
  drm/xe/uapi: Add UAPI support for purgeable buffer objects
  drm/xe/uapi: Add UAPI for purgeable bo state to madvise query response

 drivers/gpu/drm/xe/xe_bo.c         | 91 ++++++++++++++++++++++++++----
 drivers/gpu/drm/xe/xe_bo.h         | 51 +++++++++++++++++
 drivers/gpu/drm/xe/xe_bo_types.h   |  3 +
 drivers/gpu/drm/xe/xe_vm.c         | 11 ++++
 drivers/gpu/drm/xe/xe_vm_madvise.c | 67 ++++++++++++++++++++++
 include/uapi/drm/xe_drm.h          | 34 +++++++++++
 6 files changed, 245 insertions(+), 12 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [RFC PATCH 1/9] drm/xe/uapi: Add UAPI support for purgeable buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 2/9] drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo Arvind Yadav
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

From: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>

Extend the DRM_XE_MADVISE ioctl to support purgeable buffer object
management by adding DRM_XE_VMA_ATTR_PURGEABLE_STATE attribute type.

This allows userspace applications to provide memory usage hints to
the kernel for better memory management under pressure:

- WILLNEED: BO will be needed again, re-validate if purged.
- DONTNEED: Buffer not currently needed, may be purged if needed.

Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
 include/uapi/drm/xe_drm.h | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index 47853659a705..e5345101a92a 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -2051,6 +2051,7 @@ struct drm_xe_madvise {
 #define DRM_XE_MEM_RANGE_ATTR_PREFERRED_LOC	0
 #define DRM_XE_MEM_RANGE_ATTR_ATOMIC		1
 #define DRM_XE_MEM_RANGE_ATTR_PAT		2
+#define DRM_XE_VMA_ATTR_PURGEABLE_STATE		3
 	/** @type: type of attribute */
 	__u32 type;
 
@@ -2129,6 +2130,30 @@ struct drm_xe_madvise {
 			/** @pat_index.reserved: Reserved */
 			__u64 reserved;
 		} pat_index;
+
+		/**
+		 * @purge_state_val: Purgeable state configuration
+		 *
+		 * Used when @type == DRM_XE_VMA_ATTR_PURGEABLE_STATE.
+		 *
+		 * Configures the purgeable state of buffer objects in the specified
+		 * virtual address range. This allows applications to hint to the kernel
+		 * about bo's usage patterns for better memory management.
+		 *
+		 * Supported values for @purge_state_val.val:
+		 *  - DRM_XE_VMA_PURGEABLE_STATE_WILLNEED: BO is needed,
+		 *    should not be purged by the kernel.
+		 *  - DRM_XE_VMA_PURGEABLE_STATE_DONTNEED: BO is not currently needed,
+		 *    kernel may purge it to free memory if under pressure.
+		 */
+		struct {
+#define DRM_XE_VMA_PURGEABLE_STATE_WILLNEED	0
+#define DRM_XE_VMA_PURGEABLE_STATE_DONTNEED	1
+			/** @purge_state_val.val: value for DRM_XE_VMA_ATTR_PURGEABLE_STATE */
+			__u32 val;
+			/** @purge_state_val.reserved: Reserved */
+			__u32 reserved;
+		} purge_state_val;
 	};
 
 	/** @reserved: Reserved */
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [RFC PATCH 2/9] drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 1/9] drm/xe/uapi: Add UAPI " Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support Arvind Yadav
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

Add infrastructure for tracking purgeable state of buffer objects.
This includes:

- New enum xe_madv_state defining three states:
  * XE_MADV_PURGEABLE_WILLNEED:  BO is actively needed, should not be purged
  * XE_MADV_PURGEABLE_DONTNEED: BO can be purged if memory pressure exists
  * XE_MADV_PURGEABLE_PURGED: BO has been purged by the kernel

- Add atomic_t madv field to struct xe_bo for state tracking
  of purgeable state across concurrent access paths

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>
---
 drivers/gpu/drm/xe/xe_bo.h       | 22 ++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_bo_types.h |  3 +++
 2 files changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index 911d5b90461a..d85c691d06e0 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -85,6 +85,28 @@
 
 #define XE_PCI_BARRIER_MMAP_OFFSET	(0x50 << XE_PTE_SHIFT)
 
+/**
+ * enum xe_madv_purgeable_state - Buffer object purgeable state enumeration
+ *
+ * This enum defines the possible purgeable states for a buffer object,
+ * allowing userspace to provide memory usage hints to the kernel for
+ * better memory management under pressure.
+ *
+ * @XE_MADV_PURGEABLE_WILLNEED: The buffer object are needed and should not be purged.
+ * This is the default state.
+ * @XE_MADV_PURGEABLE_DONTNEED: The buffer object are not currently needed and can be
+ * purged by the kernel under memory pressure.
+ * @XE_MADV_PURGEABLE_PURGED: The buffer object have been purged by the kernel.
+ *
+ * Accessing a purged buffer will result in an error. The user must call
+ * madvise(WILLNEED) to re-validate the buffer before using it again.
+ */
+enum xe_madv_purgeable_state {
+	XE_MADV_PURGEABLE_WILLNEED,
+	XE_MADV_PURGEABLE_DONTNEED,
+	XE_MADV_PURGEABLE_PURGED,
+};
+
 struct sg_table;
 
 struct xe_bo *xe_bo_alloc(void);
diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h
index d4fe3c8dca5b..57b4dc7012e2 100644
--- a/drivers/gpu/drm/xe/xe_bo_types.h
+++ b/drivers/gpu/drm/xe/xe_bo_types.h
@@ -108,6 +108,9 @@ struct xe_bo {
 	 * from default
 	 */
 	u64 min_align;
+
+	/** @madv_purgeable: user space advise on BO purgeability */
+	atomic_t madv_purgeable;
 };
 
 #endif
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 1/9] drm/xe/uapi: Add UAPI " Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 2/9] drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-29  8:55   ` Thomas Hellström
  2025-10-28 12:24 ` [RFC PATCH 4/9] drm/xe/bo: Prevent purging of shared buffer objects Arvind Yadav
                   ` (10 subsequent siblings)
  13 siblings, 1 reply; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

This allows userspace applications to provide memory usage hints to
the kernel for better memory management under pressure:

- WILLNEED: BO will be needed again, re-validate if purged
- DONTNEED: BO not currently needed, may be purged if needed

When userspace marks BO as DONTNEED, the kernel can reclaim
their memory during memory pressure. BO transition to PURGED
state when reclaimed, and attempting to access purged buffers
triggers appropriate fault handling.

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>
---
 drivers/gpu/drm/xe/xe_bo.c         | 75 +++++++++++++++++++++++++-----
 drivers/gpu/drm/xe/xe_vm_madvise.c | 67 ++++++++++++++++++++++++++
 2 files changed, 130 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index cbc3ee157218..3b3eb83658cc 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -836,6 +836,60 @@ static int xe_bo_move_notify(struct xe_bo *bo,
 	return 0;
 }
 
+static int xe_bo_invalidate_tlb_before_purge(struct xe_bo *bo)
+{
+	struct drm_gpuvm_bo *vm_bo;
+	struct drm_gpuva *gpuva;
+	struct drm_gem_object *obj = &bo->ttm.base;
+	int ret;
+
+	/* BO must be locked before invalidating */
+	dma_resv_assert_held(bo->ttm.base.resv);
+
+	drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
+		drm_gpuvm_bo_for_each_va(gpuva, vm_bo) {
+			struct xe_vma *vma = gpuva_to_vma(gpuva);
+
+			ret = xe_vm_invalidate_vma(vma);
+			if (ret)
+				return ret;
+		}
+	}
+
+	return 0;
+}
+
+static void xe_bo_set_purged(struct xe_bo *bo)
+{
+	/* BO must be locked before modifying madv state */
+	dma_resv_assert_held(bo->ttm.base.resv);
+
+	atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_PURGED);
+}
+
+static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx)
+{
+	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
+	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
+
+	if (ttm_bo->ttm) {
+		struct ttm_placement place = {};
+		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
+		int ret_inval;
+
+		drm_WARN_ON(&xe->drm, ret);
+		if (!ret && bo) {
+			if (atomic_read(&bo->madv_purgeable) == XE_MADV_PURGEABLE_DONTNEED) {
+				/* Invalidate TLB before marking BO as purged */
+				ret_inval = xe_bo_invalidate_tlb_before_purge(bo);
+				if (!ret_inval)
+					xe_bo_set_purged(bo);
+
+			}
+		}
+	}
+}
+
 static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
 		      struct ttm_operation_ctx *ctx,
 		      struct ttm_resource *new_mem,
@@ -853,8 +907,14 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
 	bool needs_clear;
 	bool handle_system_ccs = (!IS_DGFX(xe) && xe_bo_needs_ccs_pages(bo) &&
 				  ttm && ttm_tt_is_populated(ttm)) ? true : false;
+	int state = atomic_read(&bo->madv_purgeable);
 	int ret = 0;
 
+	if (evict && state == XE_MADV_PURGEABLE_DONTNEED) {
+		xe_ttm_bo_purge(ttm_bo, ctx);
+			return 0;
+	}
+
 	/* Bo creation path, moving to system or TT. */
 	if ((!old_mem && ttm) && !handle_system_ccs) {
 		if (new_mem->mem_type == XE_PL_TT)
@@ -1606,18 +1666,6 @@ static void xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object *ttm_bo)
 	}
 }
 
-static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx)
-{
-	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
-
-	if (ttm_bo->ttm) {
-		struct ttm_placement place = {};
-		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
-
-		drm_WARN_ON(&xe->drm, ret);
-	}
-}
-
 static void xe_ttm_bo_swap_notify(struct ttm_buffer_object *ttm_bo)
 {
 	struct ttm_operation_ctx ctx = {
@@ -2472,6 +2520,9 @@ struct xe_bo *xe_bo_create_user(struct xe_device *xe,
 				       ttm_bo_type_device, flags, 0, true);
 	}
 
+	/* Initialize purge advisory state */
+	atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_WILLNEED);
+
 	return bo;
 }
 
diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
index cad3cf627c3f..1f0356ea4403 100644
--- a/drivers/gpu/drm/xe/xe_vm_madvise.c
+++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
@@ -158,6 +158,54 @@ static void madvise_pat_index(struct xe_device *xe, struct xe_vm *vm,
 	}
 }
 
+/*
+ * Handle purgeable buffer object advice for DONTNEED/WILLNEED/PURGED.
+ * Returns 0 on success, negative errno on error.
+ */
+static void xe_vm_madvise_purgeable_bo(struct xe_device *xe, struct xe_vm *vm,
+				       struct xe_vma **vmas, int num_vmas,
+				       struct drm_xe_madvise *op, struct drm_exec *exec)
+{
+
+	xe_assert(vm->xe, op->type == DRM_XE_VMA_ATTR_PURGEABLE_STATE);
+
+	for (int i = 0; i < num_vmas; i++) {
+		struct xe_bo *bo = xe_vma_bo(vmas[i]);
+		int state;
+		int ret;
+
+		if (!bo)
+			continue;
+
+		/* BO must be locked before modifying madv state */
+		dma_resv_assert_held(bo->ttm.base.resv);
+
+		switch (op->purge_state_val.val) {
+		case DRM_XE_VMA_PURGEABLE_STATE_WILLNEED:
+			state = atomic_read(&bo->madv_purgeable);
+			if (state == XE_MADV_PURGEABLE_PURGED) {
+				ret = xe_bo_validate(bo, NULL, true, exec);
+				if (ret) {
+					drm_err(&vm->xe->drm,
+						"Failed to validate purged BO: %d\n", ret);
+					return;
+				}
+			}
+			atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_WILLNEED);
+			break;
+		case DRM_XE_VMA_PURGEABLE_STATE_DONTNEED:
+			state = atomic_read(&bo->madv_purgeable);
+			if (state != XE_MADV_PURGEABLE_PURGED)
+				atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_DONTNEED);
+			break;
+		default:
+			drm_warn(&vm->xe->drm, "Invalid madvice value = %d\n",
+				 op->purge_state_val.val);
+			return;
+		}
+	}
+}
+
 typedef void (*madvise_func)(struct xe_device *xe, struct xe_vm *vm,
 			     struct xe_vma **vmas, int num_vmas,
 			     struct drm_xe_madvise *op);
@@ -283,6 +331,19 @@ static bool madvise_args_are_sane(struct xe_device *xe, const struct drm_xe_madv
 			return false;
 		break;
 	}
+	case DRM_XE_VMA_ATTR_PURGEABLE_STATE:
+	{
+		u32 val = args->purge_state_val.val;
+
+		if (XE_IOCTL_DBG(xe, !((val == DRM_XE_VMA_PURGEABLE_STATE_WILLNEED) ||
+				       (val == DRM_XE_VMA_PURGEABLE_STATE_DONTNEED))))
+			return false;
+
+		if (XE_IOCTL_DBG(xe, args->purge_state_val.reserved))
+			return false;
+
+		break;
+	}
 	default:
 		if (XE_IOCTL_DBG(xe, 1))
 			return false;
@@ -402,6 +463,12 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
 					goto err_fini;
 			}
 		}
+		if (args->type == DRM_XE_VMA_ATTR_PURGEABLE_STATE) {
+			xe_vm_madvise_purgeable_bo(xe, vm, madvise_range.vmas,
+						   madvise_range.num_vmas, args, &exec);
+			goto err_fini;
+
+		}
 	}
 
 	if (madvise_range.has_svm_userptr_vmas) {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [RFC PATCH 4/9] drm/xe/bo: Prevent purging of shared buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (2 preceding siblings ...)
  2025-10-28 12:24 ` [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 5/9] drm/xe/bo: Handle CPU faults on purged " Arvind Yadav
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

Introduce the `xe_bo_is_shared_locked()` inline helper to determine if a
buffer object is shared across multiple clients or drivers. A buffer is
considered shared if it is exported via dma-buf, imported, or has a
handle count greater than one.

This check is critical for safely implementing purgeable memory. Purging
a buffer that is shared would lead to data corruption for other clients
that still hold a reference to it.

The new helper is used in two key locations:

1.  In `xe_vm_madvise_purgeable_bo()`, to prevent userspace from
    successfully marking a shared buffer as `DONTNEED`. This is the
    primary safeguard against incorrect usage.

2.  In `xe_bo_move()`, as a final safety check before the kernel
    initiates a purge during eviction. This ensures that even if a
    shared buffer were somehow marked `DONTNEED`, it would not be
    purged.

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>
---
 drivers/gpu/drm/xe/xe_bo.c         |  3 ++-
 drivers/gpu/drm/xe/xe_bo.h         | 30 ++++++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_vm_madvise.c |  2 +-
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 3b3eb83658cc..00d111d00e4a 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -910,7 +910,8 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
 	int state = atomic_read(&bo->madv_purgeable);
 	int ret = 0;
 
-	if (evict && state == XE_MADV_PURGEABLE_DONTNEED) {
+	/* Purge only non-shared BOs explicitly marked DONTNEED by userspace. */
+	if (evict && state == XE_MADV_PURGEABLE_DONTNEED && !xe_bo_is_shared_locked(bo)) {
 		xe_ttm_bo_purge(ttm_bo, ctx);
 			return 0;
 	}
diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index d85c691d06e0..8bd219ce4271 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -473,4 +473,34 @@ static inline bool xe_bo_is_mem_type(struct xe_bo *bo, u32 mem_type)
 	xe_bo_assert_held(bo);
 	return bo->ttm.resource->mem_type == mem_type;
 }
+
+/**
+ * xe_bo_is_shared_locked - Check if a buffer object is shared
+ * @bo: The buffer object to check
+ *
+ * Determines if a buffer object is considered shared, which includes:
+ * - Exported via dma-buf (obj->dma_buf is set)
+ * - Imported from another driver (obj->import_attach is set)
+ * - Referenced by multiple clients (handle_count > 1)
+ *
+ * This check is used to prevent data loss on shared content by avoiding
+ * certain operations like purging on buffers that other processes or
+ * drivers might still be using.
+ *
+ * Return: true if the buffer object is shared, false otherwise.
+ */
+static inline bool xe_bo_is_shared_locked(const struct xe_bo *bo)
+{
+	const struct drm_gem_object *obj = &bo->ttm.base;
+
+	dma_resv_assert_held(obj->resv);
+
+	if (obj->dma_buf || obj->import_attach)
+		return true;
+
+	if (obj->handle_count > 1)
+		return true;
+
+	return false;
+}
 #endif
diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
index 1f0356ea4403..49e159603d5d 100644
--- a/drivers/gpu/drm/xe/xe_vm_madvise.c
+++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
@@ -195,7 +195,7 @@ static void xe_vm_madvise_purgeable_bo(struct xe_device *xe, struct xe_vm *vm,
 			break;
 		case DRM_XE_VMA_PURGEABLE_STATE_DONTNEED:
 			state = atomic_read(&bo->madv_purgeable);
-			if (state != XE_MADV_PURGEABLE_PURGED)
+			if (state != XE_MADV_PURGEABLE_PURGED && !xe_bo_is_shared_locked(bo))
 				atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_DONTNEED);
 			break;
 		default:
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [RFC PATCH 5/9] drm/xe/bo: Handle CPU faults on purged buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (3 preceding siblings ...)
  2025-10-28 12:24 ` [RFC PATCH 4/9] drm/xe/bo: Prevent purging of shared buffer objects Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 6/9] drm/xe/bo: Prevent mmap of " Arvind Yadav
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

Modify the CPU page fault handler, `xe_bo_cpu_fault()`, to correctly
handle access to buffer objects that have been purged.

When a buffer object is in the `XE_MADV_PURGED` state, its backing
store has been reclaimed by the kernel. If the CPU attempts to access
this memory, it is an error that should be reported to the application.

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>
---
 drivers/gpu/drm/xe/xe_bo.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 00d111d00e4a..4b2ecf4152b0 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -2009,6 +2009,12 @@ static vm_fault_t xe_bo_cpu_fault(struct vm_fault *vmf)
 	} else {
 		ret = VM_FAULT_NOPAGE;
 	}
+	/*
+	 * BO content is gone. Signal the user process.
+	 * Userspace must call madvise(WILLNEED) to re-validate before next access.
+	 */
+	if (atomic_read(&bo->madv_purgeable) == XE_MADV_PURGEABLE_PURGED)
+		return VM_FAULT_SIGBUS;
 
 	/*
 	 * The fastpath failed and we were not required to return and retry immediately.
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [RFC PATCH 6/9] drm/xe/bo: Prevent mmap of purged buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (4 preceding siblings ...)
  2025-10-28 12:24 ` [RFC PATCH 5/9] drm/xe/bo: Handle CPU faults on purged " Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 7/9] drm/xe/vm: Prevent binding " Arvind Yadav
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

Add validation in `xe_gem_mmap_offset_ioctl()` to prevent userspace
from obtaining an mmap offset for a buffer object (BO) that has been
purged.

When a BO is in the `XE_MADV_PURGEABLE_PURGED` state, its backing memory
has been reclaimed by the kernel. Allowing an application to get an mmap
offset for such a BO is invalid, as any subsequent attempt to access the
mapped memory would result in a `SIGBUS` signal.

This patch checks the BO's madvise state before returning the offset. If
the state is `XE_MADV_PURGEABLE_PURGED`, the ioctl now fails with `-EINVAL`.
This provides clear and immediate feedback to the application that the
operation is not permitted.

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>
---
 drivers/gpu/drm/xe/xe_bo.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 4b2ecf4152b0..206ccccd07cd 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -3346,6 +3346,8 @@ int xe_gem_mmap_offset_ioctl(struct drm_device *dev, void *data,
 	struct xe_device *xe = to_xe_device(dev);
 	struct drm_xe_gem_mmap_offset *args = data;
 	struct drm_gem_object *gem_obj;
+	struct xe_bo *bo;
+	int state;
 
 	if (XE_IOCTL_DBG(xe, args->extensions) ||
 	    XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
@@ -3375,6 +3377,13 @@ int xe_gem_mmap_offset_ioctl(struct drm_device *dev, void *data,
 	if (XE_IOCTL_DBG(xe, !gem_obj))
 		return -ENOENT;
 
+	bo = gem_to_xe_bo(gem_obj);
+	state = atomic_read(&bo->madv_purgeable);
+	if (state == XE_MADV_PURGEABLE_PURGED) {
+		xe_bo_put(bo);
+		return -EINVAL;
+	}
+
 	/* The mmap offset was set up at BO allocation time. */
 	args->offset = drm_vma_node_offset_addr(&gem_obj->vma_node);
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [RFC PATCH 7/9] drm/xe/vm: Prevent binding of purged buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (5 preceding siblings ...)
  2025-10-28 12:24 ` [RFC PATCH 6/9] drm/xe/bo: Prevent mmap of " Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 8/9] drm/xe/uapi: Add UAPI for purgeable bo state to madvise query response Arvind Yadav
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

Add validation in the VM bind ioctl path to prevent a purged buffer
object (BO) from being bound to a virtual address space.

When a BO is in the `XE_MADV_PURGEABLE_PURGED` state, its memory has
been reclaimed by the kernel, and its contents are invalid. Attempting
to bind such a BO is an error, as it would lead to the GPU operating
on undefined memory.

This patch checks the BO's madvise state inside
`xe_vm_bind_ioctl_validate_bo()`. If the state is
`XE_MADV_PURGEABLE_PURGED`, the function now returns `-EFAULT`,
signaling an invalid memory access to the application.

Userspace must first re-validate the buffer by calling `madvise(WILLNEED)`
before it can be successfully bound again. This change ensures a clear
error path and prevents silent data corruption.

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>
---
 drivers/gpu/drm/xe/xe_vm.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 10d77666a425..b8d60550c191 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -3466,6 +3466,7 @@ static int xe_vm_bind_ioctl_validate_bo(struct xe_device *xe, struct xe_bo *bo,
 					u16 pat_index, u32 op, u32 bind_flags)
 {
 	u16 coh_mode;
+	int state;
 
 	if (XE_IOCTL_DBG(xe, range > xe_bo_size(bo)) ||
 	    XE_IOCTL_DBG(xe, obj_offset >
@@ -3473,6 +3474,11 @@ static int xe_vm_bind_ioctl_validate_bo(struct xe_device *xe, struct xe_bo *bo,
 		return -EINVAL;
 	}
 
+	state = atomic_read(&bo->madv_purgeable);
+	/* Cannot bind a purged BO: must madvise WILLNEED first (revalidation path) */
+	if (state == XE_MADV_PURGEABLE_PURGED)
+		return -EFAULT;
+
 	/*
 	 * Some platforms require 64k VM_BIND alignment,
 	 * specifically those with XE_VRAM_FLAGS_NEED64K.
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [RFC PATCH 8/9] drm/xe/uapi: Add UAPI for purgeable bo state to madvise query response
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (6 preceding siblings ...)
  2025-10-28 12:24 ` [RFC PATCH 7/9] drm/xe/vm: Prevent binding " Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-28 12:24 ` [RFC PATCH 9/9] drm/xe: Add support for querying purgeable BO states Arvind Yadav
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

From: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>

Complete the purgeable buffer object UAPI by adding the response
structure to drm_xe_mem_range_attr for querying current purgeable
state of buffer objects within a memory range.

This allows userspace to determine the current state of BOs:
- WILLNEED: BO is actively needed
- DONTNEED: BO is marked as not currently needed
- PURGED: BO has been purged by the kernel

Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
 include/uapi/drm/xe_drm.h | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index e5345101a92a..0777e0b4dc63 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -2145,10 +2145,13 @@ struct drm_xe_madvise {
 		 *    should not be purged by the kernel.
 		 *  - DRM_XE_VMA_PURGEABLE_STATE_DONTNEED: BO is not currently needed,
 		 *    kernel may purge it to free memory if under pressure.
+		 *  - DRM_XE_VMA_PURGEABLE_STATE_PURGED: Read-only state indicating
+		 *    the BO purge state.
 		 */
 		struct {
 #define DRM_XE_VMA_PURGEABLE_STATE_WILLNEED	0
 #define DRM_XE_VMA_PURGEABLE_STATE_DONTNEED	1
+#define DRM_XE_VMA_PURGEABLE_STATE_PURGED	2
 			/** @purge_state_val.val: value for DRM_XE_VMA_ATTR_PURGEABLE_STATE */
 			__u32 val;
 			/** @purge_state_val.reserved: Reserved */
@@ -2214,6 +2217,15 @@ struct drm_xe_mem_range_attr {
 		__u32 reserved;
 	} pat_index;
 
+	/** @purge_state_val: Purgeable state configuration */
+	struct {
+		/** @purge_state_val.val: value for DRM_XE_VMA_ATTR_PURGEABLE_STATE */
+		__u32 val;
+
+		/** @purge_state_val.reserved: Reserved */
+		__u32 reserved;
+	} purge_state_val;
+
 	/** @reserved: Reserved */
 	__u64 reserved[2];
 };
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [RFC PATCH 9/9] drm/xe: Add support for querying purgeable BO states
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (7 preceding siblings ...)
  2025-10-28 12:24 ` [RFC PATCH 8/9] drm/xe/uapi: Add UAPI for purgeable bo state to madvise query response Arvind Yadav
@ 2025-10-28 12:24 ` Arvind Yadav
  2025-10-28 12:37 ` [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Thomas Hellström
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Arvind Yadav @ 2025-10-28 12:24 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom

Add support for querying purgeable buffer object states through the
XE_VM_QUERY_MEM_RANGE_ATTRS ioctl. This allows userspace to determine
the current purgeable state of BO:
 - WILLNEED: BO is actively needed and re-validate if purged
 - DONTNEED: BO is not currently needed and may be purged
 - PURGED: BO has been purged by the kernel due to memory pressure

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>
---
 drivers/gpu/drm/xe/xe_vm.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index b8d60550c191..7d58f89dc415 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -2014,6 +2014,7 @@ static int get_mem_attrs(struct xe_vm *vm, u32 *num_vmas, u64 start,
 
 	drm_gpuvm_for_each_va_range(gpuva, &vm->gpuvm, start, end) {
 		struct xe_vma *vma = gpuva_to_vma(gpuva);
+		struct xe_bo *bo;
 
 		if (i == *num_vmas)
 			return -ENOSPC;
@@ -2026,6 +2027,10 @@ static int get_mem_attrs(struct xe_vm *vm, u32 *num_vmas, u64 start,
 		attrs[i].preferred_mem_loc.migration_policy =
 		vma->attr.preferred_loc.migration_policy;
 
+		bo = xe_vma_bo(vma);
+		if (bo)
+			attrs[i].purge_state_val.val = atomic_read(&bo->madv_purgeable);
+
 		i++;
 	}
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (8 preceding siblings ...)
  2025-10-28 12:24 ` [RFC PATCH 9/9] drm/xe: Add support for querying purgeable BO states Arvind Yadav
@ 2025-10-28 12:37 ` Thomas Hellström
  2025-10-28 13:02   ` Matthew Auld
  2025-10-28 13:23 ` ✗ CI.checkpatch: warning for " Patchwork
                   ` (3 subsequent siblings)
  13 siblings, 1 reply; 22+ messages in thread
From: Thomas Hellström @ 2025-10-28 12:37 UTC (permalink / raw)
  To: Arvind Yadav, intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray

On Tue, 2025-10-28 at 17:54 +0530, Arvind Yadav wrote:
> This patch series introduces support for purgeable buffer objects
> (BOs) in the Xe driver. 
> This feature allows userspace applications to provide memory usage
> hints to the kernel,
> enabling more effective memory management, especially under system
> memory pressure.
> 
> When an application no longer needs the contents of a buffer, it can
> mark it as DONTNEED
> via the DRM_XE_MADVISE ioctl. This makes the BO a candidate for
> purging. If the kernel
> experiences memory pressure, it can reclaim the backing store of
> these BOs,
> freeing up GPU memory and helping to prevent Out-Of-Memory (OOM)
> situations.
> 
> The lifecycle of a purgeable BO is as follows:
> 
> A BO starts in the default WILLNEED state.
> Userspace marks it as DONTNEED when its contents are discardable.
> Under memory pressure, the kernel may purge the BO, transitioning it
> to the PURGED state.
> Any attempt to use a purged BO (e.g., binding, mapping, or CPU
> access) will result in an error,
> signaling to the application that the contents are gone. The
> application can then re-validate
> the BO by marking it WILLNEED, at which point new backing store is
> allocated. To prevent data corruption,
> a critical safety check ensures that only non-shared buffers can be
> marked as purgeable.

What happens if the bo is bound to multiple address ranges? Do we
require all of them to be marked purged?

Also with i915, when someone called WILLNEED on a purged bo, there was
an error rather than an attempt to rebind. What's the reasoning behind
re-allocating backing store here? Doesn't that mean we need to keep
vmas around even if we purge?

/Thomas

> 
> Arvind Yadav (7):
>   drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo
>   drm/xe/madvise: Implement purgeable buffer object support
>   drm/xe/bo: Prevent purging of shared buffer objects
>   drm/xe/bo: Handle CPU faults on purged buffer objects
>   drm/xe/bo: Prevent mmap of purged buffer objects
>   drm/xe/vm: Prevent binding of purged buffer objects
>   drm/xe: Add support for querying purgeable BO states
> 
> Himal Prasad Ghimiray (2):
>   drm/xe/uapi: Add UAPI support for purgeable buffer objects
>   drm/xe/uapi: Add UAPI for purgeable bo state to madvise query
> response
> 
>  drivers/gpu/drm/xe/xe_bo.c         | 91 ++++++++++++++++++++++++++--
> --
>  drivers/gpu/drm/xe/xe_bo.h         | 51 +++++++++++++++++
>  drivers/gpu/drm/xe/xe_bo_types.h   |  3 +
>  drivers/gpu/drm/xe/xe_vm.c         | 11 ++++
>  drivers/gpu/drm/xe/xe_vm_madvise.c | 67 ++++++++++++++++++++++
>  include/uapi/drm/xe_drm.h          | 34 +++++++++++
>  6 files changed, 245 insertions(+), 12 deletions(-)
> 


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects
  2025-10-28 12:37 ` [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Thomas Hellström
@ 2025-10-28 13:02   ` Matthew Auld
  2025-10-29  8:40     ` Yadav, Arvind
  0 siblings, 1 reply; 22+ messages in thread
From: Matthew Auld @ 2025-10-28 13:02 UTC (permalink / raw)
  To: Thomas Hellström, Arvind Yadav, intel-xe
  Cc: matthew.brost, himal.prasad.ghimiray

On 28/10/2025 12:37, Thomas Hellström wrote:
> On Tue, 2025-10-28 at 17:54 +0530, Arvind Yadav wrote:
>> This patch series introduces support for purgeable buffer objects
>> (BOs) in the Xe driver.
>> This feature allows userspace applications to provide memory usage
>> hints to the kernel,
>> enabling more effective memory management, especially under system
>> memory pressure.
>>
>> When an application no longer needs the contents of a buffer, it can
>> mark it as DONTNEED
>> via the DRM_XE_MADVISE ioctl. This makes the BO a candidate for
>> purging. If the kernel
>> experiences memory pressure, it can reclaim the backing store of
>> these BOs,
>> freeing up GPU memory and helping to prevent Out-Of-Memory (OOM)
>> situations.
>>
>> The lifecycle of a purgeable BO is as follows:
>>
>> A BO starts in the default WILLNEED state.
>> Userspace marks it as DONTNEED when its contents are discardable.
>> Under memory pressure, the kernel may purge the BO, transitioning it
>> to the PURGED state.
>> Any attempt to use a purged BO (e.g., binding, mapping, or CPU
>> access) will result in an error,
>> signaling to the application that the contents are gone. The
>> application can then re-validate
>> the BO by marking it WILLNEED, at which point new backing store is
>> allocated. To prevent data corruption,
>> a critical safety check ensures that only non-shared buffers can be
>> marked as purgeable.
> 
> What happens if the bo is bound to multiple address ranges? Do we
> require all of them to be marked purged?
> 
> Also with i915, when someone called WILLNEED on a purged bo, there was
> an error rather than an attempt to rebind. What's the reasoning behind
> re-allocating backing store here? Doesn't that mean we need to keep
> vmas around even if we purge?

Yeah, IIRC in Mesa/iris it used some kind of BO pool, marking stuff as 
DONTNEED when "freeing" to the pool, and then when something was 
allocated again from the pool it's first marked as WILLNEED, but if it 
was purged they would simply discard the BO and try the next available 
BO in the pool, which is hopefully not purged. So sounds like 
re-allocating could potentially end up with undesired behaviour where it 
now just always re-allocates instead of trying to re-use an existing 
non-purged BO which might already have pages ready to go.

> 
> /Thomas
> 
>>
>> Arvind Yadav (7):
>>    drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo
>>    drm/xe/madvise: Implement purgeable buffer object support
>>    drm/xe/bo: Prevent purging of shared buffer objects
>>    drm/xe/bo: Handle CPU faults on purged buffer objects
>>    drm/xe/bo: Prevent mmap of purged buffer objects
>>    drm/xe/vm: Prevent binding of purged buffer objects
>>    drm/xe: Add support for querying purgeable BO states
>>
>> Himal Prasad Ghimiray (2):
>>    drm/xe/uapi: Add UAPI support for purgeable buffer objects
>>    drm/xe/uapi: Add UAPI for purgeable bo state to madvise query
>> response
>>
>>   drivers/gpu/drm/xe/xe_bo.c         | 91 ++++++++++++++++++++++++++--
>> --
>>   drivers/gpu/drm/xe/xe_bo.h         | 51 +++++++++++++++++
>>   drivers/gpu/drm/xe/xe_bo_types.h   |  3 +
>>   drivers/gpu/drm/xe/xe_vm.c         | 11 ++++
>>   drivers/gpu/drm/xe/xe_vm_madvise.c | 67 ++++++++++++++++++++++
>>   include/uapi/drm/xe_drm.h          | 34 +++++++++++
>>   6 files changed, 245 insertions(+), 12 deletions(-)
>>
> 


^ permalink raw reply	[flat|nested] 22+ messages in thread

* ✗ CI.checkpatch: warning for drm/xe/madvise: Add support for purgeable buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (9 preceding siblings ...)
  2025-10-28 12:37 ` [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Thomas Hellström
@ 2025-10-28 13:23 ` Patchwork
  2025-10-28 13:24 ` ✓ CI.KUnit: success " Patchwork
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-10-28 13:23 UTC (permalink / raw)
  To: Arvind Yadav; +Cc: intel-xe

== Series Details ==

Series: drm/xe/madvise: Add support for purgeable buffer objects
URL   : https://patchwork.freedesktop.org/series/156651/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
f867e605613af1770f90c4b0afd4a8f06424d1f0
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 4ecc8753e3a2aeb0ab91500f04c64ba39ff5ae7d
Author: Arvind Yadav <arvind.yadav@intel.com>
Date:   Tue Oct 28 17:54:15 2025 +0530

    drm/xe: Add support for querying purgeable BO states
    
    Add support for querying purgeable buffer object states through the
    XE_VM_QUERY_MEM_RANGE_ATTRS ioctl. This allows userspace to determine
    the current purgeable state of BO:
     - WILLNEED: BO is actively needed and re-validate if purged
     - DONTNEED: BO is not currently needed and may be purged
     - PURGED: BO has been purged by the kernel due to memory pressure
    
    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>
+ /mt/dim checkpatch 5742fc7aea99a1326637a7106eeaeac383a1c76d drm-intel
e7575feffd11 drm/xe/uapi: Add UAPI support for purgeable buffer objects
327a9d63b311 drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo
-:14: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#14: 
  * XE_MADV_PURGEABLE_WILLNEED:  BO is actively needed, should not be purged

total: 0 errors, 1 warnings, 0 checks, 37 lines checked
843e92c70085 drm/xe/madvise: Implement purgeable buffer object support
-:82: CHECK:BRACES: Blank lines aren't necessary before a close brace '}'
#82: FILE: drivers/gpu/drm/xe/xe_bo.c:888:
+
+			}

-:150: CHECK:BRACES: Blank lines aren't necessary after an open brace '{'
#150: FILE: drivers/gpu/drm/xe/xe_vm_madvise.c:169:
+{
+

-:201: CHECK:UNNECESSARY_PARENTHESES: Unnecessary parentheses around 'val == DRM_XE_VMA_PURGEABLE_STATE_WILLNEED'
#201: FILE: drivers/gpu/drm/xe/xe_vm_madvise.c:338:
+		if (XE_IOCTL_DBG(xe, !((val == DRM_XE_VMA_PURGEABLE_STATE_WILLNEED) ||
+				       (val == DRM_XE_VMA_PURGEABLE_STATE_DONTNEED))))

-:201: CHECK:UNNECESSARY_PARENTHESES: Unnecessary parentheses around 'val == DRM_XE_VMA_PURGEABLE_STATE_DONTNEED'
#201: FILE: drivers/gpu/drm/xe/xe_vm_madvise.c:338:
+		if (XE_IOCTL_DBG(xe, !((val == DRM_XE_VMA_PURGEABLE_STATE_WILLNEED) ||
+				       (val == DRM_XE_VMA_PURGEABLE_STATE_DONTNEED))))

-:222: CHECK:BRACES: Blank lines aren't necessary before a close brace '}'
#222: FILE: drivers/gpu/drm/xe/xe_vm_madvise.c:471:
+
+		}

total: 0 errors, 0 warnings, 5 checks, 186 lines checked
eab5d3ea8147 drm/xe/bo: Prevent purging of shared buffer objects
4e4b2b6e0afc drm/xe/bo: Handle CPU faults on purged buffer objects
ff911f79f2a7 drm/xe/bo: Prevent mmap of purged buffer objects
-:19: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#19: 
the state is `XE_MADV_PURGEABLE_PURGED`, the ioctl now fails with `-EINVAL`.

total: 0 errors, 1 warnings, 0 checks, 21 lines checked
e6142517b5dc drm/xe/vm: Prevent binding of purged buffer objects
769db942a6f1 drm/xe/uapi: Add UAPI for purgeable bo state to madvise query response
4ecc8753e3a2 drm/xe: Add support for querying purgeable BO states



^ permalink raw reply	[flat|nested] 22+ messages in thread

* ✓ CI.KUnit: success for drm/xe/madvise: Add support for purgeable buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (10 preceding siblings ...)
  2025-10-28 13:23 ` ✗ CI.checkpatch: warning for " Patchwork
@ 2025-10-28 13:24 ` Patchwork
  2025-10-28 14:12 ` ✗ Xe.CI.BAT: failure " Patchwork
  2025-10-28 19:44 ` ✗ Xe.CI.Full: " Patchwork
  13 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-10-28 13:24 UTC (permalink / raw)
  To: Arvind Yadav; +Cc: intel-xe

== Series Details ==

Series: drm/xe/madvise: Add support for purgeable buffer objects
URL   : https://patchwork.freedesktop.org/series/156651/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[13:23:11] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:23:15] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:23:46] Starting KUnit Kernel (1/1)...
[13:23:46] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:23:46] ================== guc_buf (11 subtests) ===================
[13:23:46] [PASSED] test_smallest
[13:23:46] [PASSED] test_largest
[13:23:46] [PASSED] test_granular
[13:23:46] [PASSED] test_unique
[13:23:46] [PASSED] test_overlap
[13:23:46] [PASSED] test_reusable
[13:23:46] [PASSED] test_too_big
[13:23:46] [PASSED] test_flush
[13:23:46] [PASSED] test_lookup
[13:23:46] [PASSED] test_data
[13:23:46] [PASSED] test_class
[13:23:46] ===================== [PASSED] guc_buf =====================
[13:23:46] =================== guc_dbm (7 subtests) ===================
[13:23:46] [PASSED] test_empty
[13:23:46] [PASSED] test_default
[13:23:46] ======================== test_size  ========================
[13:23:46] [PASSED] 4
[13:23:46] [PASSED] 8
[13:23:46] [PASSED] 32
[13:23:46] [PASSED] 256
[13:23:46] ==================== [PASSED] test_size ====================
[13:23:46] ======================= test_reuse  ========================
[13:23:46] [PASSED] 4
[13:23:46] [PASSED] 8
[13:23:46] [PASSED] 32
[13:23:46] [PASSED] 256
[13:23:46] =================== [PASSED] test_reuse ====================
[13:23:46] =================== test_range_overlap  ====================
[13:23:46] [PASSED] 4
[13:23:46] [PASSED] 8
[13:23:46] [PASSED] 32
[13:23:46] [PASSED] 256
[13:23:46] =============== [PASSED] test_range_overlap ================
[13:23:46] =================== test_range_compact  ====================
[13:23:46] [PASSED] 4
[13:23:46] [PASSED] 8
[13:23:46] [PASSED] 32
[13:23:46] [PASSED] 256
[13:23:46] =============== [PASSED] test_range_compact ================
[13:23:46] ==================== test_range_spare  =====================
[13:23:46] [PASSED] 4
[13:23:46] [PASSED] 8
[13:23:46] [PASSED] 32
[13:23:46] [PASSED] 256
[13:23:46] ================ [PASSED] test_range_spare =================
[13:23:46] ===================== [PASSED] guc_dbm =====================
[13:23:46] =================== guc_idm (6 subtests) ===================
[13:23:46] [PASSED] bad_init
[13:23:46] [PASSED] no_init
[13:23:46] [PASSED] init_fini
[13:23:46] [PASSED] check_used
[13:23:46] [PASSED] check_quota
[13:23:46] [PASSED] check_all
[13:23:46] ===================== [PASSED] guc_idm =====================
[13:23:46] ================== no_relay (3 subtests) ===================
[13:23:46] [PASSED] xe_drops_guc2pf_if_not_ready
[13:23:46] [PASSED] xe_drops_guc2vf_if_not_ready
[13:23:46] [PASSED] xe_rejects_send_if_not_ready
[13:23:46] ==================== [PASSED] no_relay =====================
[13:23:46] ================== pf_relay (14 subtests) ==================
[13:23:46] [PASSED] pf_rejects_guc2pf_too_short
[13:23:46] [PASSED] pf_rejects_guc2pf_too_long
[13:23:46] [PASSED] pf_rejects_guc2pf_no_payload
[13:23:46] [PASSED] pf_fails_no_payload
[13:23:46] [PASSED] pf_fails_bad_origin
[13:23:46] [PASSED] pf_fails_bad_type
[13:23:46] [PASSED] pf_txn_reports_error
[13:23:46] [PASSED] pf_txn_sends_pf2guc
[13:23:46] [PASSED] pf_sends_pf2guc
[13:23:46] [SKIPPED] pf_loopback_nop
[13:23:46] [SKIPPED] pf_loopback_echo
[13:23:46] [SKIPPED] pf_loopback_fail
[13:23:46] [SKIPPED] pf_loopback_busy
[13:23:46] [SKIPPED] pf_loopback_retry
[13:23:46] ==================== [PASSED] pf_relay =====================
[13:23:46] ================== vf_relay (3 subtests) ===================
[13:23:46] [PASSED] vf_rejects_guc2vf_too_short
[13:23:46] [PASSED] vf_rejects_guc2vf_too_long
[13:23:46] [PASSED] vf_rejects_guc2vf_no_payload
[13:23:46] ==================== [PASSED] vf_relay =====================
[13:23:46] ===================== lmtt (1 subtest) =====================
[13:23:46] ======================== test_ops  =========================
[13:23:46] [PASSED] 2-level
[13:23:46] [PASSED] multi-level
[13:23:46] ==================== [PASSED] test_ops =====================
[13:23:46] ====================== [PASSED] lmtt =======================
[13:23:46] ================= pf_service (11 subtests) =================
[13:23:46] [PASSED] pf_negotiate_any
[13:23:46] [PASSED] pf_negotiate_base_match
[13:23:46] [PASSED] pf_negotiate_base_newer
[13:23:46] [PASSED] pf_negotiate_base_next
[13:23:46] [SKIPPED] pf_negotiate_base_older
[13:23:46] [PASSED] pf_negotiate_base_prev
[13:23:46] [PASSED] pf_negotiate_latest_match
[13:23:46] [PASSED] pf_negotiate_latest_newer
[13:23:46] [PASSED] pf_negotiate_latest_next
[13:23:46] [SKIPPED] pf_negotiate_latest_older
[13:23:46] [SKIPPED] pf_negotiate_latest_prev
[13:23:46] =================== [PASSED] pf_service ====================
[13:23:46] ================= xe_guc_g2g (2 subtests) ==================
[13:23:46] ============== xe_live_guc_g2g_kunit_default  ==============
[13:23:46] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[13:23:46] ============== xe_live_guc_g2g_kunit_allmem  ===============
[13:23:46] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[13:23:46] =================== [SKIPPED] xe_guc_g2g ===================
[13:23:46] =================== xe_mocs (2 subtests) ===================
[13:23:46] ================ xe_live_mocs_kernel_kunit  ================
[13:23:46] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[13:23:46] ================ xe_live_mocs_reset_kunit  =================
[13:23:46] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[13:23:46] ==================== [SKIPPED] xe_mocs =====================
[13:23:46] ================= xe_migrate (2 subtests) ==================
[13:23:46] ================= xe_migrate_sanity_kunit  =================
[13:23:46] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[13:23:46] ================== xe_validate_ccs_kunit  ==================
[13:23:46] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[13:23:46] =================== [SKIPPED] xe_migrate ===================
[13:23:46] ================== xe_dma_buf (1 subtest) ==================
[13:23:46] ==================== xe_dma_buf_kunit  =====================
[13:23:46] ================ [SKIPPED] xe_dma_buf_kunit ================
[13:23:46] =================== [SKIPPED] xe_dma_buf ===================
[13:23:46] ================= xe_bo_shrink (1 subtest) =================
[13:23:46] =================== xe_bo_shrink_kunit  ====================
[13:23:46] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[13:23:46] ================== [SKIPPED] xe_bo_shrink ==================
[13:23:46] ==================== xe_bo (2 subtests) ====================
[13:23:46] ================== xe_ccs_migrate_kunit  ===================
[13:23:46] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[13:23:46] ==================== xe_bo_evict_kunit  ====================
[13:23:46] =============== [SKIPPED] xe_bo_evict_kunit ================
[13:23:46] ===================== [SKIPPED] xe_bo ======================
[13:23:46] ==================== args (11 subtests) ====================
[13:23:46] [PASSED] count_args_test
[13:23:46] [PASSED] call_args_example
[13:23:46] [PASSED] call_args_test
[13:23:46] [PASSED] drop_first_arg_example
[13:23:46] [PASSED] drop_first_arg_test
[13:23:46] [PASSED] first_arg_example
[13:23:46] [PASSED] first_arg_test
[13:23:46] [PASSED] last_arg_example
[13:23:46] [PASSED] last_arg_test
[13:23:46] [PASSED] pick_arg_example
[13:23:46] [PASSED] sep_comma_example
[13:23:46] ====================== [PASSED] args =======================
[13:23:46] =================== xe_pci (3 subtests) ====================
[13:23:46] ==================== check_graphics_ip  ====================
[13:23:46] [PASSED] 12.00 Xe_LP
[13:23:46] [PASSED] 12.10 Xe_LP+
[13:23:46] [PASSED] 12.55 Xe_HPG
[13:23:46] [PASSED] 12.60 Xe_HPC
[13:23:46] [PASSED] 12.70 Xe_LPG
[13:23:46] [PASSED] 12.71 Xe_LPG
[13:23:46] [PASSED] 12.74 Xe_LPG+
[13:23:46] [PASSED] 20.01 Xe2_HPG
[13:23:46] [PASSED] 20.02 Xe2_HPG
[13:23:46] [PASSED] 20.04 Xe2_LPG
[13:23:46] [PASSED] 30.00 Xe3_LPG
[13:23:46] [PASSED] 30.01 Xe3_LPG
[13:23:46] [PASSED] 30.03 Xe3_LPG
[13:23:46] [PASSED] 30.04 Xe3_LPG
[13:23:46] [PASSED] 30.05 Xe3_LPG
[13:23:46] [PASSED] 35.11 Xe3p_XPC
[13:23:46] ================ [PASSED] check_graphics_ip ================
[13:23:46] ===================== check_media_ip  ======================
[13:23:46] [PASSED] 12.00 Xe_M
[13:23:46] [PASSED] 12.55 Xe_HPM
[13:23:46] [PASSED] 13.00 Xe_LPM+
[13:23:46] [PASSED] 13.01 Xe2_HPM
[13:23:46] [PASSED] 20.00 Xe2_LPM
[13:23:46] [PASSED] 30.00 Xe3_LPM
[13:23:46] [PASSED] 30.02 Xe3_LPM
[13:23:46] [PASSED] 35.00 Xe3p_LPM
[13:23:46] [PASSED] 35.03 Xe3p_HPM
[13:23:46] ================= [PASSED] check_media_ip ==================
[13:23:46] =================== check_platform_desc  ===================
[13:23:46] [PASSED] 0x9A60 (TIGERLAKE)
[13:23:46] [PASSED] 0x9A68 (TIGERLAKE)
[13:23:46] [PASSED] 0x9A70 (TIGERLAKE)
[13:23:46] [PASSED] 0x9A40 (TIGERLAKE)
[13:23:46] [PASSED] 0x9A49 (TIGERLAKE)
[13:23:46] [PASSED] 0x9A59 (TIGERLAKE)
[13:23:46] [PASSED] 0x9A78 (TIGERLAKE)
[13:23:46] [PASSED] 0x9AC0 (TIGERLAKE)
[13:23:46] [PASSED] 0x9AC9 (TIGERLAKE)
[13:23:46] [PASSED] 0x9AD9 (TIGERLAKE)
[13:23:46] [PASSED] 0x9AF8 (TIGERLAKE)
[13:23:46] [PASSED] 0x4C80 (ROCKETLAKE)
[13:23:46] [PASSED] 0x4C8A (ROCKETLAKE)
[13:23:46] [PASSED] 0x4C8B (ROCKETLAKE)
[13:23:46] [PASSED] 0x4C8C (ROCKETLAKE)
[13:23:46] [PASSED] 0x4C90 (ROCKETLAKE)
[13:23:46] [PASSED] 0x4C9A (ROCKETLAKE)
[13:23:46] [PASSED] 0x4680 (ALDERLAKE_S)
[13:23:46] [PASSED] 0x4682 (ALDERLAKE_S)
[13:23:46] [PASSED] 0x4688 (ALDERLAKE_S)
[13:23:46] [PASSED] 0x468A (ALDERLAKE_S)
[13:23:46] [PASSED] 0x468B (ALDERLAKE_S)
[13:23:46] [PASSED] 0x4690 (ALDERLAKE_S)
[13:23:46] [PASSED] 0x4692 (ALDERLAKE_S)
[13:23:46] [PASSED] 0x4693 (ALDERLAKE_S)
[13:23:46] [PASSED] 0x46A0 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46A1 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46A2 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46A3 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46A6 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46A8 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46AA (ALDERLAKE_P)
[13:23:46] [PASSED] 0x462A (ALDERLAKE_P)
[13:23:46] [PASSED] 0x4626 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x4628 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46B0 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46B1 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46B2 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46B3 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46C0 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46C1 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46C2 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46C3 (ALDERLAKE_P)
[13:23:46] [PASSED] 0x46D0 (ALDERLAKE_N)
[13:23:46] [PASSED] 0x46D1 (ALDERLAKE_N)
[13:23:46] [PASSED] 0x46D2 (ALDERLAKE_N)
[13:23:46] [PASSED] 0x46D3 (ALDERLAKE_N)
[13:23:46] [PASSED] 0x46D4 (ALDERLAKE_N)
[13:23:46] [PASSED] 0xA721 (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA7A1 (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA7A9 (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA7AC (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA7AD (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA720 (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA7A0 (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA7A8 (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA7AA (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA7AB (ALDERLAKE_P)
[13:23:46] [PASSED] 0xA780 (ALDERLAKE_S)
[13:23:46] [PASSED] 0xA781 (ALDERLAKE_S)
[13:23:46] [PASSED] 0xA782 (ALDERLAKE_S)
[13:23:46] [PASSED] 0xA783 (ALDERLAKE_S)
[13:23:46] [PASSED] 0xA788 (ALDERLAKE_S)
[13:23:46] [PASSED] 0xA789 (ALDERLAKE_S)
[13:23:46] [PASSED] 0xA78A (ALDERLAKE_S)
[13:23:46] [PASSED] 0xA78B (ALDERLAKE_S)
[13:23:46] [PASSED] 0x4905 (DG1)
[13:23:46] [PASSED] 0x4906 (DG1)
[13:23:46] [PASSED] 0x4907 (DG1)
[13:23:46] [PASSED] 0x4908 (DG1)
[13:23:46] [PASSED] 0x4909 (DG1)
[13:23:46] [PASSED] 0x56C0 (DG2)
[13:23:46] [PASSED] 0x56C2 (DG2)
[13:23:46] [PASSED] 0x56C1 (DG2)
[13:23:46] [PASSED] 0x7D51 (METEORLAKE)
[13:23:46] [PASSED] 0x7DD1 (METEORLAKE)
[13:23:46] [PASSED] 0x7D41 (METEORLAKE)
[13:23:46] [PASSED] 0x7D67 (METEORLAKE)
[13:23:46] [PASSED] 0xB640 (METEORLAKE)
[13:23:46] [PASSED] 0x56A0 (DG2)
[13:23:46] [PASSED] 0x56A1 (DG2)
[13:23:46] [PASSED] 0x56A2 (DG2)
[13:23:46] [PASSED] 0x56BE (DG2)
[13:23:46] [PASSED] 0x56BF (DG2)
[13:23:46] [PASSED] 0x5690 (DG2)
[13:23:46] [PASSED] 0x5691 (DG2)
[13:23:46] [PASSED] 0x5692 (DG2)
[13:23:46] [PASSED] 0x56A5 (DG2)
[13:23:46] [PASSED] 0x56A6 (DG2)
[13:23:46] [PASSED] 0x56B0 (DG2)
[13:23:46] [PASSED] 0x56B1 (DG2)
[13:23:46] [PASSED] 0x56BA (DG2)
[13:23:46] [PASSED] 0x56BB (DG2)
[13:23:46] [PASSED] 0x56BC (DG2)
[13:23:46] [PASSED] 0x56BD (DG2)
[13:23:46] [PASSED] 0x5693 (DG2)
[13:23:46] [PASSED] 0x5694 (DG2)
[13:23:46] [PASSED] 0x5695 (DG2)
[13:23:46] [PASSED] 0x56A3 (DG2)
[13:23:46] [PASSED] 0x56A4 (DG2)
[13:23:46] [PASSED] 0x56B2 (DG2)
[13:23:46] [PASSED] 0x56B3 (DG2)
[13:23:46] [PASSED] 0x5696 (DG2)
[13:23:46] [PASSED] 0x5697 (DG2)
[13:23:46] [PASSED] 0xB69 (PVC)
[13:23:46] [PASSED] 0xB6E (PVC)
[13:23:46] [PASSED] 0xBD4 (PVC)
[13:23:46] [PASSED] 0xBD5 (PVC)
[13:23:46] [PASSED] 0xBD6 (PVC)
[13:23:46] [PASSED] 0xBD7 (PVC)
[13:23:46] [PASSED] 0xBD8 (PVC)
[13:23:46] [PASSED] 0xBD9 (PVC)
[13:23:46] [PASSED] 0xBDA (PVC)
[13:23:46] [PASSED] 0xBDB (PVC)
[13:23:46] [PASSED] 0xBE0 (PVC)
[13:23:46] [PASSED] 0xBE1 (PVC)
[13:23:46] [PASSED] 0xBE5 (PVC)
[13:23:46] [PASSED] 0x7D40 (METEORLAKE)
[13:23:46] [PASSED] 0x7D45 (METEORLAKE)
[13:23:46] [PASSED] 0x7D55 (METEORLAKE)
[13:23:46] [PASSED] 0x7D60 (METEORLAKE)
[13:23:46] [PASSED] 0x7DD5 (METEORLAKE)
[13:23:46] [PASSED] 0x6420 (LUNARLAKE)
[13:23:46] [PASSED] 0x64A0 (LUNARLAKE)
[13:23:46] [PASSED] 0x64B0 (LUNARLAKE)
[13:23:46] [PASSED] 0xE202 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE209 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE20B (BATTLEMAGE)
[13:23:46] [PASSED] 0xE20C (BATTLEMAGE)
[13:23:46] [PASSED] 0xE20D (BATTLEMAGE)
[13:23:46] [PASSED] 0xE210 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE211 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE212 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE216 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE220 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE221 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE222 (BATTLEMAGE)
[13:23:46] [PASSED] 0xE223 (BATTLEMAGE)
[13:23:46] [PASSED] 0xB080 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB081 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB082 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB083 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB084 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB085 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB086 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB087 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB08F (PANTHERLAKE)
[13:23:46] [PASSED] 0xB090 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB0A0 (PANTHERLAKE)
[13:23:46] [PASSED] 0xB0B0 (PANTHERLAKE)
[13:23:46] [PASSED] 0xFD80 (PANTHERLAKE)
[13:23:46] [PASSED] 0xFD81 (PANTHERLAKE)
[13:23:46] [PASSED] 0xD740 (NOVALAKE_S)
[13:23:46] [PASSED] 0xD741 (NOVALAKE_S)
[13:23:46] [PASSED] 0xD742 (NOVALAKE_S)
[13:23:46] [PASSED] 0xD743 (NOVALAKE_S)
[13:23:46] [PASSED] 0xD744 (NOVALAKE_S)
[13:23:46] [PASSED] 0xD745 (NOVALAKE_S)
[13:23:46] [PASSED] 0x674C (CRESCENTISLAND)
[13:23:46] =============== [PASSED] check_platform_desc ===============
[13:23:46] ===================== [PASSED] xe_pci ======================
[13:23:46] =================== xe_rtp (2 subtests) ====================
[13:23:46] =============== xe_rtp_process_to_sr_tests  ================
[13:23:46] [PASSED] coalesce-same-reg
[13:23:46] [PASSED] no-match-no-add
[13:23:46] [PASSED] match-or
[13:23:46] [PASSED] match-or-xfail
[13:23:46] [PASSED] no-match-no-add-multiple-rules
[13:23:46] [PASSED] two-regs-two-entries
[13:23:46] [PASSED] clr-one-set-other
[13:23:46] [PASSED] set-field
[13:23:46] [PASSED] conflict-duplicate
[13:23:46] [PASSED] conflict-not-disjoint
[13:23:46] [PASSED] conflict-reg-type
[13:23:46] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[13:23:46] ================== xe_rtp_process_tests  ===================
[13:23:46] [PASSED] active1
[13:23:46] [PASSED] active2
[13:23:46] [PASSED] active-inactive
[13:23:46] [PASSED] inactive-active
[13:23:46] [PASSED] inactive-1st_or_active-inactive
[13:23:46] [PASSED] inactive-2nd_or_active-inactive
[13:23:46] [PASSED] inactive-last_or_active-inactive
stty: 'standard input': Inappropriate ioctl for device
[13:23:46] [PASSED] inactive-no_or_active-inactive
[13:23:46] ============== [PASSED] xe_rtp_process_tests ===============
[13:23:46] ===================== [PASSED] xe_rtp ======================
[13:23:46] ==================== xe_wa (1 subtest) =====================
[13:23:46] ======================== xe_wa_gt  =========================
[13:23:46] [PASSED] TIGERLAKE B0
[13:23:46] [PASSED] DG1 A0
[13:23:46] [PASSED] DG1 B0
[13:23:46] [PASSED] ALDERLAKE_S A0
[13:23:46] [PASSED] ALDERLAKE_S B0
[13:23:46] [PASSED] ALDERLAKE_S C0
[13:23:46] [PASSED] ALDERLAKE_S D0
[13:23:46] [PASSED] ALDERLAKE_P A0
[13:23:46] [PASSED] ALDERLAKE_P B0
[13:23:46] [PASSED] ALDERLAKE_P C0
[13:23:46] [PASSED] ALDERLAKE_S RPLS D0
[13:23:46] [PASSED] ALDERLAKE_P RPLU E0
[13:23:46] [PASSED] DG2 G10 C0
[13:23:46] [PASSED] DG2 G11 B1
[13:23:46] [PASSED] DG2 G12 A1
[13:23:46] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[13:23:46] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[13:23:46] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[13:23:46] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[13:23:46] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[13:23:46] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[13:23:46] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[13:23:46] ==================== [PASSED] xe_wa_gt =====================
[13:23:46] ====================== [PASSED] xe_wa ======================
[13:23:46] ============================================================
[13:23:46] Testing complete. Ran 318 tests: passed: 300, skipped: 18
[13:23:46] Elapsed time: 35.489s total, 4.268s configuring, 30.854s building, 0.333s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[13:23:46] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:23:48] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:24:13] Starting KUnit Kernel (1/1)...
[13:24:13] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:24:13] ============ drm_test_pick_cmdline (2 subtests) ============
[13:24:13] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[13:24:13] =============== drm_test_pick_cmdline_named  ===============
[13:24:13] [PASSED] NTSC
[13:24:13] [PASSED] NTSC-J
[13:24:13] [PASSED] PAL
[13:24:13] [PASSED] PAL-M
[13:24:13] =========== [PASSED] drm_test_pick_cmdline_named ===========
[13:24:13] ============== [PASSED] drm_test_pick_cmdline ==============
[13:24:13] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[13:24:13] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[13:24:13] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[13:24:13] =========== drm_validate_clone_mode (2 subtests) ===========
[13:24:13] ============== drm_test_check_in_clone_mode  ===============
[13:24:13] [PASSED] in_clone_mode
[13:24:13] [PASSED] not_in_clone_mode
[13:24:13] ========== [PASSED] drm_test_check_in_clone_mode ===========
[13:24:13] =============== drm_test_check_valid_clones  ===============
[13:24:13] [PASSED] not_in_clone_mode
[13:24:13] [PASSED] valid_clone
[13:24:13] [PASSED] invalid_clone
[13:24:13] =========== [PASSED] drm_test_check_valid_clones ===========
[13:24:13] ============= [PASSED] drm_validate_clone_mode =============
[13:24:13] ============= drm_validate_modeset (1 subtest) =============
[13:24:13] [PASSED] drm_test_check_connector_changed_modeset
[13:24:13] ============== [PASSED] drm_validate_modeset ===============
[13:24:13] ====== drm_test_bridge_get_current_state (2 subtests) ======
[13:24:13] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[13:24:13] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[13:24:13] ======== [PASSED] drm_test_bridge_get_current_state ========
[13:24:13] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[13:24:13] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[13:24:13] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[13:24:13] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[13:24:13] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[13:24:13] ============== drm_bridge_alloc (2 subtests) ===============
[13:24:13] [PASSED] drm_test_drm_bridge_alloc_basic
[13:24:13] [PASSED] drm_test_drm_bridge_alloc_get_put
[13:24:13] ================ [PASSED] drm_bridge_alloc =================
[13:24:13] ================== drm_buddy (8 subtests) ==================
[13:24:13] [PASSED] drm_test_buddy_alloc_limit
[13:24:13] [PASSED] drm_test_buddy_alloc_optimistic
[13:24:13] [PASSED] drm_test_buddy_alloc_pessimistic
[13:24:13] [PASSED] drm_test_buddy_alloc_pathological
[13:24:13] [PASSED] drm_test_buddy_alloc_contiguous
[13:24:13] [PASSED] drm_test_buddy_alloc_clear
[13:24:13] [PASSED] drm_test_buddy_alloc_range_bias
[13:24:13] [PASSED] drm_test_buddy_fragmentation_performance
[13:24:13] ==================== [PASSED] drm_buddy ====================
[13:24:13] ============= drm_cmdline_parser (40 subtests) =============
[13:24:13] [PASSED] drm_test_cmdline_force_d_only
[13:24:13] [PASSED] drm_test_cmdline_force_D_only_dvi
[13:24:13] [PASSED] drm_test_cmdline_force_D_only_hdmi
[13:24:13] [PASSED] drm_test_cmdline_force_D_only_not_digital
[13:24:13] [PASSED] drm_test_cmdline_force_e_only
[13:24:13] [PASSED] drm_test_cmdline_res
[13:24:13] [PASSED] drm_test_cmdline_res_vesa
[13:24:13] [PASSED] drm_test_cmdline_res_vesa_rblank
[13:24:13] [PASSED] drm_test_cmdline_res_rblank
[13:24:13] [PASSED] drm_test_cmdline_res_bpp
[13:24:13] [PASSED] drm_test_cmdline_res_refresh
[13:24:13] [PASSED] drm_test_cmdline_res_bpp_refresh
[13:24:13] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[13:24:13] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[13:24:13] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[13:24:13] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[13:24:13] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[13:24:13] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[13:24:13] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[13:24:13] [PASSED] drm_test_cmdline_res_margins_force_on
[13:24:13] [PASSED] drm_test_cmdline_res_vesa_margins
[13:24:13] [PASSED] drm_test_cmdline_name
[13:24:13] [PASSED] drm_test_cmdline_name_bpp
[13:24:13] [PASSED] drm_test_cmdline_name_option
[13:24:13] [PASSED] drm_test_cmdline_name_bpp_option
[13:24:13] [PASSED] drm_test_cmdline_rotate_0
[13:24:13] [PASSED] drm_test_cmdline_rotate_90
[13:24:13] [PASSED] drm_test_cmdline_rotate_180
[13:24:13] [PASSED] drm_test_cmdline_rotate_270
[13:24:13] [PASSED] drm_test_cmdline_hmirror
[13:24:13] [PASSED] drm_test_cmdline_vmirror
[13:24:13] [PASSED] drm_test_cmdline_margin_options
[13:24:13] [PASSED] drm_test_cmdline_multiple_options
[13:24:13] [PASSED] drm_test_cmdline_bpp_extra_and_option
[13:24:13] [PASSED] drm_test_cmdline_extra_and_option
[13:24:13] [PASSED] drm_test_cmdline_freestanding_options
[13:24:13] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[13:24:13] [PASSED] drm_test_cmdline_panel_orientation
[13:24:13] ================ drm_test_cmdline_invalid  =================
[13:24:13] [PASSED] margin_only
[13:24:13] [PASSED] interlace_only
[13:24:13] [PASSED] res_missing_x
[13:24:13] [PASSED] res_missing_y
[13:24:13] [PASSED] res_bad_y
[13:24:13] [PASSED] res_missing_y_bpp
[13:24:13] [PASSED] res_bad_bpp
[13:24:13] [PASSED] res_bad_refresh
[13:24:13] [PASSED] res_bpp_refresh_force_on_off
[13:24:13] [PASSED] res_invalid_mode
[13:24:13] [PASSED] res_bpp_wrong_place_mode
[13:24:13] [PASSED] name_bpp_refresh
[13:24:13] [PASSED] name_refresh
[13:24:13] [PASSED] name_refresh_wrong_mode
[13:24:13] [PASSED] name_refresh_invalid_mode
[13:24:13] [PASSED] rotate_multiple
[13:24:13] [PASSED] rotate_invalid_val
[13:24:13] [PASSED] rotate_truncated
[13:24:13] [PASSED] invalid_option
[13:24:13] [PASSED] invalid_tv_option
[13:24:13] [PASSED] truncated_tv_option
[13:24:13] ============ [PASSED] drm_test_cmdline_invalid =============
[13:24:13] =============== drm_test_cmdline_tv_options  ===============
[13:24:13] [PASSED] NTSC
[13:24:13] [PASSED] NTSC_443
[13:24:13] [PASSED] NTSC_J
[13:24:13] [PASSED] PAL
[13:24:13] [PASSED] PAL_M
[13:24:13] [PASSED] PAL_N
[13:24:13] [PASSED] SECAM
[13:24:13] [PASSED] MONO_525
[13:24:13] [PASSED] MONO_625
[13:24:13] =========== [PASSED] drm_test_cmdline_tv_options ===========
[13:24:13] =============== [PASSED] drm_cmdline_parser ================
[13:24:13] ========== drmm_connector_hdmi_init (20 subtests) ==========
[13:24:13] [PASSED] drm_test_connector_hdmi_init_valid
[13:24:13] [PASSED] drm_test_connector_hdmi_init_bpc_8
[13:24:13] [PASSED] drm_test_connector_hdmi_init_bpc_10
[13:24:13] [PASSED] drm_test_connector_hdmi_init_bpc_12
[13:24:13] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[13:24:13] [PASSED] drm_test_connector_hdmi_init_bpc_null
[13:24:13] [PASSED] drm_test_connector_hdmi_init_formats_empty
[13:24:13] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[13:24:13] === drm_test_connector_hdmi_init_formats_yuv420_allowed  ===
[13:24:13] [PASSED] supported_formats=0x9 yuv420_allowed=1
[13:24:13] [PASSED] supported_formats=0x9 yuv420_allowed=0
[13:24:13] [PASSED] supported_formats=0x3 yuv420_allowed=1
[13:24:13] [PASSED] supported_formats=0x3 yuv420_allowed=0
[13:24:13] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[13:24:13] [PASSED] drm_test_connector_hdmi_init_null_ddc
[13:24:13] [PASSED] drm_test_connector_hdmi_init_null_product
[13:24:13] [PASSED] drm_test_connector_hdmi_init_null_vendor
[13:24:13] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[13:24:13] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[13:24:13] [PASSED] drm_test_connector_hdmi_init_product_valid
[13:24:13] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[13:24:13] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[13:24:13] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[13:24:13] ========= drm_test_connector_hdmi_init_type_valid  =========
[13:24:13] [PASSED] HDMI-A
[13:24:13] [PASSED] HDMI-B
[13:24:13] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[13:24:13] ======== drm_test_connector_hdmi_init_type_invalid  ========
[13:24:13] [PASSED] Unknown
[13:24:13] [PASSED] VGA
[13:24:13] [PASSED] DVI-I
[13:24:13] [PASSED] DVI-D
[13:24:13] [PASSED] DVI-A
[13:24:13] [PASSED] Composite
[13:24:13] [PASSED] SVIDEO
[13:24:13] [PASSED] LVDS
[13:24:13] [PASSED] Component
[13:24:13] [PASSED] DIN
[13:24:13] [PASSED] DP
[13:24:13] [PASSED] TV
[13:24:13] [PASSED] eDP
[13:24:13] [PASSED] Virtual
[13:24:13] [PASSED] DSI
[13:24:13] [PASSED] DPI
[13:24:13] [PASSED] Writeback
[13:24:13] [PASSED] SPI
[13:24:13] [PASSED] USB
[13:24:13] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[13:24:13] ============ [PASSED] drmm_connector_hdmi_init =============
[13:24:13] ============= drmm_connector_init (3 subtests) =============
[13:24:13] [PASSED] drm_test_drmm_connector_init
[13:24:13] [PASSED] drm_test_drmm_connector_init_null_ddc
[13:24:13] ========= drm_test_drmm_connector_init_type_valid  =========
[13:24:13] [PASSED] Unknown
[13:24:13] [PASSED] VGA
[13:24:13] [PASSED] DVI-I
[13:24:13] [PASSED] DVI-D
[13:24:13] [PASSED] DVI-A
[13:24:13] [PASSED] Composite
[13:24:13] [PASSED] SVIDEO
[13:24:13] [PASSED] LVDS
[13:24:13] [PASSED] Component
[13:24:13] [PASSED] DIN
[13:24:13] [PASSED] DP
[13:24:13] [PASSED] HDMI-A
[13:24:13] [PASSED] HDMI-B
[13:24:13] [PASSED] TV
[13:24:13] [PASSED] eDP
[13:24:13] [PASSED] Virtual
[13:24:13] [PASSED] DSI
[13:24:13] [PASSED] DPI
[13:24:13] [PASSED] Writeback
[13:24:13] [PASSED] SPI
[13:24:13] [PASSED] USB
[13:24:13] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[13:24:13] =============== [PASSED] drmm_connector_init ===============
[13:24:13] ========= drm_connector_dynamic_init (6 subtests) ==========
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_init
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_init_properties
[13:24:13] ===== drm_test_drm_connector_dynamic_init_type_valid  ======
[13:24:13] [PASSED] Unknown
[13:24:13] [PASSED] VGA
[13:24:13] [PASSED] DVI-I
[13:24:13] [PASSED] DVI-D
[13:24:13] [PASSED] DVI-A
[13:24:13] [PASSED] Composite
[13:24:13] [PASSED] SVIDEO
[13:24:13] [PASSED] LVDS
[13:24:13] [PASSED] Component
[13:24:13] [PASSED] DIN
[13:24:13] [PASSED] DP
[13:24:13] [PASSED] HDMI-A
[13:24:13] [PASSED] HDMI-B
[13:24:13] [PASSED] TV
[13:24:13] [PASSED] eDP
[13:24:13] [PASSED] Virtual
[13:24:13] [PASSED] DSI
[13:24:13] [PASSED] DPI
[13:24:13] [PASSED] Writeback
[13:24:13] [PASSED] SPI
[13:24:13] [PASSED] USB
[13:24:13] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[13:24:13] ======== drm_test_drm_connector_dynamic_init_name  =========
[13:24:13] [PASSED] Unknown
[13:24:13] [PASSED] VGA
[13:24:13] [PASSED] DVI-I
[13:24:13] [PASSED] DVI-D
[13:24:13] [PASSED] DVI-A
[13:24:13] [PASSED] Composite
[13:24:13] [PASSED] SVIDEO
[13:24:13] [PASSED] LVDS
[13:24:13] [PASSED] Component
[13:24:13] [PASSED] DIN
[13:24:13] [PASSED] DP
[13:24:13] [PASSED] HDMI-A
[13:24:13] [PASSED] HDMI-B
[13:24:13] [PASSED] TV
[13:24:13] [PASSED] eDP
[13:24:13] [PASSED] Virtual
[13:24:13] [PASSED] DSI
[13:24:13] [PASSED] DPI
[13:24:13] [PASSED] Writeback
[13:24:13] [PASSED] SPI
[13:24:13] [PASSED] USB
[13:24:13] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[13:24:13] =========== [PASSED] drm_connector_dynamic_init ============
[13:24:13] ==== drm_connector_dynamic_register_early (4 subtests) =====
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[13:24:13] ====== [PASSED] drm_connector_dynamic_register_early =======
[13:24:13] ======= drm_connector_dynamic_register (7 subtests) ========
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[13:24:13] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[13:24:13] ========= [PASSED] drm_connector_dynamic_register ==========
[13:24:13] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[13:24:13] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[13:24:13] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[13:24:13] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[13:24:13] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[13:24:13] ========== drm_test_get_tv_mode_from_name_valid  ===========
[13:24:13] [PASSED] NTSC
[13:24:13] [PASSED] NTSC-443
[13:24:13] [PASSED] NTSC-J
[13:24:13] [PASSED] PAL
[13:24:13] [PASSED] PAL-M
[13:24:13] [PASSED] PAL-N
[13:24:13] [PASSED] SECAM
[13:24:13] [PASSED] Mono
[13:24:13] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[13:24:13] [PASSED] drm_test_get_tv_mode_from_name_truncated
[13:24:13] ============ [PASSED] drm_get_tv_mode_from_name ============
[13:24:13] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[13:24:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[13:24:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[13:24:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[13:24:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[13:24:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[13:24:13] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[13:24:13] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid  =
[13:24:13] [PASSED] VIC 96
[13:24:13] [PASSED] VIC 97
[13:24:13] [PASSED] VIC 101
[13:24:13] [PASSED] VIC 102
[13:24:13] [PASSED] VIC 106
[13:24:13] [PASSED] VIC 107
[13:24:13] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[13:24:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[13:24:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[13:24:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[13:24:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[13:24:13] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[13:24:13] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[13:24:13] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[13:24:13] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name  ====
[13:24:13] [PASSED] Automatic
[13:24:13] [PASSED] Full
[13:24:13] [PASSED] Limited 16:235
[13:24:13] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[13:24:13] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[13:24:13] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[13:24:13] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[13:24:13] === drm_test_drm_hdmi_connector_get_output_format_name  ====
[13:24:13] [PASSED] RGB
[13:24:13] [PASSED] YUV 4:2:0
[13:24:13] [PASSED] YUV 4:2:2
[13:24:13] [PASSED] YUV 4:4:4
[13:24:13] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[13:24:13] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[13:24:13] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[13:24:13] ============= drm_damage_helper (21 subtests) ==============
[13:24:13] [PASSED] drm_test_damage_iter_no_damage
[13:24:13] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[13:24:13] [PASSED] drm_test_damage_iter_no_damage_src_moved
[13:24:13] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[13:24:13] [PASSED] drm_test_damage_iter_no_damage_not_visible
[13:24:13] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[13:24:13] [PASSED] drm_test_damage_iter_no_damage_no_fb
[13:24:13] [PASSED] drm_test_damage_iter_simple_damage
[13:24:13] [PASSED] drm_test_damage_iter_single_damage
[13:24:13] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[13:24:13] [PASSED] drm_test_damage_iter_single_damage_outside_src
[13:24:13] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[13:24:13] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[13:24:13] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[13:24:13] [PASSED] drm_test_damage_iter_single_damage_src_moved
[13:24:13] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[13:24:13] [PASSED] drm_test_damage_iter_damage
[13:24:13] [PASSED] drm_test_damage_iter_damage_one_intersect
[13:24:13] [PASSED] drm_test_damage_iter_damage_one_outside
[13:24:13] [PASSED] drm_test_damage_iter_damage_src_moved
[13:24:13] [PASSED] drm_test_damage_iter_damage_not_visible
[13:24:13] ================ [PASSED] drm_damage_helper ================
[13:24:13] ============== drm_dp_mst_helper (3 subtests) ==============
[13:24:13] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[13:24:13] [PASSED] Clock 154000 BPP 30 DSC disabled
[13:24:13] [PASSED] Clock 234000 BPP 30 DSC disabled
[13:24:13] [PASSED] Clock 297000 BPP 24 DSC disabled
[13:24:13] [PASSED] Clock 332880 BPP 24 DSC enabled
[13:24:13] [PASSED] Clock 324540 BPP 24 DSC enabled
[13:24:13] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[13:24:13] ============== drm_test_dp_mst_calc_pbn_div  ===============
[13:24:13] [PASSED] Link rate 2000000 lane count 4
[13:24:13] [PASSED] Link rate 2000000 lane count 2
[13:24:13] [PASSED] Link rate 2000000 lane count 1
[13:24:13] [PASSED] Link rate 1350000 lane count 4
[13:24:13] [PASSED] Link rate 1350000 lane count 2
[13:24:13] [PASSED] Link rate 1350000 lane count 1
[13:24:13] [PASSED] Link rate 1000000 lane count 4
[13:24:13] [PASSED] Link rate 1000000 lane count 2
[13:24:13] [PASSED] Link rate 1000000 lane count 1
[13:24:13] [PASSED] Link rate 810000 lane count 4
[13:24:13] [PASSED] Link rate 810000 lane count 2
[13:24:13] [PASSED] Link rate 810000 lane count 1
[13:24:13] [PASSED] Link rate 540000 lane count 4
[13:24:13] [PASSED] Link rate 540000 lane count 2
[13:24:13] [PASSED] Link rate 540000 lane count 1
[13:24:13] [PASSED] Link rate 270000 lane count 4
[13:24:13] [PASSED] Link rate 270000 lane count 2
[13:24:13] [PASSED] Link rate 270000 lane count 1
[13:24:13] [PASSED] Link rate 162000 lane count 4
[13:24:13] [PASSED] Link rate 162000 lane count 2
[13:24:13] [PASSED] Link rate 162000 lane count 1
[13:24:13] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[13:24:13] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[13:24:13] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[13:24:13] [PASSED] DP_POWER_UP_PHY with port number
[13:24:13] [PASSED] DP_POWER_DOWN_PHY with port number
[13:24:13] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[13:24:13] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[13:24:13] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[13:24:13] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[13:24:13] [PASSED] DP_QUERY_PAYLOAD with port number
[13:24:13] [PASSED] DP_QUERY_PAYLOAD with VCPI
[13:24:13] [PASSED] DP_REMOTE_DPCD_READ with port number
[13:24:13] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[13:24:13] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[13:24:13] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[13:24:13] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[13:24:13] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[13:24:13] [PASSED] DP_REMOTE_I2C_READ with port number
[13:24:13] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[13:24:13] [PASSED] DP_REMOTE_I2C_READ with transactions array
[13:24:13] [PASSED] DP_REMOTE_I2C_WRITE with port number
[13:24:13] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[13:24:13] [PASSED] DP_REMOTE_I2C_WRITE with data array
[13:24:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[13:24:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[13:24:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[13:24:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[13:24:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[13:24:13] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[13:24:13] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[13:24:13] ================ [PASSED] drm_dp_mst_helper ================
[13:24:13] ================== drm_exec (7 subtests) ===================
[13:24:13] [PASSED] sanitycheck
[13:24:13] [PASSED] test_lock
[13:24:13] [PASSED] test_lock_unlock
[13:24:13] [PASSED] test_duplicates
[13:24:13] [PASSED] test_prepare
[13:24:13] [PASSED] test_prepare_array
[13:24:13] [PASSED] test_multiple_loops
[13:24:13] ==================== [PASSED] drm_exec =====================
[13:24:13] =========== drm_format_helper_test (17 subtests) ===========
[13:24:13] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[13:24:13] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[13:24:13] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[13:24:13] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[13:24:13] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[13:24:13] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[13:24:13] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[13:24:13] ============= drm_test_fb_xrgb8888_to_bgr888  ==============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[13:24:13] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[13:24:13] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[13:24:13] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[13:24:13] ============== drm_test_fb_xrgb8888_to_mono  ===============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[13:24:13] ==================== drm_test_fb_swab  =====================
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ================ [PASSED] drm_test_fb_swab =================
[13:24:13] ============ drm_test_fb_xrgb8888_to_xbgr8888  =============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[13:24:13] ============ drm_test_fb_xrgb8888_to_abgr8888  =============
[13:24:13] [PASSED] single_pixel_source_buffer
[13:24:13] [PASSED] single_pixel_clip_rectangle
[13:24:13] [PASSED] well_known_colors
[13:24:13] [PASSED] destination_pitch
[13:24:13] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[13:24:13] ================= drm_test_fb_clip_offset  =================
[13:24:13] [PASSED] pass through
[13:24:13] [PASSED] horizontal offset
[13:24:13] [PASSED] vertical offset
[13:24:13] [PASSED] horizontal and vertical offset
[13:24:13] [PASSED] horizontal offset (custom pitch)
[13:24:13] [PASSED] vertical offset (custom pitch)
[13:24:13] [PASSED] horizontal and vertical offset (custom pitch)
[13:24:13] ============= [PASSED] drm_test_fb_clip_offset =============
[13:24:13] =================== drm_test_fb_memcpy  ====================
[13:24:13] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[13:24:13] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[13:24:13] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[13:24:13] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[13:24:13] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[13:24:13] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[13:24:13] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[13:24:13] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[13:24:13] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[13:24:13] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[13:24:13] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[13:24:13] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[13:24:13] =============== [PASSED] drm_test_fb_memcpy ================
[13:24:13] ============= [PASSED] drm_format_helper_test ==============
[13:24:13] ================= drm_format (18 subtests) =================
[13:24:13] [PASSED] drm_test_format_block_width_invalid
[13:24:13] [PASSED] drm_test_format_block_width_one_plane
[13:24:13] [PASSED] drm_test_format_block_width_two_plane
[13:24:13] [PASSED] drm_test_format_block_width_three_plane
[13:24:13] [PASSED] drm_test_format_block_width_tiled
[13:24:13] [PASSED] drm_test_format_block_height_invalid
[13:24:13] [PASSED] drm_test_format_block_height_one_plane
[13:24:13] [PASSED] drm_test_format_block_height_two_plane
[13:24:13] [PASSED] drm_test_format_block_height_three_plane
[13:24:13] [PASSED] drm_test_format_block_height_tiled
[13:24:13] [PASSED] drm_test_format_min_pitch_invalid
[13:24:13] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[13:24:13] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[13:24:13] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[13:24:13] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[13:24:13] [PASSED] drm_test_format_min_pitch_two_plane
[13:24:13] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[13:24:13] [PASSED] drm_test_format_min_pitch_tiled
[13:24:13] =================== [PASSED] drm_format ====================
[13:24:13] ============== drm_framebuffer (10 subtests) ===============
[13:24:13] ========== drm_test_framebuffer_check_src_coords  ==========
[13:24:13] [PASSED] Success: source fits into fb
[13:24:13] [PASSED] Fail: overflowing fb with x-axis coordinate
[13:24:13] [PASSED] Fail: overflowing fb with y-axis coordinate
[13:24:13] [PASSED] Fail: overflowing fb with source width
[13:24:13] [PASSED] Fail: overflowing fb with source height
[13:24:13] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[13:24:13] [PASSED] drm_test_framebuffer_cleanup
[13:24:13] =============== drm_test_framebuffer_create  ===============
[13:24:13] [PASSED] ABGR8888 normal sizes
[13:24:13] [PASSED] ABGR8888 max sizes
[13:24:13] [PASSED] ABGR8888 pitch greater than min required
[13:24:13] [PASSED] ABGR8888 pitch less than min required
[13:24:13] [PASSED] ABGR8888 Invalid width
[13:24:13] [PASSED] ABGR8888 Invalid buffer handle
[13:24:13] [PASSED] No pixel format
[13:24:13] [PASSED] ABGR8888 Width 0
[13:24:13] [PASSED] ABGR8888 Height 0
[13:24:13] [PASSED] ABGR8888 Out of bound height * pitch combination
[13:24:13] [PASSED] ABGR8888 Large buffer offset
[13:24:13] [PASSED] ABGR8888 Buffer offset for inexistent plane
[13:24:13] [PASSED] ABGR8888 Invalid flag
[13:24:13] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[13:24:13] [PASSED] ABGR8888 Valid buffer modifier
[13:24:13] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[13:24:13] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[13:24:13] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[13:24:13] [PASSED] NV12 Normal sizes
[13:24:13] [PASSED] NV12 Max sizes
[13:24:13] [PASSED] NV12 Invalid pitch
[13:24:13] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[13:24:13] [PASSED] NV12 different  modifier per-plane
[13:24:13] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[13:24:13] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[13:24:13] [PASSED] NV12 Modifier for inexistent plane
[13:24:13] [PASSED] NV12 Handle for inexistent plane
[13:24:13] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[13:24:13] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[13:24:13] [PASSED] YVU420 Normal sizes
[13:24:13] [PASSED] YVU420 Max sizes
[13:24:13] [PASSED] YVU420 Invalid pitch
[13:24:13] [PASSED] YVU420 Different pitches
[13:24:13] [PASSED] YVU420 Different buffer offsets/pitches
[13:24:13] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[13:24:13] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[13:24:13] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[13:24:13] [PASSED] YVU420 Valid modifier
[13:24:13] [PASSED] YVU420 Different modifiers per plane
[13:24:13] [PASSED] YVU420 Modifier for inexistent plane
[13:24:13] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[13:24:13] [PASSED] X0L2 Normal sizes
[13:24:13] [PASSED] X0L2 Max sizes
[13:24:13] [PASSED] X0L2 Invalid pitch
[13:24:13] [PASSED] X0L2 Pitch greater than minimum required
[13:24:13] [PASSED] X0L2 Handle for inexistent plane
[13:24:13] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[13:24:13] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[13:24:13] [PASSED] X0L2 Valid modifier
[13:24:13] [PASSED] X0L2 Modifier for inexistent plane
[13:24:13] =========== [PASSED] drm_test_framebuffer_create ===========
[13:24:13] [PASSED] drm_test_framebuffer_free
[13:24:13] [PASSED] drm_test_framebuffer_init
[13:24:13] [PASSED] drm_test_framebuffer_init_bad_format
[13:24:13] [PASSED] drm_test_framebuffer_init_dev_mismatch
[13:24:13] [PASSED] drm_test_framebuffer_lookup
[13:24:13] [PASSED] drm_test_framebuffer_lookup_inexistent
[13:24:13] [PASSED] drm_test_framebuffer_modifiers_not_supported
[13:24:13] ================= [PASSED] drm_framebuffer =================
[13:24:13] ================ drm_gem_shmem (8 subtests) ================
[13:24:13] [PASSED] drm_gem_shmem_test_obj_create
[13:24:13] [PASSED] drm_gem_shmem_test_obj_create_private
[13:24:13] [PASSED] drm_gem_shmem_test_pin_pages
[13:24:13] [PASSED] drm_gem_shmem_test_vmap
[13:24:13] [PASSED] drm_gem_shmem_test_get_pages_sgt
[13:24:13] [PASSED] drm_gem_shmem_test_get_sg_table
[13:24:13] [PASSED] drm_gem_shmem_test_madvise
[13:24:13] [PASSED] drm_gem_shmem_test_purge
[13:24:13] ================== [PASSED] drm_gem_shmem ==================
[13:24:13] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[13:24:13] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420  =======
[13:24:13] [PASSED] Automatic
[13:24:13] [PASSED] Full
[13:24:13] [PASSED] Limited 16:235
[13:24:13] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[13:24:13] [PASSED] drm_test_check_disable_connector
[13:24:13] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[13:24:13] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[13:24:13] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[13:24:13] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[13:24:13] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[13:24:13] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[13:24:13] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[13:24:13] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[13:24:13] [PASSED] drm_test_check_output_bpc_dvi
[13:24:13] [PASSED] drm_test_check_output_bpc_format_vic_1
[13:24:13] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[13:24:13] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[13:24:13] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[13:24:13] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[13:24:13] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[13:24:13] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[13:24:13] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[13:24:13] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[13:24:13] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[13:24:13] [PASSED] drm_test_check_broadcast_rgb_value
[13:24:13] [PASSED] drm_test_check_bpc_8_value
[13:24:13] [PASSED] drm_test_check_bpc_10_value
[13:24:13] [PASSED] drm_test_check_bpc_12_value
[13:24:13] [PASSED] drm_test_check_format_value
[13:24:13] [PASSED] drm_test_check_tmds_char_value
[13:24:13] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[13:24:13] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[13:24:13] [PASSED] drm_test_check_mode_valid
[13:24:13] [PASSED] drm_test_check_mode_valid_reject
[13:24:13] [PASSED] drm_test_check_mode_valid_reject_rate
[13:24:13] [PASSED] drm_test_check_mode_valid_reject_max_clock
[13:24:13] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[13:24:13] ================= drm_managed (2 subtests) =================
[13:24:13] [PASSED] drm_test_managed_release_action
[13:24:13] [PASSED] drm_test_managed_run_action
[13:24:13] =================== [PASSED] drm_managed ===================
[13:24:13] =================== drm_mm (6 subtests) ====================
[13:24:13] [PASSED] drm_test_mm_init
[13:24:13] [PASSED] drm_test_mm_debug
[13:24:13] [PASSED] drm_test_mm_align32
[13:24:13] [PASSED] drm_test_mm_align64
[13:24:13] [PASSED] drm_test_mm_lowest
[13:24:13] [PASSED] drm_test_mm_highest
[13:24:13] ===================== [PASSED] drm_mm ======================
[13:24:13] ============= drm_modes_analog_tv (5 subtests) =============
[13:24:13] [PASSED] drm_test_modes_analog_tv_mono_576i
[13:24:13] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[13:24:13] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[13:24:13] [PASSED] drm_test_modes_analog_tv_pal_576i
[13:24:13] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[13:24:13] =============== [PASSED] drm_modes_analog_tv ===============
[13:24:13] ============== drm_plane_helper (2 subtests) ===============
[13:24:13] =============== drm_test_check_plane_state  ================
[13:24:13] [PASSED] clipping_simple
[13:24:13] [PASSED] clipping_rotate_reflect
[13:24:13] [PASSED] positioning_simple
[13:24:13] [PASSED] upscaling
[13:24:13] [PASSED] downscaling
[13:24:13] [PASSED] rounding1
[13:24:13] [PASSED] rounding2
[13:24:13] [PASSED] rounding3
[13:24:13] [PASSED] rounding4
[13:24:13] =========== [PASSED] drm_test_check_plane_state ============
[13:24:13] =========== drm_test_check_invalid_plane_state  ============
[13:24:13] [PASSED] positioning_invalid
[13:24:13] [PASSED] upscaling_invalid
[13:24:13] [PASSED] downscaling_invalid
[13:24:13] ======= [PASSED] drm_test_check_invalid_plane_state ========
[13:24:13] ================ [PASSED] drm_plane_helper =================
[13:24:13] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[13:24:13] ====== drm_test_connector_helper_tv_get_modes_check  =======
[13:24:13] [PASSED] None
[13:24:13] [PASSED] PAL
[13:24:13] [PASSED] NTSC
[13:24:13] [PASSED] Both, NTSC Default
[13:24:13] [PASSED] Both, PAL Default
[13:24:13] [PASSED] Both, NTSC Default, with PAL on command-line
[13:24:13] [PASSED] Both, PAL Default, with NTSC on command-line
[13:24:13] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[13:24:13] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[13:24:13] ================== drm_rect (9 subtests) ===================
[13:24:13] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[13:24:13] [PASSED] drm_test_rect_clip_scaled_not_clipped
[13:24:13] [PASSED] drm_test_rect_clip_scaled_clipped
[13:24:13] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[13:24:13] ================= drm_test_rect_intersect  =================
[13:24:13] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[13:24:13] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[13:24:13] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[13:24:13] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[13:24:13] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[13:24:13] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[13:24:13] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[13:24:13] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[13:24:13] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[13:24:13] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[13:24:13] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[13:24:13] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[13:24:13] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[13:24:13] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[13:24:13] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[13:24:13] ============= [PASSED] drm_test_rect_intersect =============
[13:24:13] ================ drm_test_rect_calc_hscale  ================
[13:24:13] [PASSED] normal use
[13:24:13] [PASSED] out of max range
[13:24:13] [PASSED] out of min range
[13:24:13] [PASSED] zero dst
[13:24:13] [PASSED] negative src
[13:24:13] [PASSED] negative dst
[13:24:13] ============ [PASSED] drm_test_rect_calc_hscale ============
[13:24:13] ================ drm_test_rect_calc_vscale  ================
[13:24:13] [PASSED] normal use
stty: 'standard input': Inappropriate ioctl for device
[13:24:13] [PASSED] out of max range
[13:24:13] [PASSED] out of min range
[13:24:13] [PASSED] zero dst
[13:24:13] [PASSED] negative src
[13:24:13] [PASSED] negative dst
[13:24:13] ============ [PASSED] drm_test_rect_calc_vscale ============
[13:24:13] ================== drm_test_rect_rotate  ===================
[13:24:13] [PASSED] reflect-x
[13:24:13] [PASSED] reflect-y
[13:24:13] [PASSED] rotate-0
[13:24:13] [PASSED] rotate-90
[13:24:13] [PASSED] rotate-180
[13:24:13] [PASSED] rotate-270
[13:24:13] ============== [PASSED] drm_test_rect_rotate ===============
[13:24:13] ================ drm_test_rect_rotate_inv  =================
[13:24:13] [PASSED] reflect-x
[13:24:13] [PASSED] reflect-y
[13:24:13] [PASSED] rotate-0
[13:24:13] [PASSED] rotate-90
[13:24:13] [PASSED] rotate-180
[13:24:13] [PASSED] rotate-270
[13:24:13] ============ [PASSED] drm_test_rect_rotate_inv =============
[13:24:13] ==================== [PASSED] drm_rect =====================
[13:24:13] ============ drm_sysfb_modeset_test (1 subtest) ============
[13:24:13] ============ drm_test_sysfb_build_fourcc_list  =============
[13:24:13] [PASSED] no native formats
[13:24:13] [PASSED] XRGB8888 as native format
[13:24:13] [PASSED] remove duplicates
[13:24:13] [PASSED] convert alpha formats
[13:24:13] [PASSED] random formats
[13:24:13] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[13:24:13] ============= [PASSED] drm_sysfb_modeset_test ==============
[13:24:13] ============================================================
[13:24:13] Testing complete. Ran 622 tests: passed: 622
[13:24:13] Elapsed time: 27.142s total, 1.691s configuring, 24.984s building, 0.441s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[13:24:13] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:24:15] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:24:24] Starting KUnit Kernel (1/1)...
[13:24:24] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:24:25] ================= ttm_device (5 subtests) ==================
[13:24:25] [PASSED] ttm_device_init_basic
[13:24:25] [PASSED] ttm_device_init_multiple
[13:24:25] [PASSED] ttm_device_fini_basic
[13:24:25] [PASSED] ttm_device_init_no_vma_man
[13:24:25] ================== ttm_device_init_pools  ==================
[13:24:25] [PASSED] No DMA allocations, no DMA32 required
[13:24:25] [PASSED] DMA allocations, DMA32 required
[13:24:25] [PASSED] No DMA allocations, DMA32 required
[13:24:25] [PASSED] DMA allocations, no DMA32 required
[13:24:25] ============== [PASSED] ttm_device_init_pools ==============
[13:24:25] =================== [PASSED] ttm_device ====================
[13:24:25] ================== ttm_pool (8 subtests) ===================
[13:24:25] ================== ttm_pool_alloc_basic  ===================
[13:24:25] [PASSED] One page
[13:24:25] [PASSED] More than one page
[13:24:25] [PASSED] Above the allocation limit
[13:24:25] [PASSED] One page, with coherent DMA mappings enabled
[13:24:25] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[13:24:25] ============== [PASSED] ttm_pool_alloc_basic ===============
[13:24:25] ============== ttm_pool_alloc_basic_dma_addr  ==============
[13:24:25] [PASSED] One page
[13:24:25] [PASSED] More than one page
[13:24:25] [PASSED] Above the allocation limit
[13:24:25] [PASSED] One page, with coherent DMA mappings enabled
[13:24:25] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[13:24:25] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[13:24:25] [PASSED] ttm_pool_alloc_order_caching_match
[13:24:25] [PASSED] ttm_pool_alloc_caching_mismatch
[13:24:25] [PASSED] ttm_pool_alloc_order_mismatch
[13:24:25] [PASSED] ttm_pool_free_dma_alloc
[13:24:25] [PASSED] ttm_pool_free_no_dma_alloc
[13:24:25] [PASSED] ttm_pool_fini_basic
[13:24:25] ==================== [PASSED] ttm_pool =====================
[13:24:25] ================ ttm_resource (8 subtests) =================
[13:24:25] ================= ttm_resource_init_basic  =================
[13:24:25] [PASSED] Init resource in TTM_PL_SYSTEM
[13:24:25] [PASSED] Init resource in TTM_PL_VRAM
[13:24:25] [PASSED] Init resource in a private placement
[13:24:25] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[13:24:25] ============= [PASSED] ttm_resource_init_basic =============
[13:24:25] [PASSED] ttm_resource_init_pinned
[13:24:25] [PASSED] ttm_resource_fini_basic
[13:24:25] [PASSED] ttm_resource_manager_init_basic
[13:24:25] [PASSED] ttm_resource_manager_usage_basic
[13:24:25] [PASSED] ttm_resource_manager_set_used_basic
[13:24:25] [PASSED] ttm_sys_man_alloc_basic
[13:24:25] [PASSED] ttm_sys_man_free_basic
[13:24:25] ================== [PASSED] ttm_resource ===================
[13:24:25] =================== ttm_tt (15 subtests) ===================
[13:24:25] ==================== ttm_tt_init_basic  ====================
[13:24:25] [PASSED] Page-aligned size
[13:24:25] [PASSED] Extra pages requested
[13:24:25] ================ [PASSED] ttm_tt_init_basic ================
[13:24:25] [PASSED] ttm_tt_init_misaligned
[13:24:25] [PASSED] ttm_tt_fini_basic
[13:24:25] [PASSED] ttm_tt_fini_sg
[13:24:25] [PASSED] ttm_tt_fini_shmem
[13:24:25] [PASSED] ttm_tt_create_basic
[13:24:25] [PASSED] ttm_tt_create_invalid_bo_type
[13:24:25] [PASSED] ttm_tt_create_ttm_exists
[13:24:25] [PASSED] ttm_tt_create_failed
[13:24:25] [PASSED] ttm_tt_destroy_basic
[13:24:25] [PASSED] ttm_tt_populate_null_ttm
[13:24:25] [PASSED] ttm_tt_populate_populated_ttm
[13:24:25] [PASSED] ttm_tt_unpopulate_basic
[13:24:25] [PASSED] ttm_tt_unpopulate_empty_ttm
[13:24:25] [PASSED] ttm_tt_swapin_basic
[13:24:25] ===================== [PASSED] ttm_tt ======================
[13:24:25] =================== ttm_bo (14 subtests) ===================
[13:24:25] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[13:24:25] [PASSED] Cannot be interrupted and sleeps
[13:24:25] [PASSED] Cannot be interrupted, locks straight away
[13:24:25] [PASSED] Can be interrupted, sleeps
[13:24:25] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[13:24:25] [PASSED] ttm_bo_reserve_locked_no_sleep
[13:24:25] [PASSED] ttm_bo_reserve_no_wait_ticket
[13:24:25] [PASSED] ttm_bo_reserve_double_resv
[13:24:25] [PASSED] ttm_bo_reserve_interrupted
[13:24:25] [PASSED] ttm_bo_reserve_deadlock
[13:24:25] [PASSED] ttm_bo_unreserve_basic
[13:24:25] [PASSED] ttm_bo_unreserve_pinned
[13:24:25] [PASSED] ttm_bo_unreserve_bulk
[13:24:25] [PASSED] ttm_bo_fini_basic
[13:24:25] [PASSED] ttm_bo_fini_shared_resv
[13:24:25] [PASSED] ttm_bo_pin_basic
[13:24:25] [PASSED] ttm_bo_pin_unpin_resource
[13:24:25] [PASSED] ttm_bo_multiple_pin_one_unpin
[13:24:25] ===================== [PASSED] ttm_bo ======================
[13:24:25] ============== ttm_bo_validate (21 subtests) ===============
[13:24:25] ============== ttm_bo_init_reserved_sys_man  ===============
[13:24:25] [PASSED] Buffer object for userspace
[13:24:25] [PASSED] Kernel buffer object
[13:24:25] [PASSED] Shared buffer object
[13:24:25] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[13:24:25] ============== ttm_bo_init_reserved_mock_man  ==============
[13:24:25] [PASSED] Buffer object for userspace
[13:24:25] [PASSED] Kernel buffer object
[13:24:25] [PASSED] Shared buffer object
[13:24:25] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[13:24:25] [PASSED] ttm_bo_init_reserved_resv
[13:24:25] ================== ttm_bo_validate_basic  ==================
[13:24:25] [PASSED] Buffer object for userspace
[13:24:25] [PASSED] Kernel buffer object
[13:24:25] [PASSED] Shared buffer object
[13:24:25] ============== [PASSED] ttm_bo_validate_basic ==============
[13:24:25] [PASSED] ttm_bo_validate_invalid_placement
[13:24:25] ============= ttm_bo_validate_same_placement  ==============
[13:24:25] [PASSED] System manager
[13:24:25] [PASSED] VRAM manager
[13:24:25] ========= [PASSED] ttm_bo_validate_same_placement ==========
[13:24:25] [PASSED] ttm_bo_validate_failed_alloc
[13:24:25] [PASSED] ttm_bo_validate_pinned
[13:24:25] [PASSED] ttm_bo_validate_busy_placement
[13:24:25] ================ ttm_bo_validate_multihop  =================
[13:24:25] [PASSED] Buffer object for userspace
[13:24:25] [PASSED] Kernel buffer object
[13:24:25] [PASSED] Shared buffer object
[13:24:25] ============ [PASSED] ttm_bo_validate_multihop =============
[13:24:25] ========== ttm_bo_validate_no_placement_signaled  ==========
[13:24:25] [PASSED] Buffer object in system domain, no page vector
[13:24:25] [PASSED] Buffer object in system domain with an existing page vector
[13:24:25] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[13:24:25] ======== ttm_bo_validate_no_placement_not_signaled  ========
[13:24:25] [PASSED] Buffer object for userspace
[13:24:25] [PASSED] Kernel buffer object
[13:24:25] [PASSED] Shared buffer object
[13:24:25] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[13:24:25] [PASSED] ttm_bo_validate_move_fence_signaled
[13:24:25] ========= ttm_bo_validate_move_fence_not_signaled  =========
[13:24:25] [PASSED] Waits for GPU
[13:24:25] [PASSED] Tries to lock straight away
[13:24:25] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[13:24:25] [PASSED] ttm_bo_validate_happy_evict
[13:24:25] [PASSED] ttm_bo_validate_all_pinned_evict
[13:24:25] [PASSED] ttm_bo_validate_allowed_only_evict
[13:24:25] [PASSED] ttm_bo_validate_deleted_evict
[13:24:25] [PASSED] ttm_bo_validate_busy_domain_evict
[13:24:25] [PASSED] ttm_bo_validate_evict_gutting
[13:24:25] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[13:24:25] ================= [PASSED] ttm_bo_validate =================
[13:24:25] ============================================================
[13:24:25] Testing complete. Ran 101 tests: passed: 101
[13:24:25] Elapsed time: 11.269s total, 1.709s configuring, 9.344s building, 0.186s running

+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



^ permalink raw reply	[flat|nested] 22+ messages in thread

* ✗ Xe.CI.BAT: failure for drm/xe/madvise: Add support for purgeable buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (11 preceding siblings ...)
  2025-10-28 13:24 ` ✓ CI.KUnit: success " Patchwork
@ 2025-10-28 14:12 ` Patchwork
  2025-10-28 19:44 ` ✗ Xe.CI.Full: " Patchwork
  13 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-10-28 14:12 UTC (permalink / raw)
  To: Arvind Yadav; +Cc: intel-xe

[-- Attachment #1: Type: text/plain, Size: 6237 bytes --]

== Series Details ==

Series: drm/xe/madvise: Add support for purgeable buffer objects
URL   : https://patchwork.freedesktop.org/series/156651/
State : failure

== Summary ==

CI Bug Log - changes from xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc_BAT -> xe-pw-156651v1_BAT
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with xe-pw-156651v1_BAT absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in xe-pw-156651v1_BAT, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

Participating hosts (13 -> 13)
------------------------------

  No changes in participating hosts

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in xe-pw-156651v1_BAT:

### IGT changes ###

#### Possible regressions ####

  * igt@xe_create@create-massive-size:
    - bat-bmg-2:          [PASS][1] -> [ABORT][2]
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-bmg-2/igt@xe_create@create-massive-size.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-bmg-2/igt@xe_create@create-massive-size.html
    - bat-adlp-7:         [PASS][3] -> [ABORT][4]
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-adlp-7/igt@xe_create@create-massive-size.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-adlp-7/igt@xe_create@create-massive-size.html
    - bat-bmg-1:          [PASS][5] -> [ABORT][6]
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-bmg-1/igt@xe_create@create-massive-size.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-bmg-1/igt@xe_create@create-massive-size.html
    - bat-lnl-2:          [PASS][7] -> [ABORT][8]
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-lnl-2/igt@xe_create@create-massive-size.html
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-lnl-2/igt@xe_create@create-massive-size.html
    - bat-ptl-2:          [PASS][9] -> [ABORT][10]
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-ptl-2/igt@xe_create@create-massive-size.html
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-ptl-2/igt@xe_create@create-massive-size.html
    - bat-atsm-2:         [PASS][11] -> [ABORT][12]
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-atsm-2/igt@xe_create@create-massive-size.html
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-atsm-2/igt@xe_create@create-massive-size.html
    - bat-adlp-vm:        [PASS][13] -> [ABORT][14]
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-adlp-vm/igt@xe_create@create-massive-size.html
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-adlp-vm/igt@xe_create@create-massive-size.html
    - bat-ptl-1:          [PASS][15] -> [ABORT][16]
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-ptl-1/igt@xe_create@create-massive-size.html
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-ptl-1/igt@xe_create@create-massive-size.html
    - bat-lnl-1:          [PASS][17] -> [ABORT][18]
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-lnl-1/igt@xe_create@create-massive-size.html
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-lnl-1/igt@xe_create@create-massive-size.html
    - bat-pvc-2:          [PASS][19] -> [ABORT][20]
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-pvc-2/igt@xe_create@create-massive-size.html
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-pvc-2/igt@xe_create@create-massive-size.html
    - bat-ptl-vm:         [PASS][21] -> [ABORT][22]
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-ptl-vm/igt@xe_create@create-massive-size.html
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-ptl-vm/igt@xe_create@create-massive-size.html

  * igt@xe_create@multigpu-create-massive-size:
    - bat-bmg-3:          [PASS][23] -> [ABORT][24]
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-bmg-3/igt@xe_create@multigpu-create-massive-size.html
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-bmg-3/igt@xe_create@multigpu-create-massive-size.html

  * igt@xe_module_load@load:
    - bat-dg2-oem2:       [PASS][25] -> [ABORT][26]
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-dg2-oem2/igt@xe_module_load@load.html
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-dg2-oem2/igt@xe_module_load@load.html

  
Known issues
------------

  Here are the changes found in xe-pw-156651v1_BAT that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_flip@basic-plain-flip@b-edp1:
    - bat-adlp-7:         [PASS][27] -> [DMESG-WARN][28] ([Intel XE#4543]) +1 other test dmesg-warn
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/bat-adlp-7/igt@kms_flip@basic-plain-flip@b-edp1.html
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/bat-adlp-7/igt@kms_flip@basic-plain-flip@b-edp1.html

  
  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543


Build changes
-------------

  * Linux: xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc -> xe-pw-156651v1

  IGT_8598: 8598
  xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc: 894bc3ad572262b3c29e8cf0352adaa07275dbfc
  xe-pw-156651v1: 156651v1

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/index.html

[-- Attachment #2: Type: text/html, Size: 6958 bytes --]

^ permalink raw reply	[flat|nested] 22+ messages in thread

* ✗ Xe.CI.Full: failure for drm/xe/madvise: Add support for purgeable buffer objects
  2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
                   ` (12 preceding siblings ...)
  2025-10-28 14:12 ` ✗ Xe.CI.BAT: failure " Patchwork
@ 2025-10-28 19:44 ` Patchwork
  13 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-10-28 19:44 UTC (permalink / raw)
  To: Arvind Yadav; +Cc: intel-xe

[-- Attachment #1: Type: text/plain, Size: 67901 bytes --]

== Series Details ==

Series: drm/xe/madvise: Add support for purgeable buffer objects
URL   : https://patchwork.freedesktop.org/series/156651/
State : failure

== Summary ==

CI Bug Log - changes from xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc_FULL -> xe-pw-156651v1_FULL
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with xe-pw-156651v1_FULL absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in xe-pw-156651v1_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

Participating hosts (4 -> 4)
------------------------------

  No changes in participating hosts

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in xe-pw-156651v1_FULL:

### IGT changes ###

#### Possible regressions ####

  * igt@sriov_basic@enable-vfs-autoprobe-off:
    - shard-adlp:         [PASS][1] -> [SKIP][2]
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-2/igt@sriov_basic@enable-vfs-autoprobe-off.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-6/igt@sriov_basic@enable-vfs-autoprobe-off.html

  * igt@xe_create@create-invalid-size:
    - shard-dg2-set2:     [PASS][3] -> [ABORT][4] +1 other test abort
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-432/igt@xe_create@create-invalid-size.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@xe_create@create-invalid-size.html

  * igt@xe_create@create-massive-size:
    - shard-adlp:         [PASS][5] -> [ABORT][6]
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-6/igt@xe_create@create-massive-size.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-2/igt@xe_create@create-massive-size.html
    - shard-bmg:          [PASS][7] -> [ABORT][8]
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-3/igt@xe_create@create-massive-size.html
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@xe_create@create-massive-size.html
    - shard-lnl:          [PASS][9] -> [ABORT][10] +2 other tests abort
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-2/igt@xe_create@create-massive-size.html
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-2/igt@xe_create@create-massive-size.html

  * igt@xe_evict@evict-small-external:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][11]
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-464/igt@xe_evict@evict-small-external.html

  * igt@xe_exec_system_allocator@pat-index-madvise-max-pat-index-multi-vma:
    - shard-bmg:          [PASS][12] -> [FAIL][13] +4 other tests fail
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-7/igt@xe_exec_system_allocator@pat-index-madvise-max-pat-index-multi-vma.html
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-2/igt@xe_exec_system_allocator@pat-index-madvise-max-pat-index-multi-vma.html
    - shard-lnl:          [PASS][14] -> [FAIL][15] +2 other tests fail
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-5/igt@xe_exec_system_allocator@pat-index-madvise-max-pat-index-multi-vma.html
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-7/igt@xe_exec_system_allocator@pat-index-madvise-max-pat-index-multi-vma.html

  
Known issues
------------

  Here are the changes found in xe-pw-156651v1_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@intel_hwmon@hwmon-write:
    - shard-adlp:         NOTRUN -> [SKIP][16] ([Intel XE#1125] / [Intel XE#5574])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@intel_hwmon@hwmon-write.html

  * igt@kms_async_flips@async-flip-with-page-flip-events-linear-atomic@pipe-c-edp-1:
    - shard-lnl:          [PASS][17] -> [FAIL][18] ([Intel XE#6054]) +3 other tests fail
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-2/igt@kms_async_flips@async-flip-with-page-flip-events-linear-atomic@pipe-c-edp-1.html
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-1/igt@kms_async_flips@async-flip-with-page-flip-events-linear-atomic@pipe-c-edp-1.html

  * igt@kms_big_fb@4-tiled-addfb:
    - shard-adlp:         NOTRUN -> [SKIP][19] ([Intel XE#619])
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_big_fb@4-tiled-addfb.html

  * igt@kms_big_fb@linear-16bpp-rotate-90:
    - shard-dg2-set2:     NOTRUN -> [SKIP][20] ([Intel XE#316]) +2 other tests skip
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_big_fb@linear-16bpp-rotate-90.html

  * igt@kms_big_fb@linear-32bpp-rotate-270:
    - shard-adlp:         NOTRUN -> [SKIP][21] ([Intel XE#316]) +1 other test skip
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_big_fb@linear-32bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
    - shard-adlp:         [PASS][22] -> [DMESG-FAIL][23] ([Intel XE#4543])
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-1/igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-1/igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-16bpp-rotate-90:
    - shard-adlp:         NOTRUN -> [SKIP][24] ([Intel XE#1124])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_big_fb@yf-tiled-16bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-dg2-set2:     NOTRUN -> [SKIP][25] ([Intel XE#1124]) +3 other tests skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#1124])
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html

  * igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p:
    - shard-bmg:          [PASS][27] -> [SKIP][28] ([Intel XE#2314] / [Intel XE#2894])
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-8/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html

  * igt@kms_bw@linear-tiling-1-displays-3840x2160p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][29] ([Intel XE#367]) +1 other test skip
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_bw@linear-tiling-1-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-2-displays-2160x1440p:
    - shard-adlp:         NOTRUN -> [SKIP][30] ([Intel XE#367])
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_bw@linear-tiling-2-displays-2160x1440p.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][31] ([Intel XE#2887]) +1 other test skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][32] ([Intel XE#455] / [Intel XE#787]) +3 other tests skip
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][33] ([Intel XE#2887])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-bmg-ccs@pipe-c-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][34] ([Intel XE#2669]) +3 other tests skip
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_ccs@crc-primary-basic-4-tiled-bmg-ccs@pipe-c-edp-1.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc@pipe-d-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][35] ([Intel XE#455] / [Intel XE#787]) +5 other tests skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc@pipe-d-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [SKIP][36] ([Intel XE#787]) +13 other tests skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_ccs@crc-primary-basic-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-6.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs:
    - shard-adlp:         NOTRUN -> [SKIP][37] ([Intel XE#2907])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
    - shard-bmg:          [PASS][38] -> [INCOMPLETE][39] ([Intel XE#3862]) +1 other test incomplete
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-1/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-8/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs:
    - shard-dg2-set2:     [PASS][40] -> [INCOMPLETE][41] ([Intel XE#3862]) +1 other test incomplete
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-435/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-434/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc@pipe-b-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][42] ([Intel XE#787]) +8 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc@pipe-b-hdmi-a-1.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs:
    - shard-dg2-set2:     [PASS][43] -> [INCOMPLETE][44] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345])
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [PASS][45] -> [INCOMPLETE][46] ([Intel XE#1727] / [Intel XE#3113])
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6.html
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4:
    - shard-dg2-set2:     [PASS][47] -> [INCOMPLETE][48] ([Intel XE#6168] / [i915#14968])
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4.html
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [PASS][49] -> [DMESG-WARN][50] ([Intel XE#1727] / [Intel XE#3113])
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-hdmi-a-6.html
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-hdmi-a-6.html

  * igt@kms_cdclk@mode-transition-all-outputs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][51] ([Intel XE#4418])
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_cdclk@mode-transition-all-outputs.html

  * igt@kms_chamelium_audio@dp-audio-edid:
    - shard-dg2-set2:     NOTRUN -> [SKIP][52] ([Intel XE#373]) +1 other test skip
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_chamelium_audio@dp-audio-edid.html

  * igt@kms_chamelium_color@ctm-0-50:
    - shard-adlp:         NOTRUN -> [SKIP][53] ([Intel XE#306])
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_chamelium_color@ctm-0-50.html

  * igt@kms_chamelium_color@gamma:
    - shard-dg2-set2:     NOTRUN -> [SKIP][54] ([Intel XE#306])
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_chamelium_color@gamma.html

  * igt@kms_chamelium_frames@dp-crc-single:
    - shard-adlp:         NOTRUN -> [SKIP][55] ([Intel XE#373]) +1 other test skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_chamelium_frames@dp-crc-single.html

  * igt@kms_chamelium_hpd@vga-hpd-fast:
    - shard-lnl:          NOTRUN -> [SKIP][56] ([Intel XE#373]) +1 other test skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_chamelium_hpd@vga-hpd-fast.html

  * igt@kms_content_protection@dp-mst-lic-type-0:
    - shard-adlp:         NOTRUN -> [SKIP][57] ([Intel XE#307])
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_content_protection@dp-mst-lic-type-0.html

  * igt@kms_content_protection@dp-mst-lic-type-1:
    - shard-bmg:          NOTRUN -> [SKIP][58] ([Intel XE#2390])
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_content_protection@dp-mst-lic-type-1.html

  * igt@kms_content_protection@dp-mst-type-0:
    - shard-dg2-set2:     NOTRUN -> [SKIP][59] ([Intel XE#307])
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-464/igt@kms_content_protection@dp-mst-type-0.html

  * igt@kms_content_protection@lic-type-0@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][60] ([Intel XE#1178])
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-8/igt@kms_content_protection@lic-type-0@pipe-a-dp-2.html

  * igt@kms_cursor_crc@cursor-offscreen-512x170:
    - shard-dg2-set2:     NOTRUN -> [SKIP][61] ([Intel XE#308]) +1 other test skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_cursor_crc@cursor-offscreen-512x170.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
    - shard-adlp:         NOTRUN -> [SKIP][62] ([Intel XE#309]) +2 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size:
    - shard-bmg:          [PASS][63] -> [SKIP][64] ([Intel XE#2291]) +3 other tests skip
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-4/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
    - shard-bmg:          [PASS][65] -> [FAIL][66] ([Intel XE#1475])
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-5/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-5/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
    - shard-adlp:         NOTRUN -> [SKIP][67] ([Intel XE#323])
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

  * igt@kms_dp_link_training@non-uhbr-sst:
    - shard-bmg:          [PASS][68] -> [SKIP][69] ([Intel XE#4354])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-4/igt@kms_dp_link_training@non-uhbr-sst.html
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_dp_link_training@non-uhbr-sst.html

  * igt@kms_dsc@dsc-fractional-bpp-with-bpc:
    - shard-bmg:          NOTRUN -> [SKIP][70] ([Intel XE#2244])
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html

  * igt@kms_feature_discovery@display-3x:
    - shard-dg2-set2:     NOTRUN -> [SKIP][71] ([Intel XE#703])
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_feature_discovery@display-3x.html

  * igt@kms_feature_discovery@psr1:
    - shard-dg2-set2:     NOTRUN -> [SKIP][72] ([Intel XE#1135])
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_feature_discovery@psr1.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank:
    - shard-dg2-set2:     [PASS][73] -> [FAIL][74] ([Intel XE#3098] / [Intel XE#5408])
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-464/igt@kms_flip@2x-flip-vs-absolute-wf_vblank.html
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-432/igt@kms_flip@2x-flip-vs-absolute-wf_vblank.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank@ab-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][75] -> [FAIL][76] ([Intel XE#3098])
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-464/igt@kms_flip@2x-flip-vs-absolute-wf_vblank@ab-hdmi-a6-dp4.html
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-432/igt@kms_flip@2x-flip-vs-absolute-wf_vblank@ab-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank@ac-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][77] -> [FAIL][78] ([Intel XE#5408])
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-464/igt@kms_flip@2x-flip-vs-absolute-wf_vblank@ac-hdmi-a6-dp4.html
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-432/igt@kms_flip@2x-flip-vs-absolute-wf_vblank@ac-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-suspend-interruptible:
    - shard-lnl:          NOTRUN -> [SKIP][79] ([Intel XE#1421]) +1 other test skip
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_flip@2x-flip-vs-suspend-interruptible.html

  * igt@kms_flip@2x-plain-flip-fb-recreate:
    - shard-bmg:          [PASS][80] -> [SKIP][81] ([Intel XE#2316]) +4 other tests skip
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-4/igt@kms_flip@2x-plain-flip-fb-recreate.html
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_flip@2x-plain-flip-fb-recreate.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank@d-hdmi-a1:
    - shard-adlp:         [PASS][82] -> [DMESG-WARN][83] ([Intel XE#4543]) +10 other tests dmesg-warn
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-4/igt@kms_flip@flip-vs-absolute-wf_vblank@d-hdmi-a1.html
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-3/igt@kms_flip@flip-vs-absolute-wf_vblank@d-hdmi-a1.html

  * igt@kms_flip@flip-vs-expired-vblank@b-edp1:
    - shard-lnl:          [PASS][84] -> [FAIL][85] ([Intel XE#301])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html

  * igt@kms_flip@flip-vs-rmfb-interruptible:
    - shard-adlp:         [PASS][86] -> [DMESG-WARN][87] ([Intel XE#4543] / [Intel XE#5208])
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-9/igt@kms_flip@flip-vs-rmfb-interruptible.html
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-8/igt@kms_flip@flip-vs-rmfb-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-bmg:          [PASS][88] -> [INCOMPLETE][89] ([Intel XE#2049] / [Intel XE#2597]) +1 other test incomplete
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-8/igt@kms_flip@flip-vs-suspend-interruptible.html
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_flip@flip-vs-suspend@b-hdmi-a1:
    - shard-adlp:         [PASS][90] -> [DMESG-WARN][91] ([Intel XE#2953] / [Intel XE#4173]) +5 other tests dmesg-warn
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-1/igt@kms_flip@flip-vs-suspend@b-hdmi-a1.html
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-1/igt@kms_flip@flip-vs-suspend@b-hdmi-a1.html

  * igt@kms_flip@flip-vs-suspend@c-hdmi-a6:
    - shard-dg2-set2:     [PASS][92] -> [INCOMPLETE][93] ([Intel XE#2049] / [Intel XE#2597]) +1 other test incomplete
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-463/igt@kms_flip@flip-vs-suspend@c-hdmi-a6.html
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_flip@flip-vs-suspend@c-hdmi-a6.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling:
    - shard-adlp:         NOTRUN -> [SKIP][94] ([Intel XE#455]) +5 other tests skip
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling.html

  * igt@kms_frontbuffer_tracking@drrs-1p-primscrn-indfb-pgflip-blt:
    - shard-adlp:         NOTRUN -> [SKIP][95] ([Intel XE#651]) +2 other tests skip
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw:
    - shard-bmg:          NOTRUN -> [SKIP][96] ([Intel XE#2311]) +3 other tests skip
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][97] ([Intel XE#5390]) +1 other test skip
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-move:
    - shard-lnl:          NOTRUN -> [SKIP][98] ([Intel XE#656]) +5 other tests skip
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-move.html

  * igt@kms_frontbuffer_tracking@fbc-tiling-y:
    - shard-dg2-set2:     NOTRUN -> [SKIP][99] ([Intel XE#658])
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_frontbuffer_tracking@fbc-tiling-y.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][100] ([Intel XE#651])
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-rte:
    - shard-dg2-set2:     NOTRUN -> [SKIP][101] ([Intel XE#651]) +3 other tests skip
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_frontbuffer_tracking@fbcdrrs-1p-rte.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-offscreen-pri-indfb-draw-render:
    - shard-adlp:         NOTRUN -> [SKIP][102] ([Intel XE#6312]) +1 other test skip
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscreen-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][103] ([Intel XE#653]) +9 other tests skip
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@pipe-fbc-rte:
    - shard-bmg:          NOTRUN -> [SKIP][104] ([Intel XE#5672])
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-indfb-draw-render:
    - shard-dg2-set2:     NOTRUN -> [SKIP][105] ([Intel XE#6312]) +3 other tests skip
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][106] ([Intel XE#2313]) +4 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-msflip-blt:
    - shard-adlp:         NOTRUN -> [SKIP][107] ([Intel XE#656]) +7 other tests skip
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-rgb565-draw-mmap-wc:
    - shard-adlp:         NOTRUN -> [SKIP][108] ([Intel XE#653]) +2 other tests skip
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_frontbuffer_tracking@psr-rgb565-draw-mmap-wc.html

  * igt@kms_hdr@static-toggle:
    - shard-bmg:          [PASS][109] -> [SKIP][110] ([Intel XE#1503]) +2 other tests skip
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-8/igt@kms_hdr@static-toggle.html
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_hdr@static-toggle.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-adlp:         NOTRUN -> [SKIP][111] ([Intel XE#4298])
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_joiner@basic-max-non-joiner.html

  * igt@kms_joiner@invalid-modeset-force-ultra-joiner:
    - shard-dg2-set2:     NOTRUN -> [SKIP][112] ([Intel XE#2925])
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_joiner@invalid-modeset-force-ultra-joiner.html

  * igt@kms_joiner@invalid-modeset-ultra-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][113] ([Intel XE#2927])
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-5/igt@kms_joiner@invalid-modeset-ultra-joiner.html

  * igt@kms_panel_fitting@legacy:
    - shard-bmg:          NOTRUN -> [SKIP][114] ([Intel XE#2486])
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_panel_fitting@legacy.html

  * igt@kms_plane_multiple@2x-tiling-yf:
    - shard-adlp:         NOTRUN -> [SKIP][115] ([Intel XE#4596])
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_plane_multiple@2x-tiling-yf.html

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-dg2-set2:     NOTRUN -> [SKIP][116] ([Intel XE#870])
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-adlp:         [PASS][117] -> [FAIL][118] ([Intel XE#718])
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-8/igt@kms_pm_dc@dc6-dpms.html
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-4/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_rpm@modeset-lpsp:
    - shard-bmg:          NOTRUN -> [SKIP][119] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#836])
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-5/igt@kms_pm_rpm@modeset-lpsp.html

  * igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf:
    - shard-adlp:         NOTRUN -> [SKIP][120] ([Intel XE#1406] / [Intel XE#1489]) +1 other test skip
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-update-continuous-sf:
    - shard-lnl:          NOTRUN -> [SKIP][121] ([Intel XE#1406] / [Intel XE#2893])
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_psr2_sf@fbc-pr-overlay-plane-update-continuous-sf.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area:
    - shard-lnl:          NOTRUN -> [SKIP][122] ([Intel XE#1406] / [Intel XE#2893] / [Intel XE#4608])
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][123] ([Intel XE#1406] / [Intel XE#4608]) +1 other test skip
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-b-edp-1.html

  * igt@kms_psr2_sf@pr-cursor-plane-move-continuous-exceed-fully-sf:
    - shard-bmg:          NOTRUN -> [SKIP][124] ([Intel XE#1406] / [Intel XE#1489])
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf:
    - shard-dg2-set2:     NOTRUN -> [SKIP][125] ([Intel XE#1406] / [Intel XE#1489]) +1 other test skip
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-dg2-set2:     NOTRUN -> [SKIP][126] ([Intel XE#1122] / [Intel XE#1406])
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr@fbc-pr-cursor-plane-move:
    - shard-dg2-set2:     NOTRUN -> [SKIP][127] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +3 other tests skip
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_psr@fbc-pr-cursor-plane-move.html

  * igt@kms_psr@fbc-psr-suspend:
    - shard-adlp:         NOTRUN -> [SKIP][128] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +3 other tests skip
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_psr@fbc-psr-suspend.html

  * igt@kms_psr@psr2-primary-blt:
    - shard-bmg:          NOTRUN -> [SKIP][129] ([Intel XE#1406] / [Intel XE#2234] / [Intel XE#2850]) +1 other test skip
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_psr@psr2-primary-blt.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-270:
    - shard-dg2-set2:     NOTRUN -> [SKIP][130] ([Intel XE#3414])
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_rotation_crc@primary-y-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
    - shard-adlp:         NOTRUN -> [SKIP][131] ([Intel XE#1127])
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html

  * igt@kms_scaling_modes@scaling-mode-full:
    - shard-dg2-set2:     NOTRUN -> [SKIP][132] ([Intel XE#455]) +2 other tests skip
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_scaling_modes@scaling-mode-full.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-dg2-set2:     NOTRUN -> [SKIP][133] ([Intel XE#1500])
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@kms_vrr@cmrr@pipe-a-edp-1:
    - shard-lnl:          [PASS][134] -> [FAIL][135] ([Intel XE#4459]) +1 other test fail
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-1/igt@kms_vrr@cmrr@pipe-a-edp-1.html
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-4/igt@kms_vrr@cmrr@pipe-a-edp-1.html

  * igt@kms_vrr@negative-basic:
    - shard-bmg:          [PASS][136] -> [SKIP][137] ([Intel XE#1499])
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-4/igt@kms_vrr@negative-basic.html
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_vrr@negative-basic.html

  * igt@xe_ccs@ctrl-surf-copy:
    - shard-adlp:         NOTRUN -> [SKIP][138] ([Intel XE#455] / [Intel XE#488] / [Intel XE#5607])
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_ccs@ctrl-surf-copy.html

  * igt@xe_copy_basic@mem-set-linear-0x3fff:
    - shard-adlp:         NOTRUN -> [SKIP][139] ([Intel XE#1126])
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_copy_basic@mem-set-linear-0x3fff.html

  * igt@xe_eu_stall@invalid-sampling-rate:
    - shard-adlp:         NOTRUN -> [SKIP][140] ([Intel XE#5626])
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_eu_stall@invalid-sampling-rate.html

  * igt@xe_eudebug@basic-vm-bind:
    - shard-adlp:         NOTRUN -> [SKIP][141] ([Intel XE#4837] / [Intel XE#5565]) +1 other test skip
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_eudebug@basic-vm-bind.html

  * igt@xe_eudebug@sysfs-toggle:
    - shard-lnl:          NOTRUN -> [SKIP][142] ([Intel XE#4837]) +3 other tests skip
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@xe_eudebug@sysfs-toggle.html

  * igt@xe_eudebug_online@interrupt-all:
    - shard-dg2-set2:     NOTRUN -> [SKIP][143] ([Intel XE#4837]) +2 other tests skip
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@xe_eudebug_online@interrupt-all.html

  * igt@xe_eudebug_sriov@deny-eudebug:
    - shard-dg2-set2:     NOTRUN -> [SKIP][144] ([Intel XE#4518])
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@xe_eudebug_sriov@deny-eudebug.html

  * igt@xe_eudebug_sriov@deny-sriov:
    - shard-bmg:          NOTRUN -> [SKIP][145] ([Intel XE#5793])
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@xe_eudebug_sriov@deny-sriov.html

  * igt@xe_evict@evict-beng-mixed-threads-large:
    - shard-adlp:         NOTRUN -> [SKIP][146] ([Intel XE#261]) +1 other test skip
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_evict@evict-beng-mixed-threads-large.html

  * igt@xe_evict@evict-beng-small-external-cm:
    - shard-adlp:         NOTRUN -> [SKIP][147] ([Intel XE#261] / [Intel XE#5564] / [Intel XE#688])
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_evict@evict-beng-small-external-cm.html

  * igt@xe_evict@evict-cm-threads-small-multi-vm:
    - shard-lnl:          NOTRUN -> [SKIP][148] ([Intel XE#688])
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@xe_evict@evict-cm-threads-small-multi-vm.html

  * igt@xe_exec_balancer@many-cm-virtual-userptr-invalidate-race:
    - shard-adlp:         [PASS][149] -> [FAIL][150] ([Intel XE#5625]) +1 other test fail
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-3/igt@xe_exec_balancer@many-cm-virtual-userptr-invalidate-race.html
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-6/igt@xe_exec_balancer@many-cm-virtual-userptr-invalidate-race.html

  * igt@xe_exec_basic@multigpu-no-exec-bindexecqueue-rebind:
    - shard-adlp:         NOTRUN -> [SKIP][151] ([Intel XE#1392] / [Intel XE#5575]) +2 other tests skip
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_exec_basic@multigpu-no-exec-bindexecqueue-rebind.html

  * igt@xe_exec_basic@multigpu-no-exec-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][152] ([Intel XE#1392])
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@xe_exec_basic@multigpu-no-exec-rebind.html

  * igt@xe_exec_basic@multigpu-once-basic-defer-bind:
    - shard-bmg:          NOTRUN -> [SKIP][153] ([Intel XE#2322])
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@xe_exec_basic@multigpu-once-basic-defer-bind.html

  * igt@xe_exec_fault_mode@many-execqueues-bindexecqueue-imm:
    - shard-adlp:         NOTRUN -> [SKIP][154] ([Intel XE#288] / [Intel XE#5561]) +4 other tests skip
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_exec_fault_mode@many-execqueues-bindexecqueue-imm.html

  * igt@xe_exec_fault_mode@once-bindexecqueue-rebind-prefetch:
    - shard-dg2-set2:     NOTRUN -> [SKIP][155] ([Intel XE#288]) +8 other tests skip
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@xe_exec_fault_mode@once-bindexecqueue-rebind-prefetch.html

  * igt@xe_exec_reset@cm-close-fd:
    - shard-adlp:         [PASS][156] -> [DMESG-WARN][157] ([Intel XE#3868])
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-4/igt@xe_exec_reset@cm-close-fd.html
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-3/igt@xe_exec_reset@cm-close-fd.html

  * igt@xe_exec_system_allocator@madvise-split-vma-with-mapping:
    - shard-lnl:          NOTRUN -> [WARN][158] ([Intel XE#5786])
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@xe_exec_system_allocator@madvise-split-vma-with-mapping.html

  * igt@xe_exec_system_allocator@many-large-execqueues-mmap-huge-nomemset:
    - shard-lnl:          NOTRUN -> [SKIP][159] ([Intel XE#4943]) +2 other tests skip
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@xe_exec_system_allocator@many-large-execqueues-mmap-huge-nomemset.html

  * igt@xe_exec_system_allocator@many-stride-malloc-prefetch:
    - shard-bmg:          [PASS][160] -> [WARN][161] ([Intel XE#5786])
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-3/igt@xe_exec_system_allocator@many-stride-malloc-prefetch.html
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-7/igt@xe_exec_system_allocator@many-stride-malloc-prefetch.html

  * igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma:
    - shard-lnl:          [PASS][162] -> [FAIL][163] ([Intel XE#5625])
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-3/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma.html
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-5/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma.html

  * igt@xe_exec_system_allocator@threads-many-large-execqueues-mmap-remap-ro-eocheck:
    - shard-dg2-set2:     NOTRUN -> [SKIP][164] ([Intel XE#4915]) +90 other tests skip
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-464/igt@xe_exec_system_allocator@threads-many-large-execqueues-mmap-remap-ro-eocheck.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-new-huge-nomemset:
    - shard-bmg:          NOTRUN -> [SKIP][165] ([Intel XE#4943]) +1 other test skip
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-new-huge-nomemset.html

  * igt@xe_exec_system_allocator@twice-mmap:
    - shard-adlp:         NOTRUN -> [SKIP][166] ([Intel XE#4915]) +77 other tests skip
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_exec_system_allocator@twice-mmap.html

  * igt@xe_mmap@pci-membarrier-parallel:
    - shard-lnl:          NOTRUN -> [SKIP][167] ([Intel XE#5100])
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-3/igt@xe_mmap@pci-membarrier-parallel.html

  * igt@xe_oa@buffer-fill:
    - shard-dg2-set2:     NOTRUN -> [SKIP][168] ([Intel XE#3573]) +2 other tests skip
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@xe_oa@buffer-fill.html

  * igt@xe_oa@mmio-triggered-reports-read:
    - shard-dg2-set2:     NOTRUN -> [SKIP][169] ([Intel XE#6032])
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@xe_oa@mmio-triggered-reports-read.html

  * igt@xe_oa@non-sampling-read-error:
    - shard-adlp:         NOTRUN -> [SKIP][170] ([Intel XE#3573])
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_oa@non-sampling-read-error.html

  * igt@xe_peer2peer@read:
    - shard-adlp:         NOTRUN -> [SKIP][171] ([Intel XE#1061] / [Intel XE#5568])
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_peer2peer@read.html

  * igt@xe_pm@s2idle-vm-bind-userptr:
    - shard-adlp:         [PASS][172] -> [INCOMPLETE][173] ([Intel XE#4504])
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-2/igt@xe_pm@s2idle-vm-bind-userptr.html
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-6/igt@xe_pm@s2idle-vm-bind-userptr.html

  * igt@xe_pmu@fn-engine-activity-sched-if-idle@engine-drm_xe_engine_class_video_enhance1:
    - shard-bmg:          [PASS][174] -> [DMESG-WARN][175] ([Intel XE#3876] / [Intel XE#3970]) +1 other test dmesg-warn
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@xe_pmu@fn-engine-activity-sched-if-idle@engine-drm_xe_engine_class_video_enhance1.html
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@xe_pmu@fn-engine-activity-sched-if-idle@engine-drm_xe_engine_class_video_enhance1.html

  * igt@xe_pxp@pxp-stale-bo-bind-post-suspend:
    - shard-adlp:         NOTRUN -> [SKIP][176] ([Intel XE#4733] / [Intel XE#5594])
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_pxp@pxp-stale-bo-bind-post-suspend.html

  * igt@xe_query@multigpu-query-cs-cycles:
    - shard-dg2-set2:     NOTRUN -> [SKIP][177] ([Intel XE#944]) +1 other test skip
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@xe_query@multigpu-query-cs-cycles.html

  * igt@xe_query@multigpu-query-hwconfig:
    - shard-bmg:          NOTRUN -> [SKIP][178] ([Intel XE#944])
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@xe_query@multigpu-query-hwconfig.html

  * igt@xe_query@multigpu-query-uc-fw-version-guc:
    - shard-adlp:         NOTRUN -> [SKIP][179] ([Intel XE#944])
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_query@multigpu-query-uc-fw-version-guc.html

  * igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random:
    - shard-adlp:         [PASS][180] -> [DMESG-FAIL][181] ([Intel XE#3868] / [Intel XE#5213] / [Intel XE#5545]) +1 other test dmesg-fail
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-2/igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random.html
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-6/igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random.html

  * igt@xe_sriov_vram@vf-access-provisioned:
    - shard-adlp:         NOTRUN -> [SKIP][182] ([Intel XE#6376])
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-9/igt@xe_sriov_vram@vf-access-provisioned.html

  
#### Possible fixes ####

  * igt@device_reset@unbind-reset-rebind:
    - shard-bmg:          [DMESG-WARN][183] -> [PASS][184]
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-3/igt@device_reset@unbind-reset-rebind.html
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-7/igt@device_reset@unbind-reset-rebind.html

  * igt@kms_async_flips@async-flip-with-page-flip-events-linear@pipe-c-edp-1:
    - shard-lnl:          [FAIL][185] ([Intel XE#5993]) -> [PASS][186] +3 other tests pass
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-3/igt@kms_async_flips@async-flip-with-page-flip-events-linear@pipe-c-edp-1.html
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-5/igt@kms_async_flips@async-flip-with-page-flip-events-linear@pipe-c-edp-1.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip:
    - shard-adlp:         [DMESG-FAIL][187] ([Intel XE#4543]) -> [PASS][188]
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-3/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-6/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p:
    - shard-bmg:          [SKIP][189] ([Intel XE#2314] / [Intel XE#2894]) -> [PASS][190]
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-8/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html

  * igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy:
    - shard-bmg:          [SKIP][191] ([Intel XE#2291]) -> [PASS][192] +3 other tests pass
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy.html
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-1/igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy.html

  * igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset:
    - shard-bmg:          [SKIP][193] ([Intel XE#2316]) -> [PASS][194] +1 other test pass
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset.html
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-8/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset.html

  * igt@kms_flip@dpms-off-confusion@c-hdmi-a1:
    - shard-adlp:         [DMESG-WARN][195] ([Intel XE#4543]) -> [PASS][196] +2 other tests pass
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-1/igt@kms_flip@dpms-off-confusion@c-hdmi-a1.html
   [196]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-1/igt@kms_flip@dpms-off-confusion@c-hdmi-a1.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-lnl:          [FAIL][197] ([Intel XE#301] / [Intel XE#3149]) -> [PASS][198]
   [197]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [198]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-dg2-set2:     [INCOMPLETE][199] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][200] +1 other test pass
   [199]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-434/igt@kms_flip@flip-vs-suspend-interruptible.html
   [200]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-464/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_hdr@invalid-hdr:
    - shard-dg2-set2:     [SKIP][201] ([Intel XE#455]) -> [PASS][202]
   [201]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-436/igt@kms_hdr@invalid-hdr.html
   [202]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-463/igt@kms_hdr@invalid-hdr.html

  * igt@kms_hdr@static-toggle-suspend:
    - shard-bmg:          [SKIP][203] ([Intel XE#1503]) -> [PASS][204]
   [203]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_hdr@static-toggle-suspend.html
   [204]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-2/igt@kms_hdr@static-toggle-suspend.html

  * igt@kms_plane_multiple@2x-tiling-none:
    - shard-bmg:          [SKIP][205] ([Intel XE#4596]) -> [PASS][206]
   [205]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-none.html
   [206]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-2/igt@kms_plane_multiple@2x-tiling-none.html

  * igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75:
    - shard-adlp:         [DMESG-WARN][207] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][208] +2 other tests pass
   [207]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-4/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75.html
   [208]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-3/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75.html

  * igt@xe_exec_reset@cm-gt-reset:
    - shard-dg2-set2:     [ABORT][209] -> [PASS][210]
   [209]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-466/igt@xe_exec_reset@cm-gt-reset.html
   [210]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-436/igt@xe_exec_reset@cm-gt-reset.html

  * igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv:
    - shard-dg2-set2:     [DMESG-WARN][211] ([Intel XE#5893]) -> [PASS][212]
   [211]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-464/igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv.html
   [212]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv.html

  * igt@xe_pm@s2idle-vm-bind-unbind-all:
    - shard-dg2-set2:     [TIMEOUT][213] ([Intel XE#6227]) -> [PASS][214]
   [213]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-464/igt@xe_pm@s2idle-vm-bind-unbind-all.html
   [214]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@xe_pm@s2idle-vm-bind-unbind-all.html

  
#### Warnings ####

  * igt@kms_content_protection@lic-type-0:
    - shard-bmg:          [SKIP][215] ([Intel XE#2341]) -> [FAIL][216] ([Intel XE#1178])
   [215]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_content_protection@lic-type-0.html
   [216]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-8/igt@kms_content_protection@lic-type-0.html

  * igt@kms_flip@flip-vs-expired-vblank:
    - shard-lnl:          [FAIL][217] ([Intel XE#301] / [Intel XE#3149]) -> [FAIL][218] ([Intel XE#301])
   [217]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank.html
   [218]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][219] ([Intel XE#2311]) -> [SKIP][220] ([Intel XE#2312]) +9 other tests skip
   [219]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc.html
   [220]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][221] ([Intel XE#5390]) -> [SKIP][222] ([Intel XE#2312]) +3 other tests skip
   [221]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html
   [222]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen:
    - shard-bmg:          [SKIP][223] ([Intel XE#2312]) -> [SKIP][224] ([Intel XE#5390]) +4 other tests skip
   [223]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen.html
   [224]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][225] ([Intel XE#2312]) -> [SKIP][226] ([Intel XE#2311]) +10 other tests skip
   [225]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-pgflip-blt.html
   [226]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt:
    - shard-bmg:          [SKIP][227] ([Intel XE#2312]) -> [SKIP][228] ([Intel XE#2313]) +11 other tests skip
   [227]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html
   [228]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen:
    - shard-bmg:          [SKIP][229] ([Intel XE#2313]) -> [SKIP][230] ([Intel XE#2312]) +11 other tests skip
   [229]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-8/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen.html
   [230]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-dg2-set2:     [SKIP][231] ([Intel XE#362]) -> [FAIL][232] ([Intel XE#1729])
   [231]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-dg2-463/igt@kms_tiled_display@basic-test-pattern.html
   [232]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-dg2-433/igt@kms_tiled_display@basic-test-pattern.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-rebind:
    - shard-adlp:         [SKIP][233] ([Intel XE#1392] / [Intel XE#5575]) -> [DMESG-FAIL][234] ([Intel XE#5213])
   [233]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-adlp-2/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-rebind.html
   [234]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-adlp-6/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-rebind.html

  * igt@xe_fault_injection@probe-fail-guc-xe_guc_ct_send_recv:
    - shard-bmg:          [ABORT][235] ([Intel XE#5466] / [Intel XE#5530]) -> [ABORT][236] ([Intel XE#4917] / [Intel XE#5466] / [Intel XE#5530])
   [235]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc/shard-bmg-3/igt@xe_fault_injection@probe-fail-guc-xe_guc_ct_send_recv.html
   [236]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/shard-bmg-7/igt@xe_fault_injection@probe-fail-guc-xe_guc_ct_send_recv.html

  
  [Intel XE#1061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1061
  [Intel XE#1122]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1122
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1125]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1125
  [Intel XE#1126]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1126
  [Intel XE#1127]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1127
  [Intel XE#1135]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1135
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
  [Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
  [Intel XE#1475]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1475
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
  [Intel XE#1500]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1500
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
  [Intel XE#2486]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2486
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#261]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/261
  [Intel XE#2669]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2669
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2893
  [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
  [Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
  [Intel XE#2925]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2925
  [Intel XE#2927]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2927
  [Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
  [Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
  [Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#3141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3141
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/362
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#3862]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3862
  [Intel XE#3868]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3868
  [Intel XE#3876]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3876
  [Intel XE#3970]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3970
  [Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
  [Intel XE#4298]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4298
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
  [Intel XE#4418]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4418
  [Intel XE#4459]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4459
  [Intel XE#4504]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4504
  [Intel XE#4518]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4518
  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#4608]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4608
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#488]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/488
  [Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
  [Intel XE#4917]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4917
  [Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
  [Intel XE#5100]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5100
  [Intel XE#5208]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5208
  [Intel XE#5213]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5213
  [Intel XE#5390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5390
  [Intel XE#5408]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5408
  [Intel XE#5466]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5466
  [Intel XE#5530]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5530
  [Intel XE#5545]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5545
  [Intel XE#5561]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5561
  [Intel XE#5564]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5564
  [Intel XE#5565]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5565
  [Intel XE#5568]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5568
  [Intel XE#5574]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5574
  [Intel XE#5575]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5575
  [Intel XE#5594]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5594
  [Intel XE#5607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5607
  [Intel XE#5625]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5625
  [Intel XE#5626]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5626
  [Intel XE#5672]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5672
  [Intel XE#5786]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5786
  [Intel XE#5793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5793
  [Intel XE#5893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5893
  [Intel XE#5993]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5993
  [Intel XE#6032]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6032
  [Intel XE#6054]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6054
  [Intel XE#6168]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6168
  [Intel XE#619]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/619
  [Intel XE#6227]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6227
  [Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
  [Intel XE#6376]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6376
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/658
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#703]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/703
  [Intel XE#718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/718
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836
  [Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
  [i915#14968]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14968


Build changes
-------------

  * Linux: xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc -> xe-pw-156651v1

  IGT_8598: 8598
  xe-3995-894bc3ad572262b3c29e8cf0352adaa07275dbfc: 894bc3ad572262b3c29e8cf0352adaa07275dbfc
  xe-pw-156651v1: 156651v1

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-156651v1/index.html

[-- Attachment #2: Type: text/html, Size: 78738 bytes --]

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects
  2025-10-28 13:02   ` Matthew Auld
@ 2025-10-29  8:40     ` Yadav, Arvind
  0 siblings, 0 replies; 22+ messages in thread
From: Yadav, Arvind @ 2025-10-29  8:40 UTC (permalink / raw)
  To: Matthew Auld, Thomas Hellström, intel-xe
  Cc: matthew.brost, himal.prasad.ghimiray


On 28-10-2025 18:32, Matthew Auld wrote:
> On 28/10/2025 12:37, Thomas Hellström wrote:
>> On Tue, 2025-10-28 at 17:54 +0530, Arvind Yadav wrote:
>>> This patch series introduces support for purgeable buffer objects
>>> (BOs) in the Xe driver.
>>> This feature allows userspace applications to provide memory usage
>>> hints to the kernel,
>>> enabling more effective memory management, especially under system
>>> memory pressure.
>>>
>>> When an application no longer needs the contents of a buffer, it can
>>> mark it as DONTNEED
>>> via the DRM_XE_MADVISE ioctl. This makes the BO a candidate for
>>> purging. If the kernel
>>> experiences memory pressure, it can reclaim the backing store of
>>> these BOs,
>>> freeing up GPU memory and helping to prevent Out-Of-Memory (OOM)
>>> situations.
>>>
>>> The lifecycle of a purgeable BO is as follows:
>>>
>>> A BO starts in the default WILLNEED state.
>>> Userspace marks it as DONTNEED when its contents are discardable.
>>> Under memory pressure, the kernel may purge the BO, transitioning it
>>> to the PURGED state.
>>> Any attempt to use a purged BO (e.g., binding, mapping, or CPU
>>> access) will result in an error,
>>> signaling to the application that the contents are gone. The
>>> application can then re-validate
>>> the BO by marking it WILLNEED, at which point new backing store is
>>> allocated. To prevent data corruption,
>>> a critical safety check ensures that only non-shared buffers can be
>>> marked as purgeable.
>>
>> What happens if the bo is bound to multiple address ranges? Do we
>> require all of them to be marked purged?
Currently, purging is applied to all address ranges, even if the user 
requested it for only one. Since the DONTNEED request comes from a user, 
it's assumed user are aware that the buffer object (BO) may be used 
across other address ranges as well.
However, if preferred, we can update the logic to purge the BO only when 
all associated address ranges have explicitly requested DONTNEED. 
Otherwise, the BO will remain WILLNEED. Let me know if this approach 
works, and we will proceed with the changes.

~Arvind
>>
>> Also with i915, when someone called WILLNEED on a purged bo, there was
>> an error rather than an attempt to rebind. What's the reasoning behind
>> re-allocating backing store here? Doesn't that mean we need to keep
>> vmas around even if we purge?
>
> Yeah, IIRC in Mesa/iris it used some kind of BO pool, marking stuff as 
> DONTNEED when "freeing" to the pool, and then when something was 
> allocated again from the pool it's first marked as WILLNEED, but if it 
> was purged they would simply discard the BO and try the next available 
> BO in the pool, which is hopefully not purged. So sounds like 
> re-allocating could potentially end up with undesired behaviour where 
> it now just always re-allocates instead of trying to re-use an 
> existing non-purged BO which might already have pages ready to go.
>
>>
>> /Thomas
>>
>>>
>>> Arvind Yadav (7):
>>>    drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo
>>>    drm/xe/madvise: Implement purgeable buffer object support
>>>    drm/xe/bo: Prevent purging of shared buffer objects
>>>    drm/xe/bo: Handle CPU faults on purged buffer objects
>>>    drm/xe/bo: Prevent mmap of purged buffer objects
>>>    drm/xe/vm: Prevent binding of purged buffer objects
>>>    drm/xe: Add support for querying purgeable BO states
>>>
>>> Himal Prasad Ghimiray (2):
>>>    drm/xe/uapi: Add UAPI support for purgeable buffer objects
>>>    drm/xe/uapi: Add UAPI for purgeable bo state to madvise query
>>> response
>>>
>>>   drivers/gpu/drm/xe/xe_bo.c         | 91 ++++++++++++++++++++++++++--
>>> -- 
>>>   drivers/gpu/drm/xe/xe_bo.h         | 51 +++++++++++++++++
>>>   drivers/gpu/drm/xe/xe_bo_types.h   |  3 +
>>>   drivers/gpu/drm/xe/xe_vm.c         | 11 ++++
>>>   drivers/gpu/drm/xe/xe_vm_madvise.c | 67 ++++++++++++++++++++++
>>>   include/uapi/drm/xe_drm.h          | 34 +++++++++++
>>>   6 files changed, 245 insertions(+), 12 deletions(-)
>>>
>>
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support
  2025-10-28 12:24 ` [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support Arvind Yadav
@ 2025-10-29  8:55   ` Thomas Hellström
  2025-10-29 10:51     ` Thomas Hellström
  0 siblings, 1 reply; 22+ messages in thread
From: Thomas Hellström @ 2025-10-29  8:55 UTC (permalink / raw)
  To: Arvind Yadav, intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray

On Tue, 2025-10-28 at 17:54 +0530, Arvind Yadav wrote:
> This allows userspace applications to provide memory usage hints to
> the kernel for better memory management under pressure:
> 
> - WILLNEED: BO will be needed again, re-validate if purged
> - DONTNEED: BO not currently needed, may be purged if needed
> 
> When userspace marks BO as DONTNEED, the kernel can reclaim
> their memory during memory pressure. BO transition to PURGED
> state when reclaimed, and attempting to access purged buffers
> triggers appropriate fault handling.
> 
> 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>
> ---
>  drivers/gpu/drm/xe/xe_bo.c         | 75 +++++++++++++++++++++++++---
> --
>  drivers/gpu/drm/xe/xe_vm_madvise.c | 67 ++++++++++++++++++++++++++
>  2 files changed, 130 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index cbc3ee157218..3b3eb83658cc 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
> @@ -836,6 +836,60 @@ static int xe_bo_move_notify(struct xe_bo *bo,
>  	return 0;
>  }
>  
> +static int xe_bo_invalidate_tlb_before_purge(struct xe_bo *bo)

In the future someone might want to reuse this function for
invalidating somewhere else. Could we perhaps rename to
xe_bo_invalidate_vmas() or something like that?


> +{
> +	struct drm_gpuvm_bo *vm_bo;
> +	struct drm_gpuva *gpuva;
> +	struct drm_gem_object *obj = &bo->ttm.base;
> +	int ret;
> +
> +	/* BO must be locked before invalidating */
> +	dma_resv_assert_held(bo->ttm.base.resv);
> +
> +	drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
> +		drm_gpuvm_bo_for_each_va(gpuva, vm_bo) {
> +			struct xe_vma *vma = gpuva_to_vma(gpuva);
> +
> +			ret = xe_vm_invalidate_vma(vma);
> +			if (ret)
> +				return ret;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> +static void xe_bo_set_purged(struct xe_bo *bo)
> +{
> +	/* BO must be locked before modifying madv state */
> +	dma_resv_assert_held(bo->ttm.base.resv);
> +
> +	atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_PURGED);
> +}
> +
> +static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct
> ttm_operation_ctx *ctx)
> +{
> +	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
> +	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
> +
> +	if (ttm_bo->ttm) {
> +		struct ttm_placement place = {};
> +		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
> +		int ret_inval;

Christian from AMD once mentioned that instead of implicitly calling
ttm_bo_validate() with an empty placement, we could send the null
placement through the evict_flags callback. Would that work?




> +
> +		drm_WARN_ON(&xe->drm, ret);
> +		if (!ret && bo) {
> +			if (atomic_read(&bo->madv_purgeable) ==
> XE_MADV_PURGEABLE_DONTNEED) {
> +				/* Invalidate TLB before marking BO
> as purged */
> +				ret_inval =
> xe_bo_invalidate_tlb_before_purge(bo);

Since the page-table update and page-freeing is really intended to be
an asynchronous operation, and the GPU bindings are intended to be
invalidated in move_notify() / trigger_rebind() where we properly take
care of special cases like faulting VMs etc, can we move the
invalidation logic there?

Perhaps it is even possible to skip the synchronous page-table zeroing
here in favour of a NULL rebind (when rebinding a purged BO we set up
all zero mappings, or whatever mappings are required given scratch page
mode etc.) Then the page-table clearing will be properly inserted in
the asynchronous execution.


> +				if (!ret_inval)
> +					xe_bo_set_purged(bo);
> +
> +			}
> +		}



> +	}
> +}
> +
>  static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
>  		      struct ttm_operation_ctx *ctx,
>  		      struct ttm_resource *new_mem,
> @@ -853,8 +907,14 @@ static int xe_bo_move(struct ttm_buffer_object
> *ttm_bo, bool evict,
>  	bool needs_clear;
>  	bool handle_system_ccs = (!IS_DGFX(xe) &&
> xe_bo_needs_ccs_pages(bo) &&
>  				  ttm && ttm_tt_is_populated(ttm)) ?
> true : false;
> +	int state = atomic_read(&bo->madv_purgeable);
>  	int ret = 0;
>  
> +	if (evict && state == XE_MADV_PURGEABLE_DONTNEED) {
> +		xe_ttm_bo_purge(ttm_bo, ctx);
> +			return 0;
> +	}
> +
>  	/* Bo creation path, moving to system or TT. */
>  	if ((!old_mem && ttm) && !handle_system_ccs) {
>  		if (new_mem->mem_type == XE_PL_TT)
> @@ -1606,18 +1666,6 @@ static void xe_ttm_bo_delete_mem_notify(struct
> ttm_buffer_object *ttm_bo)
>  	}
>  }
>  
> -static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct
> ttm_operation_ctx *ctx)
> -{
> -	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
> -
> -	if (ttm_bo->ttm) {
> -		struct ttm_placement place = {};
> -		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
> -
> -		drm_WARN_ON(&xe->drm, ret);
> -	}
> -}
> -
>  static void xe_ttm_bo_swap_notify(struct ttm_buffer_object *ttm_bo)
>  {
>  	struct ttm_operation_ctx ctx = {
> @@ -2472,6 +2520,9 @@ struct xe_bo *xe_bo_create_user(struct
> xe_device *xe,
>  				       ttm_bo_type_device, flags, 0,
> true);
>  	}
>  
> +	/* Initialize purge advisory state */
> +	atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_WILLNEED);
> +
>  	return bo;
>  }
>  
> diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c
> b/drivers/gpu/drm/xe/xe_vm_madvise.c
> index cad3cf627c3f..1f0356ea4403 100644
> --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
> +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
> @@ -158,6 +158,54 @@ static void madvise_pat_index(struct xe_device
> *xe, struct xe_vm *vm,
>  	}
>  }
>  
> +/*
> + * Handle purgeable buffer object advice for
> DONTNEED/WILLNEED/PURGED.
> + * Returns 0 on success, negative errno on error.
> + */
> +static void xe_vm_madvise_purgeable_bo(struct xe_device *xe, struct
> xe_vm *vm,
> +				       struct xe_vma **vmas, int
> num_vmas,
> +				       struct drm_xe_madvise *op,
> struct drm_exec *exec)
> +{
> +
> +	xe_assert(vm->xe, op->type ==
> DRM_XE_VMA_ATTR_PURGEABLE_STATE);
> +
> +	for (int i = 0; i < num_vmas; i++) {
> +		struct xe_bo *bo = xe_vma_bo(vmas[i]);
> +		int state;
> +		int ret;
> +
> +		if (!bo)
> +			continue;
> +
> +		/* BO must be locked before modifying madv state */
> +		dma_resv_assert_held(bo->ttm.base.resv);
> +
> +		switch (op->purge_state_val.val) {
> +		case DRM_XE_VMA_PURGEABLE_STATE_WILLNEED:
> +			state = atomic_read(&bo->madv_purgeable);
> +			if (state == XE_MADV_PURGEABLE_PURGED) {
> +				ret = xe_bo_validate(bo, NULL, true,
> exec);
> +				if (ret) {
> +					drm_err(&vm->xe->drm,
> +						"Failed to validate
> purged BO: %d\n", ret);
> +					return;
> +				}
> +			}
> +			atomic_set(&bo->madv_purgeable,
> XE_MADV_PURGEABLE_WILLNEED);
> +			break;
> +		case DRM_XE_VMA_PURGEABLE_STATE_DONTNEED:
> +			state = atomic_read(&bo->madv_purgeable);
> +			if (state != XE_MADV_PURGEABLE_PURGED)
> +				atomic_set(&bo->madv_purgeable,
> XE_MADV_PURGEABLE_DONTNEED);
> +			break;
> +		default:
> +			drm_warn(&vm->xe->drm, "Invalid madvice
> value = %d\n",
> +				 op->purge_state_val.val);
> +			return;
> +		}
> +	}
> +}
> +
>  typedef void (*madvise_func)(struct xe_device *xe, struct xe_vm *vm,
>  			     struct xe_vma **vmas, int num_vmas,
>  			     struct drm_xe_madvise *op);
> @@ -283,6 +331,19 @@ static bool madvise_args_are_sane(struct
> xe_device *xe, const struct drm_xe_madv
>  			return false;
>  		break;
>  	}
> +	case DRM_XE_VMA_ATTR_PURGEABLE_STATE:
> +	{
> +		u32 val = args->purge_state_val.val;
> +
> +		if (XE_IOCTL_DBG(xe, !((val ==
> DRM_XE_VMA_PURGEABLE_STATE_WILLNEED) ||
> +				       (val ==
> DRM_XE_VMA_PURGEABLE_STATE_DONTNEED))))
> +			return false;
> +
> +		if (XE_IOCTL_DBG(xe, args-
> >purge_state_val.reserved))
> +			return false;
> +
> +		break;
> +	}
>  	default:
>  		if (XE_IOCTL_DBG(xe, 1))
>  			return false;
> @@ -402,6 +463,12 @@ int xe_vm_madvise_ioctl(struct drm_device *dev,
> void *data, struct drm_file *fil
>  					goto err_fini;
>  			}
>  		}
> +		if (args->type == DRM_XE_VMA_ATTR_PURGEABLE_STATE) {
> +			xe_vm_madvise_purgeable_bo(xe, vm,
> madvise_range.vmas,
> +						  
> madvise_range.num_vmas, args, &exec);
> +			goto err_fini;
> +
> +		}
>  	}
>  
>  	if (madvise_range.has_svm_userptr_vmas) {


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support
  2025-10-29  8:55   ` Thomas Hellström
@ 2025-10-29 10:51     ` Thomas Hellström
  2025-10-30  7:03       ` Yadav, Arvind
  0 siblings, 1 reply; 22+ messages in thread
From: Thomas Hellström @ 2025-10-29 10:51 UTC (permalink / raw)
  To: Arvind Yadav, intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray

On Wed, 2025-10-29 at 09:55 +0100, Thomas Hellström wrote:
> On Tue, 2025-10-28 at 17:54 +0530, Arvind Yadav wrote:
> > This allows userspace applications to provide memory usage hints to
> > the kernel for better memory management under pressure:
> > 
> > - WILLNEED: BO will be needed again, re-validate if purged
> > - DONTNEED: BO not currently needed, may be purged if needed
> > 
> > When userspace marks BO as DONTNEED, the kernel can reclaim
> > their memory during memory pressure. BO transition to PURGED
> > state when reclaimed, and attempting to access purged buffers
> > triggers appropriate fault handling.
> > 
> > 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>
> > ---
> >  drivers/gpu/drm/xe/xe_bo.c         | 75 +++++++++++++++++++++++++-
> > --
> > --
> >  drivers/gpu/drm/xe/xe_vm_madvise.c | 67 ++++++++++++++++++++++++++
> >  2 files changed, 130 insertions(+), 12 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/xe/xe_bo.c
> > b/drivers/gpu/drm/xe/xe_bo.c
> > index cbc3ee157218..3b3eb83658cc 100644
> > --- a/drivers/gpu/drm/xe/xe_bo.c
> > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > @@ -836,6 +836,60 @@ static int xe_bo_move_notify(struct xe_bo *bo,
> >  	return 0;
> >  }
> >  
> > +static int xe_bo_invalidate_tlb_before_purge(struct xe_bo *bo)
> 
> In the future someone might want to reuse this function for
> invalidating somewhere else. Could we perhaps rename to
> xe_bo_invalidate_vmas() or something like that?
> 
> 
> > +{
> > +	struct drm_gpuvm_bo *vm_bo;
> > +	struct drm_gpuva *gpuva;
> > +	struct drm_gem_object *obj = &bo->ttm.base;
> > +	int ret;
> > +
> > +	/* BO must be locked before invalidating */
> > +	dma_resv_assert_held(bo->ttm.base.resv);
> > +
> > +	drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
> > +		drm_gpuvm_bo_for_each_va(gpuva, vm_bo) {
> > +			struct xe_vma *vma = gpuva_to_vma(gpuva);
> > +
> > +			ret = xe_vm_invalidate_vma(vma);
> > +			if (ret)
> > +				return ret;
> > +		}
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static void xe_bo_set_purged(struct xe_bo *bo)
> > +{
> > +	/* BO must be locked before modifying madv state */
> > +	dma_resv_assert_held(bo->ttm.base.resv);
> > +
> > +	atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_PURGED);
> > +}
> > +
> > +static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo,
> > struct
> > ttm_operation_ctx *ctx)
> > +{
> > +	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
> > +	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
> > +
> > +	if (ttm_bo->ttm) {
> > +		struct ttm_placement place = {};
> > +		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
> > +		int ret_inval;
> 
> Christian from AMD once mentioned that instead of implicitly calling
> ttm_bo_validate() with an empty placement, we could send the null
> placement through the evict_flags callback. Would that work?
> 
> 

Actually it doesn't since we don't get to call move_notify.

> 
> 
> > +
> > +		drm_WARN_ON(&xe->drm, ret);
> > +		if (!ret && bo) {
> > +			if (atomic_read(&bo->madv_purgeable) ==
> > XE_MADV_PURGEABLE_DONTNEED) {
> > +				/* Invalidate TLB before marking
> > BO
> > as purged */
> > +				ret_inval =
> > xe_bo_invalidate_tlb_before_purge(bo);
> 
> Since the page-table update and page-freeing is really intended to be
> an asynchronous operation, and the GPU bindings are intended to be
> invalidated in move_notify() / trigger_rebind() where we properly
> take
> care of special cases like faulting VMs etc, can we move the
> invalidation logic there?
> 
> Perhaps it is even possible to skip the synchronous page-table
> zeroing
> here in favour of a NULL rebind (when rebinding a purged BO we set up
> all zero mappings, or whatever mappings are required given scratch
> page
> mode etc.) Then the page-table clearing will be properly inserted in
> the asynchronous execution.
> 
> 
> > +				if (!ret_inval)
> > +					xe_bo_set_purged(bo);
> > +
> > +			}
> > +		}
> 
> 
> 
> > +	}
> > +}
> > +
> >  static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool
> > evict,
> >  		      struct ttm_operation_ctx *ctx,
> >  		      struct ttm_resource *new_mem,
> > @@ -853,8 +907,14 @@ static int xe_bo_move(struct ttm_buffer_object
> > *ttm_bo, bool evict,
> >  	bool needs_clear;
> >  	bool handle_system_ccs = (!IS_DGFX(xe) &&
> > xe_bo_needs_ccs_pages(bo) &&
> >  				  ttm && ttm_tt_is_populated(ttm))
> > ?
> > true : false;
> > +	int state = atomic_read(&bo->madv_purgeable);
> >  	int ret = 0;
> >  
> > +	if (evict && state == XE_MADV_PURGEABLE_DONTNEED) {
> > +		xe_ttm_bo_purge(ttm_bo, ctx);
> > +			return 0;
> > +	}
> > +
> >  	/* Bo creation path, moving to system or TT. */
> >  	if ((!old_mem && ttm) && !handle_system_ccs) {
> >  		if (new_mem->mem_type == XE_PL_TT)
> > @@ -1606,18 +1666,6 @@ static void
> > xe_ttm_bo_delete_mem_notify(struct
> > ttm_buffer_object *ttm_bo)
> >  	}
> >  }
> >  
> > -static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo,
> > struct
> > ttm_operation_ctx *ctx)
> > -{
> > -	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
> > -
> > -	if (ttm_bo->ttm) {
> > -		struct ttm_placement place = {};
> > -		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
> > -
> > -		drm_WARN_ON(&xe->drm, ret);
> > -	}
> > -}
> > -
> >  static void xe_ttm_bo_swap_notify(struct ttm_buffer_object
> > *ttm_bo)
> >  {
> >  	struct ttm_operation_ctx ctx = {
> > @@ -2472,6 +2520,9 @@ struct xe_bo *xe_bo_create_user(struct
> > xe_device *xe,
> >  				       ttm_bo_type_device, flags,
> > 0,
> > true);
> >  	}
> >  
> > +	/* Initialize purge advisory state */
> > +	atomic_set(&bo->madv_purgeable,
> > XE_MADV_PURGEABLE_WILLNEED);
> > +
> >  	return bo;
> >  }
> >  
> > diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c
> > b/drivers/gpu/drm/xe/xe_vm_madvise.c
> > index cad3cf627c3f..1f0356ea4403 100644
> > --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
> > +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
> > @@ -158,6 +158,54 @@ static void madvise_pat_index(struct xe_device
> > *xe, struct xe_vm *vm,
> >  	}
> >  }
> >  
> > +/*
> > + * Handle purgeable buffer object advice for
> > DONTNEED/WILLNEED/PURGED.
> > + * Returns 0 on success, negative errno on error.
> > + */
> > +static void xe_vm_madvise_purgeable_bo(struct xe_device *xe,
> > struct
> > xe_vm *vm,
> > +				       struct xe_vma **vmas, int
> > num_vmas,
> > +				       struct drm_xe_madvise *op,
> > struct drm_exec *exec)
> > +{
> > +
> > +	xe_assert(vm->xe, op->type ==
> > DRM_XE_VMA_ATTR_PURGEABLE_STATE);
> > +
> > +	for (int i = 0; i < num_vmas; i++) {
> > +		struct xe_bo *bo = xe_vma_bo(vmas[i]);
> > +		int state;
> > +		int ret;
> > +
> > +		if (!bo)
> > +			continue;
> > +
> > +		/* BO must be locked before modifying madv state
> > */
> > +		dma_resv_assert_held(bo->ttm.base.resv);
> > +
> > +		switch (op->purge_state_val.val) {
> > +		case DRM_XE_VMA_PURGEABLE_STATE_WILLNEED:
> > +			state = atomic_read(&bo->madv_purgeable);
> > +			if (state == XE_MADV_PURGEABLE_PURGED) {
> > +				ret = xe_bo_validate(bo, NULL,
> > true,
> > exec);
> > +				if (ret) {
> > +					drm_err(&vm->xe->drm,
> > +						"Failed to
> > validate
> > purged BO: %d\n", ret);
> > +					return;
> > +				}
> > +			}
> > +			atomic_set(&bo->madv_purgeable,
> > XE_MADV_PURGEABLE_WILLNEED);
> > +			break;
> > +		case DRM_XE_VMA_PURGEABLE_STATE_DONTNEED:
> > +			state = atomic_read(&bo->madv_purgeable);
> > +			if (state != XE_MADV_PURGEABLE_PURGED)
> > +				atomic_set(&bo->madv_purgeable,
> > XE_MADV_PURGEABLE_DONTNEED);
> > +			break;
> > +		default:
> > +			drm_warn(&vm->xe->drm, "Invalid madvice
> > value = %d\n",
> > +				 op->purge_state_val.val);
> > +			return;
> > +		}
> > +	}
> > +}
> > +
> >  typedef void (*madvise_func)(struct xe_device *xe, struct xe_vm
> > *vm,
> >  			     struct xe_vma **vmas, int num_vmas,
> >  			     struct drm_xe_madvise *op);
> > @@ -283,6 +331,19 @@ static bool madvise_args_are_sane(struct
> > xe_device *xe, const struct drm_xe_madv
> >  			return false;
> >  		break;
> >  	}
> > +	case DRM_XE_VMA_ATTR_PURGEABLE_STATE:
> > +	{
> > +		u32 val = args->purge_state_val.val;
> > +
> > +		if (XE_IOCTL_DBG(xe, !((val ==
> > DRM_XE_VMA_PURGEABLE_STATE_WILLNEED) ||
> > +				       (val ==
> > DRM_XE_VMA_PURGEABLE_STATE_DONTNEED))))
> > +			return false;
> > +
> > +		if (XE_IOCTL_DBG(xe, args-
> > > purge_state_val.reserved))
> > +			return false;
> > +
> > +		break;
> > +	}
> >  	default:
> >  		if (XE_IOCTL_DBG(xe, 1))
> >  			return false;
> > @@ -402,6 +463,12 @@ int xe_vm_madvise_ioctl(struct drm_device
> > *dev,
> > void *data, struct drm_file *fil
> >  					goto err_fini;
> >  			}
> >  		}
> > +		if (args->type == DRM_XE_VMA_ATTR_PURGEABLE_STATE)
> > {
> > +			xe_vm_madvise_purgeable_bo(xe, vm,
> > madvise_range.vmas,
> > +						  
> > madvise_range.num_vmas, args, &exec);
> > +			goto err_fini;
> > +
> > +		}
> >  	}
> >  
> >  	if (madvise_range.has_svm_userptr_vmas) {
> 


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support
  2025-10-29 10:51     ` Thomas Hellström
@ 2025-10-30  7:03       ` Yadav, Arvind
  2025-10-30  8:17         ` Thomas Hellström
  0 siblings, 1 reply; 22+ messages in thread
From: Yadav, Arvind @ 2025-10-30  7:03 UTC (permalink / raw)
  To: Thomas Hellström, intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray


On 29-10-2025 16:21, Thomas Hellström wrote:
> On Wed, 2025-10-29 at 09:55 +0100, Thomas Hellström wrote:
>> On Tue, 2025-10-28 at 17:54 +0530, Arvind Yadav wrote:
>>> This allows userspace applications to provide memory usage hints to
>>> the kernel for better memory management under pressure:
>>>
>>> - WILLNEED: BO will be needed again, re-validate if purged
>>> - DONTNEED: BO not currently needed, may be purged if needed
>>>
>>> When userspace marks BO as DONTNEED, the kernel can reclaim
>>> their memory during memory pressure. BO transition to PURGED
>>> state when reclaimed, and attempting to access purged buffers
>>> triggers appropriate fault handling.
>>>
>>> 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>
>>> ---
>>>   drivers/gpu/drm/xe/xe_bo.c         | 75 +++++++++++++++++++++++++-
>>> --
>>> --
>>>   drivers/gpu/drm/xe/xe_vm_madvise.c | 67 ++++++++++++++++++++++++++
>>>   2 files changed, 130 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c
>>> b/drivers/gpu/drm/xe/xe_bo.c
>>> index cbc3ee157218..3b3eb83658cc 100644
>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>> @@ -836,6 +836,60 @@ static int xe_bo_move_notify(struct xe_bo *bo,
>>>   	return 0;
>>>   }
>>>   
>>> +static int xe_bo_invalidate_tlb_before_purge(struct xe_bo *bo)
>> In the future someone might want to reuse this function for
>> invalidating somewhere else. Could we perhaps rename to
>> xe_bo_invalidate_vmas() or something like that?
Noted.
>>
>>
>>> +{
>>> +	struct drm_gpuvm_bo *vm_bo;
>>> +	struct drm_gpuva *gpuva;
>>> +	struct drm_gem_object *obj = &bo->ttm.base;
>>> +	int ret;
>>> +
>>> +	/* BO must be locked before invalidating */
>>> +	dma_resv_assert_held(bo->ttm.base.resv);
>>> +
>>> +	drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
>>> +		drm_gpuvm_bo_for_each_va(gpuva, vm_bo) {
>>> +			struct xe_vma *vma = gpuva_to_vma(gpuva);
>>> +
>>> +			ret = xe_vm_invalidate_vma(vma);
>>> +			if (ret)
>>> +				return ret;
>>> +		}
>>> +	}
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +static void xe_bo_set_purged(struct xe_bo *bo)
>>> +{
>>> +	/* BO must be locked before modifying madv state */
>>> +	dma_resv_assert_held(bo->ttm.base.resv);
>>> +
>>> +	atomic_set(&bo->madv_purgeable, XE_MADV_PURGEABLE_PURGED);
>>> +}
>>> +
>>> +static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo,
>>> struct
>>> ttm_operation_ctx *ctx)
>>> +{
>>> +	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
>>> +	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
>>> +
>>> +	if (ttm_bo->ttm) {
>>> +		struct ttm_placement place = {};
>>> +		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
>>> +		int ret_inval;
>> Christian from AMD once mentioned that instead of implicitly calling
>> ttm_bo_validate() with an empty placement, we could send the null
>> placement through the evict_flags callback. Would that work?
>>
>>
> Actually it doesn't since we don't get to call move_notify.
Agreed,
>>
>>> +
>>> +		drm_WARN_ON(&xe->drm, ret);
>>> +		if (!ret && bo) {
>>> +			if (atomic_read(&bo->madv_purgeable) ==
>>> XE_MADV_PURGEABLE_DONTNEED) {
>>> +				/* Invalidate TLB before marking
>>> BO
>>> as purged */
>>> +				ret_inval =
>>> xe_bo_invalidate_tlb_before_purge(bo);
>> Since the page-table update and page-freeing is really intended to be
>> an asynchronous operation, and the GPU bindings are intended to be
>> invalidated in move_notify() / trigger_rebind() where we properly
>> take
>> care of special cases like faulting VMs etc, can we move the
>> invalidation logic there?
>>
>> Perhaps it is even possible to skip the synchronous page-table
>> zeroing
>> here in favour of a NULL rebind (when rebinding a purged BO we set up
>> all zero mappings, or whatever mappings are required given scratch
>> page
>> mode etc.) Then the page-table clearing will be properly inserted in
>> the asynchronous execution.
>>

My understanding is that you are suggesting two main changes:

1. Asynchronous Invalidation: I should remove the synchronous 
xe_bo_invalidate_tlb_before_purge() call. Instead, I should rely on the 
existing asynchronous invalidation path that is already triggered during 
eviction via xe_bo_move_notify() -> xe_bo_trigger_rebind(). This will 
handle the TLB invalidation correctly and more efficiently.

2. NULL Rebind on Access(for VM Faulting Mode is ENABLED): When a GPU 
operation tries to bind a buffer that is in the PURGED state, the driver 
should not error. Instead, it should perform a "NULL rebind" by mapping 
the buffer's VMA to a scratch page. This ensures the GPU reads safe, 
zeroed data instead of accessing invalid memory.

The BO would only be re-allocated and re-bound when userspace explicitly 
Call WILLNEED.
I’ll now look into implementing the NULL rebind logic within the VMA 
mapping path and will follow up with an updated patch.

~Arvind
>>> +				if (!ret_inval)
>>> +					xe_bo_set_purged(bo);
>>> +
>>> +			}
>>> +		}
>>
>>
>>> +	}
>>> +}
>>> +
>>>   static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool
>>> evict,
>>>   		      struct ttm_operation_ctx *ctx,
>>>   		      struct ttm_resource *new_mem,
>>> @@ -853,8 +907,14 @@ static int xe_bo_move(struct ttm_buffer_object
>>> *ttm_bo, bool evict,
>>>   	bool needs_clear;
>>>   	bool handle_system_ccs = (!IS_DGFX(xe) &&
>>> xe_bo_needs_ccs_pages(bo) &&
>>>   				  ttm && ttm_tt_is_populated(ttm))
>>> ?
>>> true : false;
>>> +	int state = atomic_read(&bo->madv_purgeable);
>>>   	int ret = 0;
>>>   
>>> +	if (evict && state == XE_MADV_PURGEABLE_DONTNEED) {
>>> +		xe_ttm_bo_purge(ttm_bo, ctx);
>>> +			return 0;
>>> +	}
>>> +
>>>   	/* Bo creation path, moving to system or TT. */
>>>   	if ((!old_mem && ttm) && !handle_system_ccs) {
>>>   		if (new_mem->mem_type == XE_PL_TT)
>>> @@ -1606,18 +1666,6 @@ static void
>>> xe_ttm_bo_delete_mem_notify(struct
>>> ttm_buffer_object *ttm_bo)
>>>   	}
>>>   }
>>>   
>>> -static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo,
>>> struct
>>> ttm_operation_ctx *ctx)
>>> -{
>>> -	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
>>> -
>>> -	if (ttm_bo->ttm) {
>>> -		struct ttm_placement place = {};
>>> -		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
>>> -
>>> -		drm_WARN_ON(&xe->drm, ret);
>>> -	}
>>> -}
>>> -
>>>   static void xe_ttm_bo_swap_notify(struct ttm_buffer_object
>>> *ttm_bo)
>>>   {
>>>   	struct ttm_operation_ctx ctx = {
>>> @@ -2472,6 +2520,9 @@ struct xe_bo *xe_bo_create_user(struct
>>> xe_device *xe,
>>>   				       ttm_bo_type_device, flags,
>>> 0,
>>> true);
>>>   	}
>>>   
>>> +	/* Initialize purge advisory state */
>>> +	atomic_set(&bo->madv_purgeable,
>>> XE_MADV_PURGEABLE_WILLNEED);
>>> +
>>>   	return bo;
>>>   }
>>>   
>>> diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c
>>> b/drivers/gpu/drm/xe/xe_vm_madvise.c
>>> index cad3cf627c3f..1f0356ea4403 100644
>>> --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
>>> +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
>>> @@ -158,6 +158,54 @@ static void madvise_pat_index(struct xe_device
>>> *xe, struct xe_vm *vm,
>>>   	}
>>>   }
>>>   
>>> +/*
>>> + * Handle purgeable buffer object advice for
>>> DONTNEED/WILLNEED/PURGED.
>>> + * Returns 0 on success, negative errno on error.
>>> + */
>>> +static void xe_vm_madvise_purgeable_bo(struct xe_device *xe,
>>> struct
>>> xe_vm *vm,
>>> +				       struct xe_vma **vmas, int
>>> num_vmas,
>>> +				       struct drm_xe_madvise *op,
>>> struct drm_exec *exec)
>>> +{
>>> +
>>> +	xe_assert(vm->xe, op->type ==
>>> DRM_XE_VMA_ATTR_PURGEABLE_STATE);
>>> +
>>> +	for (int i = 0; i < num_vmas; i++) {
>>> +		struct xe_bo *bo = xe_vma_bo(vmas[i]);
>>> +		int state;
>>> +		int ret;
>>> +
>>> +		if (!bo)
>>> +			continue;
>>> +
>>> +		/* BO must be locked before modifying madv state
>>> */
>>> +		dma_resv_assert_held(bo->ttm.base.resv);
>>> +
>>> +		switch (op->purge_state_val.val) {
>>> +		case DRM_XE_VMA_PURGEABLE_STATE_WILLNEED:
>>> +			state = atomic_read(&bo->madv_purgeable);
>>> +			if (state == XE_MADV_PURGEABLE_PURGED) {
>>> +				ret = xe_bo_validate(bo, NULL,
>>> true,
>>> exec);
>>> +				if (ret) {
>>> +					drm_err(&vm->xe->drm,
>>> +						"Failed to
>>> validate
>>> purged BO: %d\n", ret);
>>> +					return;
>>> +				}
>>> +			}
>>> +			atomic_set(&bo->madv_purgeable,
>>> XE_MADV_PURGEABLE_WILLNEED);
>>> +			break;
>>> +		case DRM_XE_VMA_PURGEABLE_STATE_DONTNEED:
>>> +			state = atomic_read(&bo->madv_purgeable);
>>> +			if (state != XE_MADV_PURGEABLE_PURGED)
>>> +				atomic_set(&bo->madv_purgeable,
>>> XE_MADV_PURGEABLE_DONTNEED);
>>> +			break;
>>> +		default:
>>> +			drm_warn(&vm->xe->drm, "Invalid madvice
>>> value = %d\n",
>>> +				 op->purge_state_val.val);
>>> +			return;
>>> +		}
>>> +	}
>>> +}
>>> +
>>>   typedef void (*madvise_func)(struct xe_device *xe, struct xe_vm
>>> *vm,
>>>   			     struct xe_vma **vmas, int num_vmas,
>>>   			     struct drm_xe_madvise *op);
>>> @@ -283,6 +331,19 @@ static bool madvise_args_are_sane(struct
>>> xe_device *xe, const struct drm_xe_madv
>>>   			return false;
>>>   		break;
>>>   	}
>>> +	case DRM_XE_VMA_ATTR_PURGEABLE_STATE:
>>> +	{
>>> +		u32 val = args->purge_state_val.val;
>>> +
>>> +		if (XE_IOCTL_DBG(xe, !((val ==
>>> DRM_XE_VMA_PURGEABLE_STATE_WILLNEED) ||
>>> +				       (val ==
>>> DRM_XE_VMA_PURGEABLE_STATE_DONTNEED))))
>>> +			return false;
>>> +
>>> +		if (XE_IOCTL_DBG(xe, args-
>>>> purge_state_val.reserved))
>>> +			return false;
>>> +
>>> +		break;
>>> +	}
>>>   	default:
>>>   		if (XE_IOCTL_DBG(xe, 1))
>>>   			return false;
>>> @@ -402,6 +463,12 @@ int xe_vm_madvise_ioctl(struct drm_device
>>> *dev,
>>> void *data, struct drm_file *fil
>>>   					goto err_fini;
>>>   			}
>>>   		}
>>> +		if (args->type == DRM_XE_VMA_ATTR_PURGEABLE_STATE)
>>> {
>>> +			xe_vm_madvise_purgeable_bo(xe, vm,
>>> madvise_range.vmas,
>>> +						
>>> madvise_range.num_vmas, args, &exec);
>>> +			goto err_fini;
>>> +
>>> +		}
>>>   	}
>>>   
>>>   	if (madvise_range.has_svm_userptr_vmas) {

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support
  2025-10-30  7:03       ` Yadav, Arvind
@ 2025-10-30  8:17         ` Thomas Hellström
  2025-11-06  9:58           ` Yadav, Arvind
  0 siblings, 1 reply; 22+ messages in thread
From: Thomas Hellström @ 2025-10-30  8:17 UTC (permalink / raw)
  To: Yadav, Arvind, intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray

On Thu, 2025-10-30 at 12:33 +0530, Yadav, Arvind wrote:
> 
> On 29-10-2025 16:21, Thomas Hellström wrote:
> > On Wed, 2025-10-29 at 09:55 +0100, Thomas Hellström wrote:
> > > On Tue, 2025-10-28 at 17:54 +0530, Arvind Yadav wrote:
> > > > This allows userspace applications to provide memory usage
> > > > hints to
> > > > the kernel for better memory management under pressure:
> > > > 
> > > > - WILLNEED: BO will be needed again, re-validate if purged
> > > > - DONTNEED: BO not currently needed, may be purged if needed
> > > > 
> > > > When userspace marks BO as DONTNEED, the kernel can reclaim
> > > > their memory during memory pressure. BO transition to PURGED
> > > > state when reclaimed, and attempting to access purged buffers
> > > > triggers appropriate fault handling.
> > > > 
> > > > 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>
> > > > ---
> > > >   drivers/gpu/drm/xe/xe_bo.c         | 75
> > > > +++++++++++++++++++++++++-
> > > > --
> > > > --
> > > >   drivers/gpu/drm/xe/xe_vm_madvise.c | 67
> > > > ++++++++++++++++++++++++++
> > > >   2 files changed, 130 insertions(+), 12 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/xe/xe_bo.c
> > > > b/drivers/gpu/drm/xe/xe_bo.c
> > > > index cbc3ee157218..3b3eb83658cc 100644
> > > > --- a/drivers/gpu/drm/xe/xe_bo.c
> > > > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > > > @@ -836,6 +836,60 @@ static int xe_bo_move_notify(struct xe_bo
> > > > *bo,
> > > >   	return 0;
> > > >   }
> > > >   
> > > > +static int xe_bo_invalidate_tlb_before_purge(struct xe_bo *bo)
> > > In the future someone might want to reuse this function for
> > > invalidating somewhere else. Could we perhaps rename to
> > > xe_bo_invalidate_vmas() or something like that?
> Noted.
> > > 
> > > 
> > > > +{
> > > > +	struct drm_gpuvm_bo *vm_bo;
> > > > +	struct drm_gpuva *gpuva;
> > > > +	struct drm_gem_object *obj = &bo->ttm.base;
> > > > +	int ret;
> > > > +
> > > > +	/* BO must be locked before invalidating */
> > > > +	dma_resv_assert_held(bo->ttm.base.resv);
> > > > +
> > > > +	drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
> > > > +		drm_gpuvm_bo_for_each_va(gpuva, vm_bo) {
> > > > +			struct xe_vma *vma =
> > > > gpuva_to_vma(gpuva);
> > > > +
> > > > +			ret = xe_vm_invalidate_vma(vma);
> > > > +			if (ret)
> > > > +				return ret;
> > > > +		}
> > > > +	}
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static void xe_bo_set_purged(struct xe_bo *bo)
> > > > +{
> > > > +	/* BO must be locked before modifying madv state */
> > > > +	dma_resv_assert_held(bo->ttm.base.resv);
> > > > +
> > > > +	atomic_set(&bo->madv_purgeable,
> > > > XE_MADV_PURGEABLE_PURGED);
> > > > +}
> > > > +
> > > > +static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo,
> > > > struct
> > > > ttm_operation_ctx *ctx)
> > > > +{
> > > > +	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
> > > > +	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
> > > > +
> > > > +	if (ttm_bo->ttm) {
> > > > +		struct ttm_placement place = {};
> > > > +		int ret = ttm_bo_validate(ttm_bo, &place,
> > > > ctx);
> > > > +		int ret_inval;
> > > Christian from AMD once mentioned that instead of implicitly
> > > calling
> > > ttm_bo_validate() with an empty placement, we could send the null
> > > placement through the evict_flags callback. Would that work?
> > > 
> > > 
> > Actually it doesn't since we don't get to call move_notify.
> Agreed,
> > > 
> > > > +
> > > > +		drm_WARN_ON(&xe->drm, ret);
> > > > +		if (!ret && bo) {
> > > > +			if (atomic_read(&bo->madv_purgeable)
> > > > ==
> > > > XE_MADV_PURGEABLE_DONTNEED) {
> > > > +				/* Invalidate TLB before
> > > > marking
> > > > BO
> > > > as purged */
> > > > +				ret_inval =
> > > > xe_bo_invalidate_tlb_before_purge(bo);
> > > Since the page-table update and page-freeing is really intended
> > > to be
> > > an asynchronous operation, and the GPU bindings are intended to
> > > be
> > > invalidated in move_notify() / trigger_rebind() where we properly
> > > take
> > > care of special cases like faulting VMs etc, can we move the
> > > invalidation logic there?
> > > 
> > > Perhaps it is even possible to skip the synchronous page-table
> > > zeroing
> > > here in favour of a NULL rebind (when rebinding a purged BO we
> > > set up
> > > all zero mappings, or whatever mappings are required given
> > > scratch
> > > page
> > > mode etc.) Then the page-table clearing will be properly inserted
> > > in
> > > the asynchronous execution.
> > > 
> 
> My understanding is that you are suggesting two main changes:
> 
> 1. Asynchronous Invalidation: I should remove the synchronous 
> xe_bo_invalidate_tlb_before_purge() call. Instead, I should rely on
> the 
> existing asynchronous invalidation path that is already triggered
> during 
> eviction via xe_bo_move_notify() -> xe_bo_trigger_rebind(). This will
> handle the TLB invalidation correctly and more efficiently.
> 
> 2. NULL Rebind on Access(for VM Faulting Mode is ENABLED): When a GPU
> operation tries to bind a buffer that is in the PURGED state, the
> driver 
> should not error. Instead, it should perform a "NULL rebind" by
> mapping 
> the buffer's VMA to a scratch page. This ensures the GPU reads safe, 
> zeroed data instead of accessing invalid memory.

Yes. We want scratch PTEs if the VM is scratch-page-enabled, and the
"clear_pt" mode otherwise.

> 
> The BO would only be re-allocated and re-bound when userspace
> explicitly 
> Call WILLNEED.
> I’ll now look into implementing the NULL rebind logic within the VMA 
> mapping path and will follow up with an updated patch.

IMO we should try to mimic the i915 behaviour here, since it's already
implemented in mesa: That is, if we call WILLNEED on an already purged
bo, we return an error.

/Thomas
> 
> ~Arvind
> > > > +				if (!ret_inval)
> > > > +					xe_bo_set_purged(bo);
> > > > +
> > > > +			}
> > > > +		}
> > > 
> > > 
> > > > +	}
> > > > +}
> > > > +
> > > >   static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool
> > > > evict,
> > > >   		      struct ttm_operation_ctx *ctx,
> > > >   		      struct ttm_resource *new_mem,
> > > > @@ -853,8 +907,14 @@ static int xe_bo_move(struct
> > > > ttm_buffer_object
> > > > *ttm_bo, bool evict,
> > > >   	bool needs_clear;
> > > >   	bool handle_system_ccs = (!IS_DGFX(xe) &&
> > > > xe_bo_needs_ccs_pages(bo) &&
> > > >   				  ttm &&
> > > > ttm_tt_is_populated(ttm))
> > > > ?
> > > > true : false;
> > > > +	int state = atomic_read(&bo->madv_purgeable);
> > > >   	int ret = 0;
> > > >   
> > > > +	if (evict && state == XE_MADV_PURGEABLE_DONTNEED) {
> > > > +		xe_ttm_bo_purge(ttm_bo, ctx);
> > > > +			return 0;
> > > > +	}
> > > > +
> > > >   	/* Bo creation path, moving to system or TT. */
> > > >   	if ((!old_mem && ttm) && !handle_system_ccs) {
> > > >   		if (new_mem->mem_type == XE_PL_TT)
> > > > @@ -1606,18 +1666,6 @@ static void
> > > > xe_ttm_bo_delete_mem_notify(struct
> > > > ttm_buffer_object *ttm_bo)
> > > >   	}
> > > >   }
> > > >   
> > > > -static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo,
> > > > struct
> > > > ttm_operation_ctx *ctx)
> > > > -{
> > > > -	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
> > > > -
> > > > -	if (ttm_bo->ttm) {
> > > > -		struct ttm_placement place = {};
> > > > -		int ret = ttm_bo_validate(ttm_bo, &place,
> > > > ctx);
> > > > -
> > > > -		drm_WARN_ON(&xe->drm, ret);
> > > > -	}
> > > > -}
> > > > -
> > > >   static void xe_ttm_bo_swap_notify(struct ttm_buffer_object
> > > > *ttm_bo)
> > > >   {
> > > >   	struct ttm_operation_ctx ctx = {
> > > > @@ -2472,6 +2520,9 @@ struct xe_bo *xe_bo_create_user(struct
> > > > xe_device *xe,
> > > >   				       ttm_bo_type_device,
> > > > flags,
> > > > 0,
> > > > true);
> > > >   	}
> > > >   
> > > > +	/* Initialize purge advisory state */
> > > > +	atomic_set(&bo->madv_purgeable,
> > > > XE_MADV_PURGEABLE_WILLNEED);
> > > > +
> > > >   	return bo;
> > > >   }
> > > >   
> > > > diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c
> > > > b/drivers/gpu/drm/xe/xe_vm_madvise.c
> > > > index cad3cf627c3f..1f0356ea4403 100644
> > > > --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
> > > > +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
> > > > @@ -158,6 +158,54 @@ static void madvise_pat_index(struct
> > > > xe_device
> > > > *xe, struct xe_vm *vm,
> > > >   	}
> > > >   }
> > > >   
> > > > +/*
> > > > + * Handle purgeable buffer object advice for
> > > > DONTNEED/WILLNEED/PURGED.
> > > > + * Returns 0 on success, negative errno on error.
> > > > + */
> > > > +static void xe_vm_madvise_purgeable_bo(struct xe_device *xe,
> > > > struct
> > > > xe_vm *vm,
> > > > +				       struct xe_vma **vmas,
> > > > int
> > > > num_vmas,
> > > > +				       struct drm_xe_madvise
> > > > *op,
> > > > struct drm_exec *exec)
> > > > +{
> > > > +
> > > > +	xe_assert(vm->xe, op->type ==
> > > > DRM_XE_VMA_ATTR_PURGEABLE_STATE);
> > > > +
> > > > +	for (int i = 0; i < num_vmas; i++) {
> > > > +		struct xe_bo *bo = xe_vma_bo(vmas[i]);
> > > > +		int state;
> > > > +		int ret;
> > > > +
> > > > +		if (!bo)
> > > > +			continue;
> > > > +
> > > > +		/* BO must be locked before modifying madv
> > > > state
> > > > */
> > > > +		dma_resv_assert_held(bo->ttm.base.resv);
> > > > +
> > > > +		switch (op->purge_state_val.val) {
> > > > +		case DRM_XE_VMA_PURGEABLE_STATE_WILLNEED:
> > > > +			state = atomic_read(&bo-
> > > > >madv_purgeable);
> > > > +			if (state == XE_MADV_PURGEABLE_PURGED)
> > > > {
> > > > +				ret = xe_bo_validate(bo, NULL,
> > > > true,
> > > > exec);
> > > > +				if (ret) {
> > > > +					drm_err(&vm->xe->drm,
> > > > +						"Failed to
> > > > validate
> > > > purged BO: %d\n", ret);
> > > > +					return;
> > > > +				}
> > > > +			}
> > > > +			atomic_set(&bo->madv_purgeable,
> > > > XE_MADV_PURGEABLE_WILLNEED);
> > > > +			break;
> > > > +		case DRM_XE_VMA_PURGEABLE_STATE_DONTNEED:
> > > > +			state = atomic_read(&bo-
> > > > >madv_purgeable);
> > > > +			if (state != XE_MADV_PURGEABLE_PURGED)
> > > > +				atomic_set(&bo-
> > > > >madv_purgeable,
> > > > XE_MADV_PURGEABLE_DONTNEED);
> > > > +			break;
> > > > +		default:
> > > > +			drm_warn(&vm->xe->drm, "Invalid
> > > > madvice
> > > > value = %d\n",
> > > > +				 op->purge_state_val.val);
> > > > +			return;
> > > > +		}
> > > > +	}
> > > > +}
> > > > +
> > > >   typedef void (*madvise_func)(struct xe_device *xe, struct
> > > > xe_vm
> > > > *vm,
> > > >   			     struct xe_vma **vmas, int
> > > > num_vmas,
> > > >   			     struct drm_xe_madvise *op);
> > > > @@ -283,6 +331,19 @@ static bool madvise_args_are_sane(struct
> > > > xe_device *xe, const struct drm_xe_madv
> > > >   			return false;
> > > >   		break;
> > > >   	}
> > > > +	case DRM_XE_VMA_ATTR_PURGEABLE_STATE:
> > > > +	{
> > > > +		u32 val = args->purge_state_val.val;
> > > > +
> > > > +		if (XE_IOCTL_DBG(xe, !((val ==
> > > > DRM_XE_VMA_PURGEABLE_STATE_WILLNEED) ||
> > > > +				       (val ==
> > > > DRM_XE_VMA_PURGEABLE_STATE_DONTNEED))))
> > > > +			return false;
> > > > +
> > > > +		if (XE_IOCTL_DBG(xe, args-
> > > > > purge_state_val.reserved))
> > > > +			return false;
> > > > +
> > > > +		break;
> > > > +	}
> > > >   	default:
> > > >   		if (XE_IOCTL_DBG(xe, 1))
> > > >   			return false;
> > > > @@ -402,6 +463,12 @@ int xe_vm_madvise_ioctl(struct drm_device
> > > > *dev,
> > > > void *data, struct drm_file *fil
> > > >   					goto err_fini;
> > > >   			}
> > > >   		}
> > > > +		if (args->type ==
> > > > DRM_XE_VMA_ATTR_PURGEABLE_STATE)
> > > > {
> > > > +			xe_vm_madvise_purgeable_bo(xe, vm,
> > > > madvise_range.vmas,
> > > > +						
> > > > madvise_range.num_vmas, args, &exec);
> > > > +			goto err_fini;
> > > > +
> > > > +		}
> > > >   	}
> > > >   
> > > >   	if (madvise_range.has_svm_userptr_vmas) {


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support
  2025-10-30  8:17         ` Thomas Hellström
@ 2025-11-06  9:58           ` Yadav, Arvind
  0 siblings, 0 replies; 22+ messages in thread
From: Yadav, Arvind @ 2025-11-06  9:58 UTC (permalink / raw)
  To: Thomas Hellström, intel-xe; +Cc: matthew.brost, himal.prasad.ghimiray


On 30-10-2025 13:47, Thomas Hellström wrote:
> On Thu, 2025-10-30 at 12:33 +0530, Yadav, Arvind wrote:
>> On 29-10-2025 16:21, Thomas Hellström wrote:
>>> On Wed, 2025-10-29 at 09:55 +0100, Thomas Hellström wrote:
>>>> On Tue, 2025-10-28 at 17:54 +0530, Arvind Yadav wrote:
>>>>> This allows userspace applications to provide memory usage
>>>>> hints to
>>>>> the kernel for better memory management under pressure:
>>>>>
>>>>> - WILLNEED: BO will be needed again, re-validate if purged
>>>>> - DONTNEED: BO not currently needed, may be purged if needed
>>>>>
>>>>> When userspace marks BO as DONTNEED, the kernel can reclaim
>>>>> their memory during memory pressure. BO transition to PURGED
>>>>> state when reclaimed, and attempting to access purged buffers
>>>>> triggers appropriate fault handling.
>>>>>
>>>>> 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>
>>>>> ---
>>>>>    drivers/gpu/drm/xe/xe_bo.c         | 75
>>>>> +++++++++++++++++++++++++-
>>>>> --
>>>>> --
>>>>>    drivers/gpu/drm/xe/xe_vm_madvise.c | 67
>>>>> ++++++++++++++++++++++++++
>>>>>    2 files changed, 130 insertions(+), 12 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c
>>>>> b/drivers/gpu/drm/xe/xe_bo.c
>>>>> index cbc3ee157218..3b3eb83658cc 100644
>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>> @@ -836,6 +836,60 @@ static int xe_bo_move_notify(struct xe_bo
>>>>> *bo,
>>>>>    	return 0;
>>>>>    }
>>>>>    
>>>>> +static int xe_bo_invalidate_tlb_before_purge(struct xe_bo *bo)
>>>> In the future someone might want to reuse this function for
>>>> invalidating somewhere else. Could we perhaps rename to
>>>> xe_bo_invalidate_vmas() or something like that?
>> Noted.
>>>>
>>>>> +{
>>>>> +	struct drm_gpuvm_bo *vm_bo;
>>>>> +	struct drm_gpuva *gpuva;
>>>>> +	struct drm_gem_object *obj = &bo->ttm.base;
>>>>> +	int ret;
>>>>> +
>>>>> +	/* BO must be locked before invalidating */
>>>>> +	dma_resv_assert_held(bo->ttm.base.resv);
>>>>> +
>>>>> +	drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
>>>>> +		drm_gpuvm_bo_for_each_va(gpuva, vm_bo) {
>>>>> +			struct xe_vma *vma =
>>>>> gpuva_to_vma(gpuva);
>>>>> +
>>>>> +			ret = xe_vm_invalidate_vma(vma);
>>>>> +			if (ret)
>>>>> +				return ret;
>>>>> +		}
>>>>> +	}
>>>>> +
>>>>> +	return 0;
>>>>> +}
>>>>> +
>>>>> +static void xe_bo_set_purged(struct xe_bo *bo)
>>>>> +{
>>>>> +	/* BO must be locked before modifying madv state */
>>>>> +	dma_resv_assert_held(bo->ttm.base.resv);
>>>>> +
>>>>> +	atomic_set(&bo->madv_purgeable,
>>>>> XE_MADV_PURGEABLE_PURGED);
>>>>> +}
>>>>> +
>>>>> +static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo,
>>>>> struct
>>>>> ttm_operation_ctx *ctx)
>>>>> +{
>>>>> +	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
>>>>> +	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
>>>>> +
>>>>> +	if (ttm_bo->ttm) {
>>>>> +		struct ttm_placement place = {};
>>>>> +		int ret = ttm_bo_validate(ttm_bo, &place,
>>>>> ctx);
>>>>> +		int ret_inval;
>>>> Christian from AMD once mentioned that instead of implicitly
>>>> calling
>>>> ttm_bo_validate() with an empty placement, we could send the null
>>>> placement through the evict_flags callback. Would that work?
>>>>
>>>>
>>> Actually it doesn't since we don't get to call move_notify.
>> Agreed,
>>>>> +
>>>>> +		drm_WARN_ON(&xe->drm, ret);
>>>>> +		if (!ret && bo) {
>>>>> +			if (atomic_read(&bo->madv_purgeable)
>>>>> ==
>>>>> XE_MADV_PURGEABLE_DONTNEED) {
>>>>> +				/* Invalidate TLB before
>>>>> marking
>>>>> BO
>>>>> as purged */
>>>>> +				ret_inval =
>>>>> xe_bo_invalidate_tlb_before_purge(bo);
>>>> Since the page-table update and page-freeing is really intended
>>>> to be
>>>> an asynchronous operation, and the GPU bindings are intended to
>>>> be
>>>> invalidated in move_notify() / trigger_rebind() where we properly
>>>> take
>>>> care of special cases like faulting VMs etc, can we move the
>>>> invalidation logic there?
>>>>
>>>> Perhaps it is even possible to skip the synchronous page-table
>>>> zeroing
>>>> here in favour of a NULL rebind (when rebinding a purged BO we
>>>> set up
>>>> all zero mappings, or whatever mappings are required given
>>>> scratch
>>>> page
>>>> mode etc.) Then the page-table clearing will be properly inserted
>>>> in
>>>> the asynchronous execution.
>>>>
>> My understanding is that you are suggesting two main changes:
>>
>> 1. Asynchronous Invalidation: I should remove the synchronous
>> xe_bo_invalidate_tlb_before_purge() call. Instead, I should rely on
>> the
>> existing asynchronous invalidation path that is already triggered
>> during
>> eviction via xe_bo_move_notify() -> xe_bo_trigger_rebind(). This will
>> handle the TLB invalidation correctly and more efficiently.
>>
>> 2. NULL Rebind on Access(for VM Faulting Mode is ENABLED): When a GPU
>> operation tries to bind a buffer that is in the PURGED state, the
>> driver
>> should not error. Instead, it should perform a "NULL rebind" by
>> mapping
>> the buffer's VMA to a scratch page. This ensures the GPU reads safe,
>> zeroed data instead of accessing invalid memory.
> Yes. We want scratch PTEs if the VM is scratch-page-enabled, and the
> "clear_pt" mode otherwise.


With the current approach, we invoke xe_vm_invalidate_vma, which 
internally calls xe_pt_zap_ptes to clear the page tables.
For handling the "NULL rebind" scenario, we can utilize 
__xe_pt_empty_pte, which effectively writes either scratch or zero PTEs 
based on the VM configuration.
I'm considering routing this through the vm-ops pipeline, as all page 
table modifications are expected to go through this path 
(vm_bind_ioctl_ops_* → xe_pt_update_ops_*). Specifically,
we can issue an UNMAP operation for all GPUVAs of the BO in the VM. This 
will trigger xe_migrate_clear_pgtable_callback, which is designed to 
handle page table clearing.

>
>> The BO would only be re-allocated and re-bound when userspace
>> explicitly
>> Call WILLNEED.
>> I’ll now look into implementing the NULL rebind logic within the VMA
>> mapping path and will follow up with an updated patch.
> IMO we should try to mimic the i915 behaviour here, since it's already
> implemented in mesa: That is, if we call WILLNEED on an already purged
> bo, we return an error.

Noted.

~Arvind

> /Thomas
>> ~Arvind
>>>>> +				if (!ret_inval)
>>>>> +					xe_bo_set_purged(bo);
>>>>> +
>>>>> +			}
>>>>> +		}
>>>>
>>>>> +	}
>>>>> +}
>>>>> +
>>>>>    static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool
>>>>> evict,
>>>>>    		      struct ttm_operation_ctx *ctx,
>>>>>    		      struct ttm_resource *new_mem,
>>>>> @@ -853,8 +907,14 @@ static int xe_bo_move(struct
>>>>> ttm_buffer_object
>>>>> *ttm_bo, bool evict,
>>>>>    	bool needs_clear;
>>>>>    	bool handle_system_ccs = (!IS_DGFX(xe) &&
>>>>> xe_bo_needs_ccs_pages(bo) &&
>>>>>    				  ttm &&
>>>>> ttm_tt_is_populated(ttm))
>>>>> ?
>>>>> true : false;
>>>>> +	int state = atomic_read(&bo->madv_purgeable);
>>>>>    	int ret = 0;
>>>>>    
>>>>> +	if (evict && state == XE_MADV_PURGEABLE_DONTNEED) {
>>>>> +		xe_ttm_bo_purge(ttm_bo, ctx);
>>>>> +			return 0;
>>>>> +	}
>>>>> +
>>>>>    	/* Bo creation path, moving to system or TT. */
>>>>>    	if ((!old_mem && ttm) && !handle_system_ccs) {
>>>>>    		if (new_mem->mem_type == XE_PL_TT)
>>>>> @@ -1606,18 +1666,6 @@ static void
>>>>> xe_ttm_bo_delete_mem_notify(struct
>>>>> ttm_buffer_object *ttm_bo)
>>>>>    	}
>>>>>    }
>>>>>    
>>>>> -static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo,
>>>>> struct
>>>>> ttm_operation_ctx *ctx)
>>>>> -{
>>>>> -	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
>>>>> -
>>>>> -	if (ttm_bo->ttm) {
>>>>> -		struct ttm_placement place = {};
>>>>> -		int ret = ttm_bo_validate(ttm_bo, &place,
>>>>> ctx);
>>>>> -
>>>>> -		drm_WARN_ON(&xe->drm, ret);
>>>>> -	}
>>>>> -}
>>>>> -
>>>>>    static void xe_ttm_bo_swap_notify(struct ttm_buffer_object
>>>>> *ttm_bo)
>>>>>    {
>>>>>    	struct ttm_operation_ctx ctx = {
>>>>> @@ -2472,6 +2520,9 @@ struct xe_bo *xe_bo_create_user(struct
>>>>> xe_device *xe,
>>>>>    				       ttm_bo_type_device,
>>>>> flags,
>>>>> 0,
>>>>> true);
>>>>>    	}
>>>>>    
>>>>> +	/* Initialize purge advisory state */
>>>>> +	atomic_set(&bo->madv_purgeable,
>>>>> XE_MADV_PURGEABLE_WILLNEED);
>>>>> +
>>>>>    	return bo;
>>>>>    }
>>>>>    
>>>>> diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c
>>>>> b/drivers/gpu/drm/xe/xe_vm_madvise.c
>>>>> index cad3cf627c3f..1f0356ea4403 100644
>>>>> --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
>>>>> +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
>>>>> @@ -158,6 +158,54 @@ static void madvise_pat_index(struct
>>>>> xe_device
>>>>> *xe, struct xe_vm *vm,
>>>>>    	}
>>>>>    }
>>>>>    
>>>>> +/*
>>>>> + * Handle purgeable buffer object advice for
>>>>> DONTNEED/WILLNEED/PURGED.
>>>>> + * Returns 0 on success, negative errno on error.
>>>>> + */
>>>>> +static void xe_vm_madvise_purgeable_bo(struct xe_device *xe,
>>>>> struct
>>>>> xe_vm *vm,
>>>>> +				       struct xe_vma **vmas,
>>>>> int
>>>>> num_vmas,
>>>>> +				       struct drm_xe_madvise
>>>>> *op,
>>>>> struct drm_exec *exec)
>>>>> +{
>>>>> +
>>>>> +	xe_assert(vm->xe, op->type ==
>>>>> DRM_XE_VMA_ATTR_PURGEABLE_STATE);
>>>>> +
>>>>> +	for (int i = 0; i < num_vmas; i++) {
>>>>> +		struct xe_bo *bo = xe_vma_bo(vmas[i]);
>>>>> +		int state;
>>>>> +		int ret;
>>>>> +
>>>>> +		if (!bo)
>>>>> +			continue;
>>>>> +
>>>>> +		/* BO must be locked before modifying madv
>>>>> state
>>>>> */
>>>>> +		dma_resv_assert_held(bo->ttm.base.resv);
>>>>> +
>>>>> +		switch (op->purge_state_val.val) {
>>>>> +		case DRM_XE_VMA_PURGEABLE_STATE_WILLNEED:
>>>>> +			state = atomic_read(&bo-
>>>>>> madv_purgeable);
>>>>> +			if (state == XE_MADV_PURGEABLE_PURGED)
>>>>> {
>>>>> +				ret = xe_bo_validate(bo, NULL,
>>>>> true,
>>>>> exec);
>>>>> +				if (ret) {
>>>>> +					drm_err(&vm->xe->drm,
>>>>> +						"Failed to
>>>>> validate
>>>>> purged BO: %d\n", ret);
>>>>> +					return;
>>>>> +				}
>>>>> +			}
>>>>> +			atomic_set(&bo->madv_purgeable,
>>>>> XE_MADV_PURGEABLE_WILLNEED);
>>>>> +			break;
>>>>> +		case DRM_XE_VMA_PURGEABLE_STATE_DONTNEED:
>>>>> +			state = atomic_read(&bo-
>>>>>> madv_purgeable);
>>>>> +			if (state != XE_MADV_PURGEABLE_PURGED)
>>>>> +				atomic_set(&bo-
>>>>>> madv_purgeable,
>>>>> XE_MADV_PURGEABLE_DONTNEED);
>>>>> +			break;
>>>>> +		default:
>>>>> +			drm_warn(&vm->xe->drm, "Invalid
>>>>> madvice
>>>>> value = %d\n",
>>>>> +				 op->purge_state_val.val);
>>>>> +			return;
>>>>> +		}
>>>>> +	}
>>>>> +}
>>>>> +
>>>>>    typedef void (*madvise_func)(struct xe_device *xe, struct
>>>>> xe_vm
>>>>> *vm,
>>>>>    			     struct xe_vma **vmas, int
>>>>> num_vmas,
>>>>>    			     struct drm_xe_madvise *op);
>>>>> @@ -283,6 +331,19 @@ static bool madvise_args_are_sane(struct
>>>>> xe_device *xe, const struct drm_xe_madv
>>>>>    			return false;
>>>>>    		break;
>>>>>    	}
>>>>> +	case DRM_XE_VMA_ATTR_PURGEABLE_STATE:
>>>>> +	{
>>>>> +		u32 val = args->purge_state_val.val;
>>>>> +
>>>>> +		if (XE_IOCTL_DBG(xe, !((val ==
>>>>> DRM_XE_VMA_PURGEABLE_STATE_WILLNEED) ||
>>>>> +				       (val ==
>>>>> DRM_XE_VMA_PURGEABLE_STATE_DONTNEED))))
>>>>> +			return false;
>>>>> +
>>>>> +		if (XE_IOCTL_DBG(xe, args-
>>>>>> purge_state_val.reserved))
>>>>> +			return false;
>>>>> +
>>>>> +		break;
>>>>> +	}
>>>>>    	default:
>>>>>    		if (XE_IOCTL_DBG(xe, 1))
>>>>>    			return false;
>>>>> @@ -402,6 +463,12 @@ int xe_vm_madvise_ioctl(struct drm_device
>>>>> *dev,
>>>>> void *data, struct drm_file *fil
>>>>>    					goto err_fini;
>>>>>    			}
>>>>>    		}
>>>>> +		if (args->type ==
>>>>> DRM_XE_VMA_ATTR_PURGEABLE_STATE)
>>>>> {
>>>>> +			xe_vm_madvise_purgeable_bo(xe, vm,
>>>>> madvise_range.vmas,
>>>>> +						
>>>>> madvise_range.num_vmas, args, &exec);
>>>>> +			goto err_fini;
>>>>> +
>>>>> +		}
>>>>>    	}
>>>>>    
>>>>>    	if (madvise_range.has_svm_userptr_vmas) {

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2025-11-06  9:58 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-28 12:24 [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Arvind Yadav
2025-10-28 12:24 ` [RFC PATCH 1/9] drm/xe/uapi: Add UAPI " Arvind Yadav
2025-10-28 12:24 ` [RFC PATCH 2/9] drm/xe/bo: Add purgeable bo state tracking and field madv to xe_bo Arvind Yadav
2025-10-28 12:24 ` [RFC PATCH 3/9] drm/xe/madvise: Implement purgeable buffer object support Arvind Yadav
2025-10-29  8:55   ` Thomas Hellström
2025-10-29 10:51     ` Thomas Hellström
2025-10-30  7:03       ` Yadav, Arvind
2025-10-30  8:17         ` Thomas Hellström
2025-11-06  9:58           ` Yadav, Arvind
2025-10-28 12:24 ` [RFC PATCH 4/9] drm/xe/bo: Prevent purging of shared buffer objects Arvind Yadav
2025-10-28 12:24 ` [RFC PATCH 5/9] drm/xe/bo: Handle CPU faults on purged " Arvind Yadav
2025-10-28 12:24 ` [RFC PATCH 6/9] drm/xe/bo: Prevent mmap of " Arvind Yadav
2025-10-28 12:24 ` [RFC PATCH 7/9] drm/xe/vm: Prevent binding " Arvind Yadav
2025-10-28 12:24 ` [RFC PATCH 8/9] drm/xe/uapi: Add UAPI for purgeable bo state to madvise query response Arvind Yadav
2025-10-28 12:24 ` [RFC PATCH 9/9] drm/xe: Add support for querying purgeable BO states Arvind Yadav
2025-10-28 12:37 ` [RFC PATCH 0/9] drm/xe/madvise: Add support for purgeable buffer objects Thomas Hellström
2025-10-28 13:02   ` Matthew Auld
2025-10-29  8:40     ` Yadav, Arvind
2025-10-28 13:23 ` ✗ CI.checkpatch: warning for " Patchwork
2025-10-28 13:24 ` ✓ CI.KUnit: success " Patchwork
2025-10-28 14:12 ` ✗ Xe.CI.BAT: failure " Patchwork
2025-10-28 19:44 ` ✗ Xe.CI.Full: " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox