Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V18 00/14] Add memory page offlining support
@ 2026-08-26 13:51 Tejas Upadhyay
  2026-08-26 13:51 ` [PATCH V18 01/14] drm/xe: Link VRAM object with gpu buddy Tejas Upadhyay
                   ` (17 more replies)
  0 siblings, 18 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

This functionality represents a significant step in making
the xe driver gracefully handle hardware memory degradation.
By integrating with the DRM Buddy allocator, the driver
can permanently "carve out" faulty memory so it isn't reused
by subsequent allocations.

IGT tests for testing this via injecting simple single address and
duplicate address fault to unit test functionality:
https://patchwork.freedesktop.org/patch/748439/?series=170555&rev=2

v18:
- Splitting out the sysfs patch; it will come later once it is redesigned
- Address sashiko reivew comments
- Add debugfs and adjust igt tests and fault injection
v17:
- Rebase on drm-tip
- Enforce CONFIG_FAULT_INJECTION_DEBUG_FS for fault inject
v16:
- Correct sysfs patches with moving code with rcu lock
- In case purge fail let next alloc decide final failure
- Remove addr_to_block API, its being pulled from drm-tip
- Remove some unused code and replace where existing API can be used
v15:
- Split few big patches into small
- Avoid vram_mgr lock in sysfs
- fix missing queue_pages counter increment
v14:
- Solve sashiko reviews
- Remove SOFT->HARD offline patch, decision is taken based on -EEXIST
- Dump gpu buddy allocated patch dropped
v13:
- Add fault inject and remove standlone debugfs
v12:
- Fix Sashiko review comments
v11:
- Add BAN reason for UMD to know about offlining
- Add support for soft offline mode
- Rebase and remove dummy lockdep annotation patch, as it merged from upstream
v10:
- Remove RFC
v7:
- Improve debugfs warning messages
- Use scope_guard for locking(MattB)
- Adapt addition of queue member of LRC BO(MattB)
- Extend and use xe_ttm_bo_purge API for vram pages(MattB)
- Handle dma_buf_map requests for native and remote(MattB)
- Address if in never initialized block, set block to NULL
- Add lockdep in gpu buddy (MattB)
- Correct allocated_addr_to_block logic (MattA)
V6:
- Add more specific tests to noncritical bo sections
- Handle smooth exit of user created exec queues
- Break code and make purge specific static API
V5:
- Sysfs "max_pages" addition
- Reset block->private NULL post purge
- Remove wedge, return -EIO to system controller will initiate reset
- Add debugfs tests to trigger different test scenarios manually and via igt
- Rename addr_to_tbo to addr_to_block and move under gpu/buddy.c
V4: API reworks, add configfs for policy reservation and apply config everywhere
V3: use res_to_mem_region to avoid use of block->private (MattA)
V2:
- some fixes and clean up on errors
- Added xe_vram_addr_to_region helper to avoid other use of block->private(MattB)

Tejas Upadhyay (14):
  drm/xe: Link VRAM object with gpu buddy
  drm/xe: Link LRC BO and its execution Queue
  drm/xe: Extend BO purge to handle vram pages as well
  drm/xe/bo: Make xe_bo_is_user() public
  drm/xe: Guard teardown paths against purged BOs
  drm/xe/vram: Extract buddy alloc and free helpers
  drm/xe/vram: Add page offline data structures and lifecycle
  drm/xe/vram: Add VRAM page offline fault handler
  drm/xe/configfs: Add bad_page_reservation attribute
  drm/xe/ras: Cache bad_page_reservation policy at init
  drm/xe/vram: Check bad_page_reservation policy in fault handler
  drm/xe: Expose bad VRAM pages via debugfs
  drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
  drm/xe: Add fault-inject based VRAM page offline injection

 drivers/gpu/drm/xe/xe_bo.c                 |  13 +-
 drivers/gpu/drm/xe/xe_bo.h                 |   5 +-
 drivers/gpu/drm/xe/xe_bo_types.h           |   3 +
 drivers/gpu/drm/xe/xe_configfs.c           |  67 ++-
 drivers/gpu/drm/xe/xe_configfs.h           |   2 +
 drivers/gpu/drm/xe/xe_debugfs.c            |  51 ++
 drivers/gpu/drm/xe/xe_debugfs.h            |   2 +
 drivers/gpu/drm/xe/xe_dma_buf.c            |   3 +
 drivers/gpu/drm/xe/xe_drm_ras_types.h      |   3 +
 drivers/gpu/drm/xe/xe_exec_queue.c         |  14 +-
 drivers/gpu/drm/xe/xe_exec_queue_types.h   |   7 +-
 drivers/gpu/drm/xe/xe_execlist.c           |   4 +-
 drivers/gpu/drm/xe/xe_guc_submit.c         |  36 +-
 drivers/gpu/drm/xe/xe_lrc.c                |   1 +
 drivers/gpu/drm/xe/xe_pt.c                 |   3 +-
 drivers/gpu/drm/xe/xe_ras.c                |   5 +
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c       | 540 ++++++++++++++++++++-
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.h       |   4 +
 drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h |  40 ++
 include/uapi/drm/xe_drm.h                  |  18 +-
 20 files changed, 776 insertions(+), 45 deletions(-)

-- 
2.52.0


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

* [PATCH V18 01/14] drm/xe: Link VRAM object with gpu buddy
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 22:31   ` Andi Shyti
  2026-08-26 13:51 ` [PATCH V18 02/14] drm/xe: Link LRC BO and its execution Queue Tejas Upadhyay
                   ` (16 subsequent siblings)
  17 siblings, 1 reply; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay, Matthew Brost

Setup to link TTM buffer object inside gpu buddy. This functionality
is critical for supporting the memory page offline feature on CRI,
where identified faulty pages must be traced back to their
originating buffer for safe removal.

V2(MattB): Clear block->private in xe_ttm_vram_mgr_del as well

Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index 05911904c1f9..51e983ee3bad 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -57,6 +57,7 @@ static int xe_ttm_vram_mgr_new(struct ttm_resource_manager *man,
 	struct xe_ttm_vram_mgr *mgr = to_xe_ttm_vram_mgr(man);
 	struct xe_ttm_vram_mgr_resource *vres;
 	struct gpu_buddy *mm = &mgr->mm;
+	struct gpu_buddy_block *block;
 	u64 size, min_page_size;
 	unsigned long lpfn;
 	int err;
@@ -141,6 +142,8 @@ static int xe_ttm_vram_mgr_new(struct ttm_resource_manager *man,
 	}
 
 	mgr->visible_avail -= vres->used_visible_size;
+	list_for_each_entry(block, &vres->blocks, link)
+		block->private = tbo;
 	mutex_unlock(&mgr->lock);
 
 	if (!(vres->base.placement & TTM_PL_FLAG_CONTIGUOUS) &&
@@ -179,8 +182,11 @@ static void xe_ttm_vram_mgr_del(struct ttm_resource_manager *man,
 		to_xe_ttm_vram_mgr_resource(res);
 	struct xe_ttm_vram_mgr *mgr = to_xe_ttm_vram_mgr(man);
 	struct gpu_buddy *mm = &mgr->mm;
+	struct gpu_buddy_block *block;
 
 	mutex_lock(&mgr->lock);
+	list_for_each_entry(block, &vres->blocks, link)
+		block->private = NULL;
 	gpu_buddy_free_list(mm, &vres->blocks, 0);
 	mgr->visible_avail += vres->used_visible_size;
 	mutex_unlock(&mgr->lock);
-- 
2.52.0


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

* [PATCH V18 02/14] drm/xe: Link LRC BO and its execution Queue
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
  2026-08-26 13:51 ` [PATCH V18 01/14] drm/xe: Link VRAM object with gpu buddy Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 22:34   ` Andi Shyti
  2026-08-26 13:51 ` [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well Tejas Upadhyay
                   ` (15 subsequent siblings)
  17 siblings, 1 reply; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

To establish a link between an LRC BO (Logical Ring Context
Buffer Object) and its corresponding execution Queue in the
drm/xe driver, you need to store a back-pointer to the queue
within the BO's private data structure. This allows the
driver to identify and take corrective action on the specific
queue if the LRC BO encounters an error (e.g., memory
corruption or eviction issues).

V3(Sashiko):
- Placeholder of 8 byte for non-lrc bo is acceptable
- Assign bo-q is safe just use READ_ONCE/WRITE_ONCE
V2(MattB):
- Handle multiqueue

Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_bo_types.h   | 3 +++
 drivers/gpu/drm/xe/xe_exec_queue.c | 6 ++++++
 drivers/gpu/drm/xe/xe_lrc.c        | 1 +
 3 files changed, 10 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h
index e45f24301050..a9c48e440669 100644
--- a/drivers/gpu/drm/xe/xe_bo_types.h
+++ b/drivers/gpu/drm/xe/xe_bo_types.h
@@ -20,6 +20,7 @@
 struct xe_device;
 struct xe_mem_pool_node;
 struct xe_vm;
+struct xe_exec_queue;
 
 #define XE_BO_MAX_PLACEMENTS	3
 
@@ -42,6 +43,8 @@ struct xe_bo {
 	u32 flags;
 	/** @vm: VM this BO is attached to, for extobj this will be NULL */
 	struct xe_vm *vm;
+	/** @q: Queue this BO is attached to, mostly for LRC BO, NULL otherwise */
+	struct xe_exec_queue *q;
 	/** @tile: Tile this BO is attached to (kernel BO only) */
 	struct xe_tile *tile;
 	/** @placements: valid placements for this BO */
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
index c4213bb9c137..91ed6c0fac84 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -387,6 +387,12 @@ static int __xe_exec_queue_init(struct xe_exec_queue *q, u32 exec_queue_flags)
 				goto err_lrc;
 			}
 
+			/*
+			 * The queue ref counts the LRCs, thus it safe for the LRC BO to hold a
+			 * pointer to queue without reference.  The reader holds dma_resv (
+			 * xe_bo_lock) which serializes with xe_lrc_finish().
+			 */
+			WRITE_ONCE(lrc->bo->q, xe_exec_queue_multi_queue_primary(q));
 			xe_exec_queue_set_lrc(q, lrc, i);
 
 			if (__lrc)
diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
index 35b4e8289b5f..675902753735 100644
--- a/drivers/gpu/drm/xe/xe_lrc.c
+++ b/drivers/gpu/drm/xe/xe_lrc.c
@@ -1066,6 +1066,7 @@ static void xe_lrc_set_ppgtt(struct xe_lrc *lrc, struct xe_vm *vm)
 static void xe_lrc_finish(struct xe_lrc *lrc)
 {
 	xe_hw_fence_ctx_finish(&lrc->fence_ctx);
+	WRITE_ONCE(lrc->bo->q, NULL);
 	xe_bo_unpin_map_no_vm(lrc->bo);
 	xe_bo_unpin_map_no_vm(lrc->seqno_bo);
 }
-- 
2.52.0


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

* [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
  2026-08-26 13:51 ` [PATCH V18 01/14] drm/xe: Link VRAM object with gpu buddy Tejas Upadhyay
  2026-08-26 13:51 ` [PATCH V18 02/14] drm/xe: Link LRC BO and its execution Queue Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 14:07   ` sashiko-bot
  2026-08-26 22:42   ` Andi Shyti
  2026-08-26 13:51 ` [PATCH V18 04/14] drm/xe/bo: Make xe_bo_is_user() public Tejas Upadhyay
                   ` (14 subsequent siblings)
  17 siblings, 2 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay, Arvind Yadav

Recent driver update introduce support for purgeable buffer
objects (BOs), extending the API to include VRAM pages to
better manage memory pressure and enable memory offlining.

Reviewed-by: Arvind Yadav <arvind.yadav@intel.com>
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_bo.c | 5 +----
 drivers/gpu/drm/xe/xe_bo.h | 1 +
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index dde309821237..52f81e972ada 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -921,7 +921,7 @@ void xe_bo_set_purgeable_state(struct xe_bo *bo,
  *
  * Return: 0 on success, negative error code on failure
  */
-static int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx)
+int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx)
 {
 	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
 	struct ttm_placement place = {};
@@ -929,9 +929,6 @@ static int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operatio
 
 	xe_bo_assert_held(bo);
 
-	if (!ttm_bo->ttm)
-		return 0;
-
 	if (!xe_bo_madv_is_dontneed(bo))
 		return 0;
 
diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index e8081af5bfc1..90b15fff36c7 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -600,6 +600,7 @@ struct xe_bo_shrink_flags {
 long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
 		  const struct xe_bo_shrink_flags flags,
 		  unsigned long *scanned);
+int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx);
 
 /**
  * xe_bo_is_mem_type - Whether the bo currently resides in the given
-- 
2.52.0


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

* [PATCH V18 04/14] drm/xe/bo: Make xe_bo_is_user() public
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (2 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 22:44   ` Andi Shyti
  2026-08-26 13:51 ` [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
                   ` (13 subsequent siblings)
  17 siblings, 1 reply; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

Export xe_bo_is_user() so it can be used by the VRAM page offline
code to distinguish user-created BOs from kernel BOs when deciding
whether a faulty page can be safely purged or requires a full reset.

Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_bo.c | 8 +++++++-
 drivers/gpu/drm/xe/xe_bo.h | 1 +
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 52f81e972ada..b077d137da57 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -158,7 +158,13 @@ bool xe_bo_is_vm_bound(struct xe_bo *bo)
 	return !list_empty(&bo->ttm.base.gpuva.list);
 }
 
-static bool xe_bo_is_user(struct xe_bo *bo)
+/**
+ * xe_bo_is_user - Check if BO is user-created
+ * @bo: The BO
+ *
+ * Returns: true if @bo was created by userspace
+ */
+bool xe_bo_is_user(struct xe_bo *bo)
 {
 	return bo->flags & XE_BO_FLAG_USER;
 }
diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index 90b15fff36c7..eede678ad303 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -601,6 +601,7 @@ long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
 		  const struct xe_bo_shrink_flags flags,
 		  unsigned long *scanned);
 int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx);
+bool xe_bo_is_user(struct xe_bo *bo);
 
 /**
  * xe_bo_is_mem_type - Whether the bo currently resides in the given
-- 
2.52.0


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

* [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (3 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 04/14] drm/xe/bo: Make xe_bo_is_user() public Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 14:12   ` sashiko-bot
  2026-08-27  6:08   ` Ghimiray, Himal Prasad
  2026-08-26 13:51 ` [PATCH V18 06/14] drm/xe/vram: Extract buddy alloc and free helpers Tejas Upadhyay
                   ` (12 subsequent siblings)
  17 siblings, 2 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

VRAM page offlining can purge BOs that are still referenced by page
tables, exec queues, and DMA-buf exports. Add xe_bo_is_purged()
guards in the teardown paths to prevent unpinning or mapping an
already-purged BO:

- xe_bo_unpin_map_no_vm(): skip unpin if purged
- xe_dma_buf_map(): return -ENOENT early if purged
- xe_exec_queue_update_run_ticks(): skip LRC timestamp read if purged
- xe_pt_destroy(): skip unpin if purged

v3(Sashiko):
- Remove dma_resv is already held
v2(Himal):
- take dma_resv lock before calling xe_bo_is_purged()

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_bo.h         | 3 ++-
 drivers/gpu/drm/xe/xe_dma_buf.c    | 3 +++
 drivers/gpu/drm/xe/xe_exec_queue.c | 8 ++++++--
 drivers/gpu/drm/xe/xe_pt.c         | 3 ++-
 4 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index eede678ad303..dfcd0e57073b 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -364,7 +364,8 @@ static inline void xe_bo_unpin_map_no_vm(struct xe_bo *bo)
 {
 	if (likely(bo)) {
 		xe_bo_lock(bo, false);
-		xe_bo_unpin(bo);
+		if (!xe_bo_is_purged(bo))
+			xe_bo_unpin(bo);
 		xe_bo_unlock(bo);
 
 		xe_bo_put(bo);
diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c
index bf0728838ead..5d9f1cd24b7f 100644
--- a/drivers/gpu/drm/xe/xe_dma_buf.c
+++ b/drivers/gpu/drm/xe/xe_dma_buf.c
@@ -104,6 +104,9 @@ static struct sg_table *xe_dma_buf_map(struct dma_buf_attachment *attach,
 	struct sg_table *sgt;
 	int r = 0;
 
+	if (xe_bo_is_purged(bo))
+		return ERR_PTR(-ENOENT);
+
 	if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
 		return ERR_PTR(-EOPNOTSUPP);
 
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
index 91ed6c0fac84..91e4f3cb5617 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -1572,8 +1572,12 @@ void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q)
 	 * errors.
 	 */
 	lrc = q->lrc[0];
-	new_ts = xe_lrc_update_timestamp(lrc, &old_ts);
-	q->xef->run_ticks[q->class] += (new_ts - old_ts) * q->width;
+	xe_bo_lock(lrc->bo, false);
+	if (!xe_bo_is_purged(lrc->bo)) {
+		new_ts = xe_lrc_update_timestamp(lrc, &old_ts);
+		q->xef->run_ticks[q->class] += (new_ts - old_ts) * q->width;
+	}
+	xe_bo_unlock(lrc->bo);
 
 	drm_dev_exit(idx);
 }
diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c
index 5d990c1c3740..dbf1aa26a21b 100644
--- a/drivers/gpu/drm/xe/xe_pt.c
+++ b/drivers/gpu/drm/xe/xe_pt.c
@@ -212,7 +212,8 @@ void xe_pt_destroy(struct xe_pt *pt, u32 flags, struct llist_head *deferred)
 		return;
 
 	XE_WARN_ON(!list_empty(&pt->bo->ttm.base.gpuva.list));
-	xe_bo_unpin(pt->bo);
+	if (!xe_bo_is_purged(pt->bo))
+		xe_bo_unpin(pt->bo);
 	xe_bo_put_deferred(pt->bo, deferred);
 
 	if (pt->level > 0 && pt->num_live) {
-- 
2.52.0


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

* [PATCH V18 06/14] drm/xe/vram: Extract buddy alloc and free helpers
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (4 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 22:50   ` Andi Shyti
  2026-08-26 13:51 ` [PATCH V18 07/14] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
                   ` (11 subsequent siblings)
  17 siblings, 1 reply; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

Factor out xe_ttm_vram_buddy_alloc() and xe_ttm_vram_buddy_free()
from xe_ttm_vram_mgr_new() and xe_ttm_vram_mgr_del(). These helpers
consolidate block allocation with visible-size tracking and
block->private tagging, making them reusable by the upcoming VRAM
page offline reservation path.

No functional change.

Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 82 +++++++++++++++++-----------
 1 file changed, 51 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index 51e983ee3bad..16ecea497780 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -49,6 +49,40 @@ static inline bool xe_is_vram_mgr_blocks_contiguous(struct gpu_buddy *mm,
 	return true;
 }
 
+static int xe_ttm_vram_buddy_alloc(struct xe_ttm_vram_mgr *mgr, u64 start,
+				   u64 end, u64 size, u64 min_page_size,
+				   struct list_head *blocks, unsigned long flags,
+				   void *priv, u64 *used_visible)
+{
+	struct gpu_buddy *mm = &mgr->mm;
+	struct gpu_buddy_block *block;
+	int err;
+
+	err = gpu_buddy_alloc_blocks(mm, start, end, size, min_page_size, blocks, flags);
+	if (err)
+		return err;
+
+	list_for_each_entry(block, blocks, link)
+		block->private = priv;
+
+	if (end <= mgr->visible_size) {
+		*used_visible = size;
+	} else {
+		list_for_each_entry(block, blocks, link) {
+			u64 blk_start = gpu_buddy_block_offset(block);
+
+			if (blk_start < mgr->visible_size) {
+				u64 blk_end = blk_start + gpu_buddy_block_size(mm, block);
+
+				*used_visible += min(blk_end, mgr->visible_size) - blk_start;
+			}
+		}
+	}
+
+	mgr->visible_avail -= *used_visible;
+	return 0;
+}
+
 static int xe_ttm_vram_mgr_new(struct ttm_resource_manager *man,
 			       struct ttm_buffer_object *tbo,
 			       const struct ttm_place *place,
@@ -57,7 +91,6 @@ static int xe_ttm_vram_mgr_new(struct ttm_resource_manager *man,
 	struct xe_ttm_vram_mgr *mgr = to_xe_ttm_vram_mgr(man);
 	struct xe_ttm_vram_mgr_resource *vres;
 	struct gpu_buddy *mm = &mgr->mm;
-	struct gpu_buddy_block *block;
 	u64 size, min_page_size;
 	unsigned long lpfn;
 	int err;
@@ -118,32 +151,12 @@ static int xe_ttm_vram_mgr_new(struct ttm_resource_manager *man,
 		goto error_unlock;
 	}
 
-	err = gpu_buddy_alloc_blocks(mm, (u64)place->fpfn << PAGE_SHIFT,
-				     (u64)lpfn << PAGE_SHIFT, size,
-				     min_page_size, &vres->blocks, vres->flags);
+	err = xe_ttm_vram_buddy_alloc(mgr, (u64)place->fpfn << PAGE_SHIFT,
+				      (u64)lpfn << PAGE_SHIFT, size,
+				      min_page_size, &vres->blocks, vres->flags,
+				      tbo, &vres->used_visible_size);
 	if (err)
 		goto error_unlock;
-
-	if (lpfn <= mgr->visible_size >> PAGE_SHIFT) {
-		vres->used_visible_size = size;
-	} else {
-		struct gpu_buddy_block *block;
-
-		list_for_each_entry(block, &vres->blocks, link) {
-			u64 start = gpu_buddy_block_offset(block);
-
-			if (start < mgr->visible_size) {
-				u64 end = start + gpu_buddy_block_size(mm, block);
-
-				vres->used_visible_size +=
-					min(end, mgr->visible_size) - start;
-			}
-		}
-	}
-
-	mgr->visible_avail -= vres->used_visible_size;
-	list_for_each_entry(block, &vres->blocks, link)
-		block->private = tbo;
 	mutex_unlock(&mgr->lock);
 
 	if (!(vres->base.placement & TTM_PL_FLAG_CONTIGUOUS) &&
@@ -175,20 +188,27 @@ static int xe_ttm_vram_mgr_new(struct ttm_resource_manager *man,
 	return err;
 }
 
+static void xe_ttm_vram_buddy_free(struct xe_ttm_vram_mgr *mgr,
+				   struct list_head *blocks,
+				   u64 used_visible)
+{
+	struct gpu_buddy_block *block;
+
+	list_for_each_entry(block, blocks, link)
+		block->private = NULL;
+	gpu_buddy_free_list(&mgr->mm, blocks, 0);
+	mgr->visible_avail += used_visible;
+}
+
 static void xe_ttm_vram_mgr_del(struct ttm_resource_manager *man,
 				struct ttm_resource *res)
 {
 	struct xe_ttm_vram_mgr_resource *vres =
 		to_xe_ttm_vram_mgr_resource(res);
 	struct xe_ttm_vram_mgr *mgr = to_xe_ttm_vram_mgr(man);
-	struct gpu_buddy *mm = &mgr->mm;
-	struct gpu_buddy_block *block;
 
 	mutex_lock(&mgr->lock);
-	list_for_each_entry(block, &vres->blocks, link)
-		block->private = NULL;
-	gpu_buddy_free_list(mm, &vres->blocks, 0);
-	mgr->visible_avail += vres->used_visible_size;
+	xe_ttm_vram_buddy_free(mgr, &vres->blocks, vres->used_visible_size);
 	mutex_unlock(&mgr->lock);
 
 	ttm_resource_fini(man, res);
-- 
2.52.0


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

* [PATCH V18 07/14] drm/xe/vram: Add page offline data structures and lifecycle
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (5 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 06/14] drm/xe/vram: Extract buddy alloc and free helpers Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 23:09   ` Andi Shyti
  2026-08-27  6:19   ` Ghimiray, Himal Prasad
  2026-08-26 13:51 ` [PATCH V18 08/14] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
                   ` (10 subsequent siblings)
  17 siblings, 2 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

Add xe_ttm_vram_offline_resource to track individual offlined VRAM
pages, and extend xe_ttm_vram_mgr with offlined_pages/queued_pages
lists and their counters.

Initialize the lists in __xe_ttm_vram_mgr_init() and add
xe_ttm_vram_free_bad_pages() to release all tracked pages during
xe_ttm_vram_mgr_fini() teardown.

v3(Sashiko):
- Reorder xe_ttm_vram_buddy_free and list_del_rcu
- Introduce reservation status
v2(Himal):
- Address possible leak in xe_ttm_vram_mgr_fini()
- Remove unused dev and add comment for used_visible_size 0

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c       | 25 ++++++++++++++
 drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h | 38 ++++++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index 16ecea497780..1253989a8d06 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -338,12 +338,35 @@ static void xe_ttm_vram_mgr_set_unused(struct drm_device *dev, void *arg)
 	ttm_resource_manager_set_used(man, false);
 }
 
+static void xe_ttm_vram_free_bad_pages(struct xe_ttm_vram_mgr *mgr)
+{
+	struct xe_ttm_vram_offline_resource *pos, *n;
+
+	list_for_each_entry_safe(pos, n, &mgr->offlined_pages, offlined_link) {
+		list_del_rcu(&pos->offlined_link);
+		xe_ttm_vram_buddy_free(mgr, &pos->blocks, pos->used_visible_size);
+		--mgr->n_offlined_pages;
+		kfree_rcu(pos, rcu);
+	}
+	list_for_each_entry_safe(pos, n, &mgr->queued_pages, queued_link) {
+		list_del_rcu(&pos->queued_link);
+		/* queued entries have no buddy reservation yet */
+		xe_ttm_vram_buddy_free(mgr, &pos->blocks, 0);
+		--mgr->n_queued_pages;
+		kfree_rcu(pos, rcu);
+	}
+}
+
 static void xe_ttm_vram_mgr_fini(struct drm_device *dev, void *arg)
 {
 	struct xe_device *xe = to_xe_device(dev);
 	struct xe_ttm_vram_mgr *mgr = arg;
 	struct ttm_resource_manager *man = &mgr->manager;
 
+	mutex_lock(&mgr->lock);
+	xe_ttm_vram_free_bad_pages(mgr);
+	mutex_unlock(&mgr->lock);
+
 	if (ttm_resource_manager_evict_all(&xe->ttm, man))
 		return;
 
@@ -370,6 +393,8 @@ int __xe_ttm_vram_mgr_init(struct xe_device *xe, struct xe_ttm_vram_mgr *mgr,
 	err = drmm_mutex_init(&xe->drm, &mgr->lock);
 	if (err)
 		return err;
+	INIT_LIST_HEAD(&mgr->offlined_pages);
+	INIT_LIST_HEAD(&mgr->queued_pages);
 	mgr->default_page_size = default_page_size;
 	mgr->visible_size = io_size;
 	mgr->visible_avail = io_size;
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
index 9106da056b49..dc97b0ad0e51 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
@@ -19,6 +19,14 @@ struct xe_ttm_vram_mgr {
 	struct ttm_resource_manager manager;
 	/** @mm: DRM buddy allocator which manages the VRAM */
 	struct gpu_buddy mm;
+	/** @offlined_pages: List of offlined pages */
+	struct list_head offlined_pages;
+	/** @n_offlined_pages: Number of offlined pages */
+	u16 n_offlined_pages;
+	/** @queued_pages: List of queued pages */
+	struct list_head queued_pages;
+	/** @n_queued_pages: Number of queued pages */
+	u16 n_queued_pages;
 	/** @visible_size: Proped size of the CPU visible portion */
 	u64 visible_size;
 	/** @visible_avail: CPU visible portion still unallocated */
@@ -45,4 +53,34 @@ struct xe_ttm_vram_mgr_resource {
 	unsigned long flags;
 };
 
+/**
+ * enum xe_page_reserve_status - Buddy reservation status
+ * @XE_PAGE_RESERVE_PENDING: reservation in progress
+ * @XE_PAGE_RESERVE_FAIL: reservation failed
+ */
+enum xe_page_reserve_status {
+	XE_PAGE_RESERVE_PENDING = 0,
+	XE_PAGE_RESERVE_FAIL,
+};
+
+/**
+ * struct xe_ttm_vram_offline_resource - Tracks a single offlined VRAM page
+ */
+struct xe_ttm_vram_offline_resource {
+	/** @offlined_link: Link into mgr->offlined_pages */
+	struct list_head offlined_link;
+	/** @queued_link: Link into mgr->queued_pages */
+	struct list_head queued_link;
+	/** @blocks: Buddy blocks reserved for this page */
+	struct list_head blocks;
+	/** @used_visible_size: CPU-visible bytes consumed */
+	u64 used_visible_size;
+	/** @addr: Faulty DPA reported by HW */
+	u64 addr;
+	/** @status: buddy reservation status */
+	enum xe_page_reserve_status status;
+	/** @rcu: RCU head for deferred freeing */
+	struct rcu_head rcu;
+};
+
 #endif
-- 
2.52.0


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

* [PATCH V18 08/14] drm/xe/vram: Add VRAM page offline fault handler
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (6 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 07/14] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 14:05   ` sashiko-bot
  2026-08-26 13:51 ` [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute Tejas Upadhyay
                   ` (9 subsequent siblings)
  17 siblings, 1 reply; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

Add the core VRAM page offlining logic to handle HW-reported faulty
physical addresses:

- xe_ttm_vram_purge_page(): Purges the BO containing the faulty
  address. Bans the associated VM (if page table BO) and exec queue
  (if LRC BO). Moves xe_exec_queue_kill() outside xe_bo_lock() to
  avoid AB-BA deadlock with vm->lock. Uses READ_ONCE(bo->q) to
  safely access the exec queue pointer.

- xe_ttm_vram_page_already_processed(): Checks if an address is
  already tracked in offlined_pages or queued_pages lists to avoid
  double-processing.

- xe_ttm_vram_reserve_page_at_addr(): Two-phase reservation that
  first queues the page, purges the BO outside the lock, then
  reserves the buddy block. Handles both allocated (BO present)
  and free page cases. Returns -EIO for critical kernel BOs to
  trigger system reset.

- xe_ttm_vram_addr_to_region(): Maps a DPA to its VRAM region.
  Uses GSMBASE MMIO register to detect GSM addresses (returns NULL
  for reset path). Returns ERR_PTR(-EOPNOTSUPP) for addresses
  outside any known region.

- xe_ttm_vram_handle_addr_fault(): Entry point called by RAS.
  Returns -EEXIST if already processed, -EIO for GSM/critical BO,
  -EOPNOTSUPP if out of bounds.

v12(Sashiko):
- Handle multi tile and add assert for 4K align
- Remove unaligned action comment for ENXIO
v11(Himal):
- match everywhere with enum vs bool for status member
- Fix comment and remove unused var
- if purge fail let next alloc confirm failure
- pass absolute address, useful for multi tile

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 296 +++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.h |   1 +
 2 files changed, 297 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index 1253989a8d06..b2b6c1bd2c55 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -13,10 +13,16 @@
 #include <drm/ttm/ttm_placement.h>
 #include <drm/ttm/ttm_range_manager.h>
 
+#include "regs/xe_regs.h"
 #include "xe_bo.h"
+#include "xe_configfs.h"
 #include "xe_device.h"
+#include "xe_exec_queue.h"
+#include "xe_lrc.h"
+#include "xe_mmio.h"
 #include "xe_pm.h"
 #include "xe_res_cursor.h"
+#include "xe_ttm_stolen_mgr.h"
 #include "xe_ttm_vram_mgr.h"
 #include "xe_vram_types.h"
 
@@ -572,3 +578,293 @@ u64 xe_ttm_vram_get_avail(struct ttm_resource_manager *man)
 
 	return avail;
 }
+
+static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
+{
+	struct ttm_operation_ctx ctx = {};
+	struct xe_exec_queue *q_to_put = NULL;
+	struct xe_exec_queue *q = NULL;
+	struct xe_vm *vm = NULL;
+	u32	flags;
+	int ret = 0;
+
+	xe_bo_lock(bo, false);
+	if (bo->vm)
+		vm = xe_vm_get(bo->vm);
+	flags = bo->flags;
+	xe_bo_unlock(bo);
+	/*  Ban VM if BO is PPGTT */
+	if (vm && (flags & XE_BO_FLAG_PAGETABLE)) {
+		down_write(&vm->lock);
+		xe_vm_kill(vm, true);
+		up_write(&vm->lock);
+	}
+	if (vm)
+		xe_vm_put(vm);
+
+	xe_bo_lock(bo, false);
+	q = READ_ONCE(bo->q);
+	/*  Ban exec queue if BO is lrc */
+	if (q && xe_exec_queue_get_unless_zero(q)) {
+		/* ban queue */
+		q_to_put = q;
+	}
+
+	if (bo->purgeable.state == XE_MADV_PURGEABLE_PURGED) {
+		/* Already purged by shrinker during unlocked window — nothing to do */
+		xe_bo_unlock(bo);
+		goto out;
+	}
+
+	xe_bo_set_purgeable_state(bo, XE_MADV_PURGEABLE_DONTNEED);
+	ttm_bo_unmap_virtual(&bo->ttm);   /* nuke CPU mmap + VRAM IO mappings */
+	if (xe_bo_is_pinned(bo))
+		xe_bo_unpin(bo);
+	ret = xe_ttm_bo_purge(&bo->ttm, &ctx);
+	xe_bo_unlock(bo);
+
+out:
+	if (q_to_put) {
+		xe_exec_queue_kill(q_to_put);
+		xe_exec_queue_put(q_to_put);
+	}
+
+	return ret;
+}
+
+static bool xe_ttm_vram_page_already_processed(struct xe_ttm_vram_mgr *mgr,
+					       u64 addr)
+{
+	struct xe_ttm_vram_offline_resource *pos;
+
+	lockdep_assert_held(&mgr->lock);
+
+	list_for_each_entry(pos, &mgr->offlined_pages, offlined_link) {
+		if (pos->addr == addr)
+			return true;
+	}
+
+	list_for_each_entry(pos, &mgr->queued_pages, queued_link) {
+		if (pos->addr == addr)
+			return true;
+	}
+
+	return false;
+}
+
+static int xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
+					    struct xe_ttm_vram_mgr *vram_mgr, struct gpu_buddy *mm)
+{
+	struct xe_ttm_vram_offline_resource *nentry;
+	struct ttm_buffer_object *tbo = NULL;
+	struct xe_bo *pbo_to_put = NULL;
+	struct gpu_buddy_block *block;
+	u64 size = SZ_4K;
+	int ret = 0;
+
+	scoped_guard(mutex, &vram_mgr->lock) {
+		if (xe_ttm_vram_page_already_processed(vram_mgr, addr))
+			return -EEXIST;
+		block = gpu_buddy_allocated_addr_to_block(mm, addr);
+		if (WARN_ON(IS_ERR(block)))
+			return PTR_ERR(block);
+
+		nentry = kzalloc_obj(*nentry);
+		if (!nentry)
+			return -ENOMEM;
+		INIT_LIST_HEAD(&nentry->blocks);
+		nentry->status = XE_PAGE_RESERVE_PENDING;
+		nentry->addr = addr;
+
+		if (block) {
+			struct xe_bo *pbo;
+
+			if (!block->private) {
+				/* Race: another thread just reserved this block */
+				kfree(nentry);
+				return -EEXIST;
+			}
+			tbo = block->private;
+			pbo = ttm_to_xe_bo(tbo);
+
+			/* Get reference safely - BO may have zero refcount */
+			if (!xe_bo_get_unless_zero(pbo)) {
+				kfree(nentry);
+				return -ENOENT;
+			}
+			/*
+			 * Critical kernel BO? Best-effort check without resv lock;
+			 * worst case a concurrent pin causes reset path unnecessarily.
+			 */
+			if ((pbo->ttm.type == ttm_bo_type_kernel &&
+			     !(pbo->flags & XE_BO_FLAG_PINNED_LATE_RESTORE)) ||
+			    (xe_bo_is_user(pbo) && xe_bo_is_pinned(pbo))) {
+				kfree(nentry);
+				pbo_to_put = pbo;
+				drm_err(&xe->drm,
+					"%s: addr: 0x%llx is critical kernel bo, requesting SBR\n",
+					__func__, addr);
+				break;
+			}
+			++vram_mgr->n_queued_pages;
+			list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
+		}
+	}
+
+	/* Deferred put outside lock to avoid recursive deadlock */
+	if (pbo_to_put) {
+		xe_bo_put(pbo_to_put);
+		/* Hint System controller driver for reset with -EIO  */
+		return -EIO;
+	}
+
+	if (block) {
+		struct xe_ttm_vram_offline_resource *pos, *n;
+		struct xe_bo *pbo = ttm_to_xe_bo(tbo);
+
+		/*
+		 * Purge BO containing address - reference held from above.
+		 * Note: brief window between purge (freeing blocks) and re-reserve
+		 * below. If another allocation claims the block, buddy_alloc fails
+		 * and the status will be shown as failed reservation.
+		 */
+		ret = xe_ttm_vram_purge_page(xe, pbo);
+		xe_bo_put(pbo);
+		if (ret)
+			drm_warn(&xe->drm, "Purge failed at addr:0x%llx, ret:%d\n", addr, ret);
+
+		/* Reserve page at address addr*/
+		scoped_guard(mutex, &vram_mgr->lock) {
+			ret = xe_ttm_vram_buddy_alloc(vram_mgr, addr, addr + size,
+						      size, size, &nentry->blocks,
+						      GPU_BUDDY_RANGE_ALLOCATION,
+						      NULL, &nentry->used_visible_size);
+			if (ret) {
+				drm_warn(&xe->drm,
+					 "Could not reserve page at addr:0x%llx, ret:%d\n",
+					 addr, ret);
+				nentry->status = XE_PAGE_RESERVE_FAIL;
+				return ret;
+			}
+
+			list_for_each_entry_safe(pos, n, &vram_mgr->queued_pages, queued_link) {
+				if (pos->addr == nentry->addr) {
+					--vram_mgr->n_queued_pages;
+					list_del_rcu(&pos->queued_link);
+					break;
+				}
+			}
+			list_add_rcu(&nentry->offlined_link, &vram_mgr->offlined_pages);
+			/* RAS will send command to FW for offlining page based on ret value */
+			++vram_mgr->n_offlined_pages;
+			return ret;
+		}
+	} else {
+		struct xe_ttm_vram_offline_resource *pos, *n;
+
+		scoped_guard(mutex, &vram_mgr->lock) {
+			++vram_mgr->n_queued_pages;
+			list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
+			ret = xe_ttm_vram_buddy_alloc(vram_mgr, addr, addr + size,
+						      size, size, &nentry->blocks,
+						      GPU_BUDDY_RANGE_ALLOCATION,
+						      NULL, &nentry->used_visible_size);
+			if (ret) {
+				drm_warn(&xe->drm,
+					 "Could not reserve page at addr:0x%llx, ret:%d\n",
+					 addr, ret);
+				nentry->status = XE_PAGE_RESERVE_FAIL;
+				return ret;
+			}
+
+			list_for_each_entry_safe(pos, n, &vram_mgr->queued_pages, queued_link) {
+				if (pos->addr == nentry->addr) {
+					--vram_mgr->n_queued_pages;
+					list_del_rcu(&pos->queued_link);
+					break;
+				}
+			}
+			++vram_mgr->n_offlined_pages;
+			list_add_rcu(&nentry->offlined_link, &vram_mgr->offlined_pages);
+			/* RAS will send command to FW for offlining page based on ret value */
+		}
+	}
+	/* Success */
+	return ret;
+}
+
+static struct xe_vram_region *xe_ttm_vram_addr_to_region(struct xe_device *xe, u64 addr)
+{
+	struct xe_tile *tile;
+	u8 id;
+
+	for_each_tile(tile, xe, id) {
+		struct xe_vram_region *vr = tile->mem.vram;
+
+		if (!vr)
+			continue;
+
+		if (addr >= vr->dpa_base && addr < (vr->dpa_base + vr->usable_size))
+			return vr;
+
+		/* CCS, GSM, or DSM — infrastructure zone, needs reset */
+		if (addr >= (vr->dpa_base + vr->usable_size) &&
+		    addr < (vr->dpa_base + vr->actual_physical_size))
+			return NULL;
+	}
+
+	/*
+	 * Return an explicit error pointer so the caller knows the addr
+	 * is invalid and should be ignored, NOT SBR.
+	 */
+	return ERR_PTR(-EOPNOTSUPP);
+}
+
+/**
+ * xe_ttm_vram_handle_addr_fault - Handle vram physical address error flaged
+ * @xe: pointer to parent device
+ * @addr: physical faulty address
+ *
+ * Handle the physcial faulty address error on specific tile.
+ *
+ * Returns 0 for success, negative error code otherwise as follow:
+ * * %-EIO - critical BO or address outside any VRAM region; next action is reset.
+ * * %-EOPNOTSUPP - log-only policy or unknown address; no further action.
+ * * %-ENOMEM - allocation failure; next action is reset.
+ * * %-ENXIO - address not found in buddy; no further action.
+ * * %-EEXIST - address already processed; no further action.
+ */
+int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
+{
+	struct xe_ttm_vram_mgr *vram_mgr;
+	struct xe_vram_region *vr;
+	struct gpu_buddy *mm;
+
+	/* Assert that the address is 4K aligned */
+	if (WARN_ON_ONCE(!IS_ALIGNED(addr, SZ_4K))) {
+		drm_err(&xe->drm, "Address %llx is not 4K aligned!\n", addr);
+		return -EINVAL;
+	}
+
+	vr = xe_ttm_vram_addr_to_region(xe, addr);
+	if (IS_ERR(vr)) {
+		/*
+		 * The addr is outside VRAM and GSM.
+		 * Log a debug message if needed, and safely exit/ignore.
+		 */
+		drm_dbg(&xe->drm, "Address %llx is out of bounds, ignoring fault.\n", addr);
+		return PTR_ERR(vr);
+	}
+	if (!vr) {
+		drm_err(&xe->drm, "%s:%d GSM addr:%llx error requesting SBR\n",
+			__func__, __LINE__, addr);
+		/* Hint System controller driver for reset with -EIO  */
+		return -EIO;
+	}
+	vram_mgr = &vr->ttm;
+	mm = &vram_mgr->mm;
+
+	/* Reserve page at address */
+	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
+}
+EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
index 87b7fae5edba..d5392beff30c 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
@@ -31,6 +31,7 @@ u64 xe_ttm_vram_get_cpu_visible_size(struct ttm_resource_manager *man);
 void xe_ttm_vram_get_used(struct ttm_resource_manager *man,
 			  u64 *used, u64 *used_visible);
 
+int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr);
 static inline struct xe_ttm_vram_mgr_resource *
 to_xe_ttm_vram_mgr_resource(struct ttm_resource *res)
 {
-- 
2.52.0


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

* [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (7 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 08/14] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-27  6:42   ` Ghimiray, Himal Prasad
  2026-08-27 15:00   ` Michal Wajdeczko
  2026-08-26 13:51 ` [PATCH V18 10/14] drm/xe/ras: Cache bad_page_reservation policy at init Tejas Upadhyay
                   ` (8 subsequent siblings)
  17 siblings, 2 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

Add a new configfs attribute 'bad_page_reservation' to control how bad
VRAM pages are handled:
  0 - Logging only (report in dmesg, no offlining)
  1 - Offlining (default)

The attribute can only be set before binding to the device and defaults
to true (offlining enabled). This gives administrators control over
whether corrupted VRAM pages detected by hardware (e.g., ECC errors)
are actively offlined or only logged.

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_configfs.c | 67 +++++++++++++++++++++++++++++++-
 drivers/gpu/drm/xe/xe_configfs.h |  2 +
 2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
index 052cce962161..80c4c5f66e4c 100644
--- a/drivers/gpu/drm/xe/xe_configfs.c
+++ b/drivers/gpu/drm/xe/xe_configfs.c
@@ -61,7 +61,8 @@
  *	    ├── survivability_mode
  *	    ├── gt_types_allowed
  *	    ├── engines_allowed
- *	    └── enable_psmi
+ *          ├── enable_psmi
+ *          └── bad_page_reservation
  *
  * After configuring the attributes as per next section, the device can be
  * probed with::
@@ -159,6 +160,19 @@
  *
  * This attribute can only be set before binding to the device.
  *
+ * Bad pages reservation:
+ * ---------------------
+ *
+ * Controls how bad VRAM pages are handled:
+ *  0 - Logging only (report in dmesg, no offlining)
+ *  1 - Offlining (default)
+ *
+ *  Example to disable offlining::
+ *
+ *      # echo 0 > /sys/kernel/config/xe/0000:03:00.0/bad_page_reservation
+ *
+ * This attribute can only be set before binding to the device.
+ *
  * Context restore BB
  * ------------------
  *
@@ -275,6 +289,7 @@ struct xe_config_group_device {
 		bool survivability_mode;
 		bool enable_psmi;
 		bool enable_multi_queue;
+		bool bad_page_reservation;
 		struct {
 			unsigned int max_vfs;
 			bool admin_only_pf;
@@ -295,6 +310,7 @@ static const struct xe_config_device device_defaults = {
 	.survivability_mode = false,
 	.enable_psmi = false,
 	.enable_multi_queue = true,
+	.bad_page_reservation = true,
 	.sriov = {
 		.max_vfs = XE_DEFAULT_MAX_VFS,
 		.admin_only_pf = XE_DEFAULT_ADMIN_ONLY_PF,
@@ -616,6 +632,32 @@ static ssize_t enable_multi_queue_store(struct config_item *item, const char *pa
 	return len;
 }
 
+static ssize_t bad_page_reservation_show(struct config_item *item, char *page)
+{
+	struct xe_config_device *dev = to_xe_config_device(item);
+
+	return sprintf(page, "%d\n", dev->bad_page_reservation);
+}
+
+static ssize_t bad_page_reservation_store(struct config_item *item, const char *page, size_t len)
+{
+	struct xe_config_group_device *dev = to_xe_config_group_device(item);
+	bool val;
+	int ret;
+
+	ret = kstrtobool(page, &val);
+	if (ret)
+		return ret;
+
+	guard(mutex)(&dev->lock);
+	if (is_bound(dev))
+		return -EBUSY;
+
+	dev->config.bad_page_reservation = val;
+
+	return len;
+}
+
 static bool wa_bb_read_advance(bool dereference, char **p,
 			       const char *append, size_t len,
 			       size_t *max_size)
@@ -855,6 +897,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
 CONFIGFS_ATTR(, ctx_restore_post_bb);
 CONFIGFS_ATTR(, enable_multi_queue);
 CONFIGFS_ATTR(, enable_psmi);
+CONFIGFS_ATTR(, bad_page_reservation);
 CONFIGFS_ATTR(, engines_allowed);
 CONFIGFS_ATTR(, gt_types_allowed);
 CONFIGFS_ATTR(, survivability_mode);
@@ -864,6 +907,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
 	&attr_ctx_restore_post_bb,
 	&attr_enable_multi_queue,
 	&attr_enable_psmi,
+	&attr_bad_page_reservation,
 	&attr_engines_allowed,
 	&attr_gt_types_allowed,
 	&attr_survivability_mode,
@@ -1142,6 +1186,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
 	PRI_CUSTOM_ATTR("%llx", engines_allowed);
 	PRI_CUSTOM_ATTR("%d", enable_multi_queue);
 	PRI_CUSTOM_ATTR("%d", enable_psmi);
+	PRI_CUSTOM_ATTR("%d", bad_page_reservation);
 	PRI_CUSTOM_ATTR("%d", survivability_mode);
 	PRI_CUSTOM_ATTR("%u", sriov.admin_only_pf);
 
@@ -1290,6 +1335,26 @@ bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev)
 	return ret;
 }
 
+/**
+ * xe_configfs_get_bad_page_reservation - get configfs bad_page_reservation setting
+ * @pdev: pci device
+ *
+ * Return: bad_page_reservation setting in configfs
+ */
+bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev)
+{
+	struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
+	bool ret;
+
+	if (!dev)
+		return device_defaults.bad_page_reservation;
+
+	ret = dev->config.bad_page_reservation;
+	config_group_put(&dev->group);
+
+	return ret;
+}
+
 /**
  * xe_configfs_get_ctx_restore_mid_bb - get configfs ctx_restore_mid_bb setting
  * @pdev: pci device
diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
index 4fbbeafba473..7405cc5f3207 100644
--- a/drivers/gpu/drm/xe/xe_configfs.h
+++ b/drivers/gpu/drm/xe/xe_configfs.h
@@ -24,6 +24,7 @@ bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
 u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
 bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev);
 bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev);
+bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev);
 u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev,
 				       enum xe_engine_class class,
 				       const u32 **cs);
@@ -44,6 +45,7 @@ static inline bool xe_configfs_media_gt_allowed(struct pci_dev *pdev) { return t
 static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
 static inline bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev) { return false; }
 static inline bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev) { return true; }
+static inline bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev) { return true; }
 static inline u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev,
 						     enum xe_engine_class class,
 						     const u32 **cs) { return 0; }
-- 
2.52.0


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

* [PATCH V18 10/14] drm/xe/ras: Cache bad_page_reservation policy at init
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (8 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 14:11   ` sashiko-bot
  2026-08-27  6:45   ` Ghimiray, Himal Prasad
  2026-08-26 13:51 ` [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler Tejas Upadhyay
                   ` (7 subsequent siblings)
  17 siblings, 2 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

The configfs bad_page_reservation attribute can only be set before
device bind, so its value is immutable at runtime. Cache it in
struct xe_drm_ras during xe_drm_ras_init() to avoid repeated configfs
lookups on every fault.

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_drm_ras_types.h | 3 +++
 drivers/gpu/drm/xe/xe_ras.c           | 5 +++++
 2 files changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_drm_ras_types.h b/drivers/gpu/drm/xe/xe_drm_ras_types.h
index 8d729ad6a264..83899cf04793 100644
--- a/drivers/gpu/drm/xe/xe_drm_ras_types.h
+++ b/drivers/gpu/drm/xe/xe_drm_ras_types.h
@@ -43,6 +43,9 @@ struct xe_drm_ras {
 
 	/** @info: info array for all types of errors */
 	struct xe_drm_ras_counter *info[DRM_XE_RAS_ERR_SEV_MAX];
+
+	/** @bad_page_reservation: cached configfs policy, immutable after init */
+	bool bad_page_reservation;
 };
 
 #endif
diff --git a/drivers/gpu/drm/xe/xe_ras.c b/drivers/gpu/drm/xe/xe_ras.c
index d25d25f77531..c7e86ae0e8ad 100644
--- a/drivers/gpu/drm/xe/xe_ras.c
+++ b/drivers/gpu/drm/xe/xe_ras.c
@@ -3,6 +3,7 @@
  * Copyright © 2026 Intel Corporation
  */
 
+#include "xe_configfs.h"
 #include "xe_debugfs.h"
 #include "xe_device.h"
 #include "xe_drm_ras.h"
@@ -804,6 +805,10 @@ void xe_ras_init(struct xe_device *xe)
 {
 	int ret;
 
+	if (xe->info.platform == XE_CRESCENTISLAND)
+		xe->ras.bad_page_reservation =
+			xe_configfs_get_bad_page_reservation(to_pci_dev(xe->drm.dev));
+
 	xe_drm_ras_init(xe);
 
 	if (!xe->info.has_sysctrl)
-- 
2.52.0


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

* [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (9 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 10/14] drm/xe/ras: Cache bad_page_reservation policy at init Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 14:08   ` sashiko-bot
                     ` (2 more replies)
  2026-08-26 13:51 ` [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
                   ` (6 subsequent siblings)
  17 siblings, 3 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

Before reserving a page at a faulting address, check the cached
bad_page_reservation policy from xe->ras. If the policy is disabled
(logging only), log the corrupted address and return -EOPNOTSUPP so
that RAS can report to firmware to drop the address from the SRAM
queue without attempting to offline the page.

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index b2b6c1bd2c55..24d134754265 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -864,6 +864,12 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
 	vram_mgr = &vr->ttm;
 	mm = &vram_mgr->mm;
 
+	if (!xe->ras.bad_page_reservation) {
+		drm_err(&xe->drm, "0x%llx is reported as corrupted address by HW\n",
+			addr);
+		return -EOPNOTSUPP;
+	}
+
 	/* Reserve page at address */
 	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
 }
-- 
2.52.0


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

* [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (10 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 14:13   ` sashiko-bot
                     ` (2 more replies)
  2026-08-26 13:51 ` [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
                   ` (5 subsequent siblings)
  17 siblings, 3 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

Add a debugfs file "vram_bad_pages" that shows offlined and queued
VRAM pages across all tiles. Each entry displays the page frame number,
GPU page size, and status flag (R=reserved, P=pending, F=failed).

example,
cat /sys/kernel/debug/dri/0/vram_bad_pages

max_pages: 10000
0x0000000000000000 : 0x0000000000001000 : R
0x0000000000001234 : 0x0000000000001000 : P
0x0000000000080000 : 0x0000000000001000 : R   ← tile 1 addr (includes tile offset)

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_debugfs.c            |  4 ++
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c       | 66 ++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.h       |  2 +
 drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h |  2 +
 4 files changed, 74 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
index 28135f84e286..e19eafffbb08 100644
--- a/drivers/gpu/drm/xe/xe_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_debugfs.c
@@ -32,6 +32,7 @@
 #include "xe_sriov_vf.h"
 #include "xe_step.h"
 #include "xe_tile_debugfs.h"
+#include "xe_ttm_vram_mgr.h"
 #include "xe_vsec.h"
 #include "xe_wa.h"
 
@@ -773,6 +774,9 @@ void xe_debugfs_register(struct xe_device *xe)
 	if (man)
 		ttm_resource_manager_create_debugfs(man, root, "stolen_mm");
 
+	if (xe->info.platform == XE_CRESCENTISLAND)
+		xe_ttm_vram_debugfs_init(xe, root);
+
 	for_each_tile(tile, xe, tile_id)
 		xe_tile_debugfs_register(tile);
 
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index 24d134754265..af9e1fa868d7 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -5,6 +5,7 @@
  */
 
 #include <linux/cgroup_dmem.h>
+#include <linux/debugfs.h>
 
 #include <drm/drm_managed.h>
 #include <drm/drm_drv.h>
@@ -874,3 +875,68 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
 	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
 }
 EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
+
+static int vram_bad_pages_show(struct seq_file *m, void *unused)
+{
+	struct xe_device *xe = m->private;
+	struct xe_ttm_vram_offline_resource *pos;
+	struct ttm_resource_manager *man;
+	struct gpu_buddy_block *block;
+	struct xe_ttm_vram_mgr *mgr;
+	struct xe_tile *tile;
+	u8 id;
+
+	man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
+	if (man)
+		seq_printf(m, "max_pages: %d\n",
+			   to_xe_ttm_vram_mgr(man)->max_pages);
+
+	for_each_tile(tile, xe, id) {
+		struct xe_vram_region *vr = tile->mem.vram;
+
+		man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0 + id);
+		if (!man || !vr)
+			continue;
+		mgr = to_xe_ttm_vram_mgr(man);
+
+		rcu_read_lock();
+
+		list_for_each_entry_rcu(pos, &mgr->offlined_pages, offlined_link) {
+			block = list_first_entry_or_null(&pos->blocks,
+							 struct gpu_buddy_block, link);
+			if (!block)
+				continue;
+
+			seq_printf(m, "0x%016llx : 0x%016llx : R\n",
+				   (gpu_buddy_block_offset(block) + vr->dpa_base) >> PAGE_SHIFT,
+				   gpu_buddy_block_size(&mgr->mm, block));
+		}
+
+		list_for_each_entry_rcu(pos, &mgr->queued_pages, queued_link) {
+			u64 pfn, blk_size;
+
+			block = list_first_entry_or_null(&pos->blocks,
+							 struct gpu_buddy_block, link);
+			if (block) {
+				pfn = (gpu_buddy_block_offset(block) + vr->dpa_base) >> PAGE_SHIFT;
+				blk_size = gpu_buddy_block_size(&mgr->mm, block);
+			} else {
+				pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
+				blk_size = PAGE_SIZE;
+			}
+
+			seq_printf(m, "0x%016llx : 0x%016llx : %c\n",
+				   pfn, blk_size, pos->status ? 'F' : 'P');
+		}
+
+		rcu_read_unlock();
+	}
+
+	return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(vram_bad_pages);
+
+void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root)
+{
+	debugfs_create_file("vram_bad_pages", 0444, root, xe, &vram_bad_pages_fops);
+}
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
index d5392beff30c..f354c26c4257 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
@@ -9,6 +9,7 @@
 #include "xe_ttm_vram_mgr_types.h"
 
 enum dma_data_direction;
+struct dentry;
 struct xe_device;
 struct xe_tile;
 struct xe_vram_region;
@@ -32,6 +33,7 @@ void xe_ttm_vram_get_used(struct ttm_resource_manager *man,
 			  u64 *used, u64 *used_visible);
 
 int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr);
+void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root);
 static inline struct xe_ttm_vram_mgr_resource *
 to_xe_ttm_vram_mgr_resource(struct ttm_resource *res)
 {
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
index dc97b0ad0e51..efcf3e1d4e80 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
@@ -37,6 +37,8 @@ struct xe_ttm_vram_mgr {
 	struct mutex lock;
 	/** @mem_type: The TTM memory type */
 	u32 mem_type;
+	/** @max_pages: max pages that can be in offline queue retrieved from FW */
+	u16 max_pages;
 };
 
 /**
-- 
2.52.0


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

* [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (11 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-26 14:20   ` sashiko-bot
  2026-08-27 18:26   ` Andi Shyti
  2026-08-26 13:51 ` [PATCH V18 14/14] drm/xe: Add fault-inject based VRAM page offline injection Tejas Upadhyay
                   ` (4 subsequent siblings)
  17 siblings, 2 replies; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay, José Roberto de Souza, Michal Mrozek

Extend DRM_XE_EXEC_QUEUE_GET_PROPERTY_BAN to return a bitmask indicating
the reason for the ban, rather than a simple boolean. This allows
userspace to distinguish between different ban causes:

- DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG (bit 0): exec queue was banned
  due to a GPU hang or job timeout detected by the TDR.
- DRM_XE_EXEC_QUEUE_BAN_REASON_PAGE_OFFLINE (bit 1): exec queue was
  banned because a VRAM page backing its resources was taken offline.

The ban_reason field is added to struct xe_exec_queue and set at the
point where the ban is triggered:
- In guc_exec_queue_timedout_job() for GPU hang.
- In xe_ttm_vram_purge_page() for memory page offline, before calling
  xe_exec_queue_kill() or xe_vm_kill().

The reset_status op is updated to return u64 with the reason bitmask.
When a queue is banned but no explicit reason was recorded (e.g., from a
generic CAT error), it defaults to GPU_HANG for backward compatibility.
A value of 0 means the exec queue is not banned.

v4(Sashiko):
- Add ban reason for non-LR exec queues
- Add TODO for multiqueue
v3(Rodrigo):
- Add doc in xe_drm.h
v2(Sashiko):
- Use atomic_t for ban_reason to fix concurrent updates from TDR and
  page-offline
- Guard GPU_HANG bit with !exec_queue_killed to avoid masking
  page-offline reason
- Clear ban_reason on queue recovery (clear_exec_queue_banned path)
- Use atomic_read in guc_exec_queue_reset_status for lockless read

Assisted-by: Copilot:claude-opus-4.6
Acked-by: José Roberto de Souza <jose.souza@intel.com>
Acked-by: Michal Mrozek <michal.mrozek@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_exec_queue_types.h |  7 +++--
 drivers/gpu/drm/xe/xe_execlist.c         |  4 +--
 drivers/gpu/drm/xe/xe_guc_submit.c       | 36 ++++++++++++++++++++----
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c     | 19 +++++++++++++
 include/uapi/drm/xe_drm.h                | 18 +++++++++++-
 5 files changed, 74 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_exec_queue_types.h b/drivers/gpu/drm/xe/xe_exec_queue_types.h
index 95f75d61a647..836f88fc0faa 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue_types.h
+++ b/drivers/gpu/drm/xe/xe_exec_queue_types.h
@@ -154,6 +154,9 @@ struct xe_exec_queue {
 	 */
 	unsigned long flags;
 
+	/** @ban_reason: Bitmask of ban reasons (DRM_XE_EXEC_QUEUE_BAN_REASON_*) */
+	atomic_t ban_reason;
+
 	union {
 		/** @multi_gt_list: list head for VM bind engines if multi-GT */
 		struct list_head multi_gt_list;
@@ -348,8 +351,8 @@ struct xe_exec_queue_ops {
 	 * signalled when this function is called.
 	 */
 	void (*resume)(struct xe_exec_queue *q);
-	/** @reset_status: check exec queue reset status */
-	bool (*reset_status)(struct xe_exec_queue *q);
+	/** @reset_status: check exec queue ban status, returns ban reason bitmask */
+	u64 (*reset_status)(struct xe_exec_queue *q);
 };
 
 #endif
diff --git a/drivers/gpu/drm/xe/xe_execlist.c b/drivers/gpu/drm/xe/xe_execlist.c
index 0d0db66c6ea2..a36db39dcda8 100644
--- a/drivers/gpu/drm/xe/xe_execlist.c
+++ b/drivers/gpu/drm/xe/xe_execlist.c
@@ -453,10 +453,10 @@ static void execlist_exec_queue_resume(struct xe_exec_queue *q)
 	/* NIY */
 }
 
-static bool execlist_exec_queue_reset_status(struct xe_exec_queue *q)
+static u64 execlist_exec_queue_reset_status(struct xe_exec_queue *q)
 {
 	/* NIY */
-	return false;
+	return 0;
 }
 
 static const struct xe_exec_queue_ops execlist_exec_queue_ops = {
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index 99d8c807ff05..0a6e2b81b5a5 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -6,6 +6,7 @@
 #include "xe_guc_submit.h"
 
 #include <linux/bitfield.h>
+#include <uapi/drm/xe_drm.h>
 #include <linux/bitmap.h>
 #include <linux/circ_buf.h>
 #include <linux/dma-fence-array.h>
@@ -1599,6 +1600,12 @@ guc_exec_queue_timedout_job(struct drm_sched_job *drm_job)
 	else
 		wedged = xe_device_wedged(xe);
 
+	/*
+	 * Only tag as GPU hang if this is the original timeout, not a
+	 * consequence of a prior kill (e.g., page-offline).
+	 */
+	if (!exec_queue_killed(q))
+		atomic_or(DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG, &q->ban_reason);
 	set_exec_queue_banned(q);
 
 	/* Kick job / queue off hardware */
@@ -1682,6 +1689,9 @@ guc_exec_queue_timedout_job(struct drm_sched_job *drm_job)
 		if (timeout_needs_gt_reset(q, job, skip_timeout_check)) {
 			if (!xe_sched_invalidate_job(job, 2)) {
 				clear_exec_queue_banned(q);
+				/* protect concurrent page offline reasons */
+				atomic_andnot(DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG,
+					      &q->ban_reason);
 				xe_gt_reset_async(q->gt);
 				goto rearm;
 			}
@@ -2580,13 +2590,29 @@ static void guc_exec_queue_multi_queue_drop_suspend(struct xe_exec_queue *q)
 	}
 }
 
-static bool guc_exec_queue_reset_status(struct xe_exec_queue *q)
+static u64 guc_exec_queue_reset_status(struct xe_exec_queue *q)
 {
-	if (xe_exec_queue_is_multi_queue_secondary(q) &&
-	    guc_exec_queue_reset_status(xe_exec_queue_multi_queue_primary(q)))
-		return true;
+	/* TODO: In case of multiqueue, if a secondary queue is banned due to
+	 * page offlining, checking only the primary queue's GuC reset status
+	 * may mask the true reason or race with it.
+	 */
+	if (xe_exec_queue_is_multi_queue_secondary(q)) {
+		u64 status = guc_exec_queue_reset_status(xe_exec_queue_multi_queue_primary(q));
 
-	return exec_queue_reset(q) || exec_queue_killed_or_banned_or_wedged(q);
+		if (status)
+			return status;
+	}
+
+	if (exec_queue_reset(q) || exec_queue_killed_or_banned_or_wedged(q)) {
+		u64 reason = atomic_read_acquire(&q->ban_reason);
+
+		/* If no specific reason was recorded, default to GPU hang */
+		if (!reason)
+			reason = DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG;
+		return reason;
+	}
+
+	return 0;
 }
 
 /*
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index af9e1fa868d7..8f583f1631bf 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -10,6 +10,7 @@
 #include <drm/drm_managed.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_buddy.h>
+#include <uapi/drm/xe_drm.h>
 
 #include <drm/ttm/ttm_placement.h>
 #include <drm/ttm/ttm_range_manager.h>
@@ -582,6 +583,7 @@ u64 xe_ttm_vram_get_avail(struct ttm_resource_manager *man)
 
 static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
 {
+	u32	q_flag = DRM_XE_EXEC_QUEUE_BAN_REASON_PAGE_OFFLINE;
 	struct ttm_operation_ctx ctx = {};
 	struct xe_exec_queue *q_to_put = NULL;
 	struct xe_exec_queue *q = NULL;
@@ -596,7 +598,22 @@ static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
 	xe_bo_unlock(bo);
 	/*  Ban VM if BO is PPGTT */
 	if (vm && (flags & XE_BO_FLAG_PAGETABLE)) {
+		struct xe_exec_queue *eq;
+		int id;
+
 		down_write(&vm->lock);
+		if (xe->info.has_ctx_tlb_inval) {
+			down_read(&vm->exec_queues.lock);
+			for (id = 0; id < ARRAY_SIZE(vm->exec_queues.list); id++)
+				list_for_each_entry(eq, &vm->exec_queues.list[id],
+						    vm_exec_queue_link)
+					atomic_or(q_flag, &eq->ban_reason);
+			up_read(&vm->exec_queues.lock);
+		} else {
+			list_for_each_entry(eq, &vm->preempt.exec_queues, lr.link)
+				atomic_or(q_flag, &eq->ban_reason);
+		}
+		smp_wmb(); /* Force all queue bits to be visible before killing the VM */
 		xe_vm_kill(vm, true);
 		up_write(&vm->lock);
 	}
@@ -608,6 +625,8 @@ static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
 	/*  Ban exec queue if BO is lrc */
 	if (q && xe_exec_queue_get_unless_zero(q)) {
 		/* ban queue */
+		atomic_or(q_flag, &q->ban_reason);
+		smp_wmb(); /* Force bit change to finish before state change triggers */
 		q_to_put = q;
 	}
 
diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index 509202a7b13e..ee4a921b2e6e 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -1491,6 +1491,12 @@ struct drm_xe_exec_queue_destroy {
  *
  * The @property can be:
  *  - %DRM_XE_EXEC_QUEUE_GET_PROPERTY_BAN
+ *
+ * For %DRM_XE_EXEC_QUEUE_GET_PROPERTY_BAN, @value is a bitmask of ban reasons:
+ *  - %DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG - banned due to GPU hang/timeout
+ *  - %DRM_XE_EXEC_QUEUE_BAN_REASON_PAGE_OFFLINE - banned due to memory page offline
+ *
+ * A @value of 0 means the exec queue is not banned.
  */
 struct drm_xe_exec_queue_get_property {
 	/** @extensions: Pointer to the first extension struct, if any */
@@ -1503,7 +1509,17 @@ struct drm_xe_exec_queue_get_property {
 	/** @property: property to get */
 	__u32 property;
 
-	/** @value: property value */
+	/**
+	 * @value: property value
+	 *
+	 * For %DRM_XE_EXEC_QUEUE_GET_PROPERTY_BAN, this is a bitmask of:
+	 *  - %DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG - banned due to GPU hang/timeout
+	 *  - %DRM_XE_EXEC_QUEUE_BAN_REASON_PAGE_OFFLINE - banned due to memory page offline
+	 *
+	 * Value of 0 means the exec queue is not banned.
+	 */
+#define DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG		(1 << 0)
+#define DRM_XE_EXEC_QUEUE_BAN_REASON_PAGE_OFFLINE	(1 << 1)
 	__u64 value;
 
 	/** @reserved: Reserved */
-- 
2.52.0


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

* [PATCH V18 14/14] drm/xe: Add fault-inject based VRAM page offline injection
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (12 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
@ 2026-08-26 13:51 ` Tejas Upadhyay
  2026-08-27  7:10   ` Ghimiray, Himal Prasad
  2026-08-26 14:37 ` ✗ CI.checkpatch: warning for Add memory page offlining support (rev21) Patchwork
                   ` (3 subsequent siblings)
  17 siblings, 1 reply; 54+ messages in thread
From: Tejas Upadhyay @ 2026-08-26 13:51 UTC (permalink / raw)
  To: intel-xe
  Cc: himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Tejas Upadhyay

Add a fault-inject based debugfs interface for testing VRAM page
offlining. This replaces the previous standalone debugfs approach
with the standard kernel fault-inject infrastructure.

Two debugfs entries are created under the xe debugfs root for
CRI platforms:
- inject_mempage_offline/: Standard fault-inject knobs (probability,
  times, interval, etc.) created by fault_create_debugfs_attr().
  Without CONFIG_FAULT_INJECTION_DEBUG_FS, the stub returns
  ERR_PTR(-ENODEV) and no knobs are created, making the trigger
  effectively a no-op.
- inject_mempage_offline_trigger: Write a PFN value to inject a
  specific page, or write "0" to auto-pick the last unallocated
  VRAM page

The trigger accepts:
- "0"      : auto-pick last unallocated page
- "0xPFN"  : inject fault at a specific PFN address

Usage:
  echo 100 > inject_mempage_offline/probability
  echo 1 > inject_mempage_offline/times
  echo 0 > inject_mempage_offline_trigger

  probability: likelihood of should_fail() returning true (0-100)
  times: number of times injection is allowed (-1 for unlimited)

v5(Sashiko):
- exclude SRIOV and remove dpa_base addition, already absolute dpa
v4(Himal):
- Use xe_fault_mempage_offline() instead of IS_ENABLED() +
  direct should_fail(). CONFIG_FAULT_INJECTION_DEBUG_FS is now
  an implicit requirement for the trigger to function.
v3(Himal):
- Use FAULT_ACTION
v2(sashiko):
- use cond_resched()
- validate input first and fix addr < 0 case
- validate vr, move block, found var as local to scope_guard

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_debugfs.c      | 47 +++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_debugfs.h      |  2 ++
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 52 ++++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_ttm_vram_mgr.h |  1 +
 4 files changed, 102 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
index e19eafffbb08..003abf4af2e3 100644
--- a/drivers/gpu/drm/xe/xe_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_debugfs.c
@@ -45,12 +45,18 @@
 DECLARE_FAULT_ATTR(gt_reset_failure);
 DECLARE_FAULT_ATTR(inject_csc_hw_error);
 DECLARE_FAULT_ATTR(wedge_cold_reset);
+DECLARE_FAULT_ATTR(inject_mempage_offline);
 
 static bool csc_hw_error_available(struct xe_device *xe)
 {
 	return !IS_SRIOV_VF(xe) && xe->info.platform == XE_BATTLEMAGE;
 }
 
+static bool is_crescent_island_pf(struct xe_device *xe)
+{
+	return !IS_SRIOV_VF(xe) && xe->info.platform == XE_CRESCENTISLAND;
+}
+
 /*
  * Fault injection table.  Each entry registers a debugfs attribute; add a
  * matching FAULT_ACTION() below for every entry added here.
@@ -67,6 +73,9 @@ static struct {
 	  .is_visible = csc_hw_error_available },
 	{ .name = "wedge_cold_reset",
 	  .attr = &wedge_cold_reset },
+	{ .name = "inject_mempage_offline",
+	  .attr = &inject_mempage_offline,
+	  .is_visible = is_crescent_island_pf },
 };
 
 /*
@@ -82,6 +91,39 @@ bool xe_fault_##name(void)				\
 FAULT_ACTION(gt_reset, gt_reset_failure)
 FAULT_ACTION(csc_hw_error, inject_csc_hw_error)
 FAULT_ACTION(wedge_cold_reset, wedge_cold_reset)
+FAULT_ACTION(mempage_offline, inject_mempage_offline)
+
+static ssize_t inject_mempage_offline_trigger(struct file *f,
+					      const char __user *ubuf,
+					      size_t size, loff_t *pos)
+{
+	struct xe_device *xe = file_inode(f)->i_private;
+	struct xe_tile *tile = xe_device_get_root_tile(xe);
+	struct xe_vram_region *vr = tile->mem.vram;
+	u64 pfn;
+	int ret;
+
+	if (!vr)
+		return -ENODEV;
+
+	ret = kstrtou64_from_user(ubuf, size, 0, &pfn);
+	if (ret)
+		return ret;
+
+	if (!xe_fault_mempage_offline())
+		return size;
+
+	if (pfn == 0)
+		return xe_ttm_vram_inject_fault(xe) ?: size;
+
+	/* User provided PFN - convert to DPA and inject */
+	return xe_ttm_vram_handle_addr_fault(xe, pfn << PAGE_SHIFT) ?: size;
+}
+
+static const struct file_operations inject_mempage_offline_fops = {
+	.owner = THIS_MODULE,
+	.write = inject_mempage_offline_trigger,
+};
 
 static void xe_fault_inject_debugfs_register(struct xe_device *xe,
 					     struct dentry *root)
@@ -96,6 +138,11 @@ static void xe_fault_inject_debugfs_register(struct xe_device *xe,
 		fault_create_debugfs_attr(xe_fault_inject_entry[i].name, root,
 					  xe_fault_inject_entry[i].attr);
 	}
+
+	if (is_crescent_island_pf(xe)) {
+		debugfs_create_file("inject_mempage_offline_trigger", 0200,
+				    root, xe, &inject_mempage_offline_fops);
+	}
 }
 
 static void read_residency_counter(struct xe_device *xe, struct xe_mmio *mmio,
diff --git a/drivers/gpu/drm/xe/xe_debugfs.h b/drivers/gpu/drm/xe/xe_debugfs.h
index 0dcd28fd7dc0..88d91c78036b 100644
--- a/drivers/gpu/drm/xe/xe_debugfs.h
+++ b/drivers/gpu/drm/xe/xe_debugfs.h
@@ -14,11 +14,13 @@ struct xe_device;
 bool xe_fault_gt_reset(void);
 bool xe_fault_csc_hw_error(void);
 bool xe_fault_wedge_cold_reset(void);
+bool xe_fault_mempage_offline(void);
 void xe_debugfs_register(struct xe_device *xe);
 #else
 static inline bool xe_fault_gt_reset(void) { return false; }
 static inline bool xe_fault_csc_hw_error(void) { return false; }
 static inline bool xe_fault_wedge_cold_reset(void) { return false; }
+static inline bool xe_fault_mempage_offline(void) { return false; }
 static inline void xe_debugfs_register(struct xe_device *xe) { }
 #endif
 
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index 8f583f1631bf..c54ad017725f 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -895,6 +895,58 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
 }
 EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
 
+/**
+ * xe_ttm_vram_inject_fault - Inject a VRAM page fault for testing
+ * @xe: xe device instance
+ *
+ * Picks the last unallocated VRAM page and reports it as faulted
+ * via xe_ttm_vram_handle_addr_fault(). Used by the fault-inject
+ * debugfs interface for testing page offlining.
+ *
+ * Return: 0 on success, negative error code on failure.
+ */
+int xe_ttm_vram_inject_fault(struct xe_device *xe)
+{
+	struct xe_tile *tile = xe_device_get_root_tile(xe);
+	struct xe_vram_region *vr = tile->mem.vram;
+	struct xe_ttm_vram_mgr *vram_mgr = &vr->ttm;
+	struct gpu_buddy *mm = &vram_mgr->mm;
+	u64 addr;
+
+	if (vr->actual_physical_size < SZ_4K)
+		return -ENOSPC;
+
+	addr = vr->actual_physical_size - SZ_4K;
+	while (addr < vr->actual_physical_size) {
+		struct gpu_buddy_block *block;
+		bool found = false;
+
+		scoped_guard(mutex, &vram_mgr->lock) {
+			block = gpu_buddy_allocated_addr_to_block(mm, addr);
+			if (!block)
+				found = true;
+		}
+
+		/*
+		 * Intentional race window: xe_ttm_vram_handle_addr_fault()
+		 * re-acquires vram_mgr->lock internally, so we cannot hold
+		 * it here. A concurrent allocation claiming this page between
+		 * the two calls is an acceptable false negative for this
+		 * test-only path.
+		 */
+		if (found)
+			return xe_ttm_vram_handle_addr_fault(xe, addr + vr->dpa_base);
+
+		cond_resched();
+		if (addr == 0)
+			break;
+		addr -= SZ_4K;
+	}
+
+	return -ENOSPC;
+}
+EXPORT_SYMBOL(xe_ttm_vram_inject_fault);
+
 static int vram_bad_pages_show(struct seq_file *m, void *unused)
 {
 	struct xe_device *xe = m->private;
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
index f354c26c4257..8878e36292b2 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
@@ -33,6 +33,7 @@ void xe_ttm_vram_get_used(struct ttm_resource_manager *man,
 			  u64 *used, u64 *used_visible);
 
 int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr);
+int xe_ttm_vram_inject_fault(struct xe_device *xe);
 void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root);
 static inline struct xe_ttm_vram_mgr_resource *
 to_xe_ttm_vram_mgr_resource(struct ttm_resource *res)
-- 
2.52.0


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

* Re: [PATCH V18 08/14] drm/xe/vram: Add VRAM page offline fault handler
  2026-08-26 13:51 ` [PATCH V18 08/14] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
@ 2026-08-26 14:05   ` sashiko-bot
  0 siblings, 0 replies; 54+ messages in thread
From: sashiko-bot @ 2026-08-26 14:05 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 8 potential issue(s) to consider:
- [High] Forceful unpin of BO without owning the pin reference causes pin accounting underflow and crashes.
- [High] Lockless window allows a faulty free page to be allocated before it can be reserved for offlining.
- [High] Potential Use-After-Free when accessing `bo->q` via `READ_ONCE()` without lifetime guarantees.
- [High] Hardware fault report is discarded if the associated BO is being destroyed.
- [High] GFP_KERNEL allocation under vram_mgr->lock can cause an AB-BA deadlock with the memory shrinker.
- [Medium] Failed page reservations are kept in `queued_pages`, permanently preventing future offlining of the faulty page.
- [Medium] Missing list tracking before dropping the mutex in the free page path allows concurrent fault processing of the same address.
- [Medium] Discrepancy between commit message claims and implementation regarding GSM address detection.
--

commit 6222f1c8e506f747820c42eb0ee76c350791988a
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>

drm/xe/vram: Add VRAM page offline fault handler

Add the core VRAM page offlining logic to handle HW-reported faulty
physical addresses:

>     - xe_ttm_vram_addr_to_region(): Maps a DPA to its VRAM region.
>       Uses GSMBASE MMIO register to detect GSM addresses (returns NULL
>       for reset path). Returns ERR_PTR(-EOPNOTSUPP) for addresses

[Severity: Medium]
The commit message states that the GSMBASE MMIO register is used to detect GSM
addresses, but the implementation in `xe_ttm_vram_addr_to_region()` uses a
size heuristic instead.

> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index 1253989a8d06a..b2b6c1bd2c555 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
[ ... ]
> @@ -572,3 +578,293 @@ u64 xe_ttm_vram_get_avail(struct ttm_resource_manager *man)
>  
>  	return avail;
>  }
> +
> +static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
> +{
[ ... ]
> +	xe_bo_lock(bo, false);
> +	q = READ_ONCE(bo->q);
> +	/*  Ban exec queue if BO is lrc */
> +	if (q && xe_exec_queue_get_unless_zero(q)) {

[Severity: High]
Could this lead to a use-after-free? Because there is no rcu_read_lock() or
other lifetime guarantee held here, the memory backing `q` could be freed
concurrently before xe_exec_queue_get_unless_zero() is called.

> +		/* ban queue */
> +		q_to_put = q;
> +	}
> +
> +	if (bo->purgeable.state == XE_MADV_PURGEABLE_PURGED) {
> +		/* Already purged by shrinker during unlocked window — nothing to do */
> +		xe_bo_unlock(bo);
> +		goto out;
> +	}
> +
> +	xe_bo_set_purgeable_state(bo, XE_MADV_PURGEABLE_DONTNEED);
> +	ttm_bo_unmap_virtual(&bo->ttm);   /* nuke CPU mmap + VRAM IO mappings */
> +	if (xe_bo_is_pinned(bo))
> +		xe_bo_unpin(bo);

[Severity: High]
Does forcefully unpinning a BO here without owning the pin reference break pin
accounting? When the legitimate owner eventually unpins the BO, it seems this
could cause an underflow in `pin_count` or trigger assertion panics like
`xe_assert(xe, !list_empty(&bo->pinned_link))`.

> +	ret = xe_ttm_bo_purge(&bo->ttm, &ctx);
> +	xe_bo_unlock(bo);
[ ... ]
> +static int xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
> +					    struct xe_ttm_vram_mgr *vram_mgr, struct gpu_buddy *mm)
> +{
[ ... ]
> +	scoped_guard(mutex, &vram_mgr->lock) {
> +		if (xe_ttm_vram_page_already_processed(vram_mgr, addr))
> +			return -EEXIST;
> +		block = gpu_buddy_allocated_addr_to_block(mm, addr);
> +		if (WARN_ON(IS_ERR(block)))
> +			return PTR_ERR(block);
> +
> +		nentry = kzalloc_obj(*nentry);
> +		if (!nentry)
> +			return -ENOMEM;

[Severity: High]
Can allocating with GFP_KERNEL while holding `vram_mgr->lock` cause an AB-BA
deadlock? Under memory pressure, this could trigger the TTM shrinker to run in
direct reclaim, which would then attempt to acquire `vram_mgr->lock` to evict
BOs.

> +		INIT_LIST_HEAD(&nentry->blocks);
> +		nentry->status = XE_PAGE_RESERVE_PENDING;
> +		nentry->addr = addr;
> +
> +		if (block) {
> +			struct xe_bo *pbo;
> +
> +			if (!block->private) {
> +				/* Race: another thread just reserved this block */
> +				kfree(nentry);
> +				return -EEXIST;
> +			}
> +			tbo = block->private;
> +			pbo = ttm_to_xe_bo(tbo);
> +
> +			/* Get reference safely - BO may have zero refcount */
> +			if (!xe_bo_get_unless_zero(pbo)) {
> +				kfree(nentry);
> +				return -ENOENT;
> +			}

[Severity: High]
Are we discarding the hardware fault report if the associated BO happens to be
undergoing destruction? Returning -ENOENT here means the bad page will be
returned to the free pool once the BO finishes destruction, and future
allocations will claim this defective page.

> +			/*
> +			 * Critical kernel BO? Best-effort check without resv lock;
> +			 * worst case a concurrent pin causes reset path unnecessarily.
> +			 */
> +			if ((pbo->ttm.type == ttm_bo_type_kernel &&
> +			     !(pbo->flags & XE_BO_FLAG_PINNED_LATE_RESTORE)) ||
> +			    (xe_bo_is_user(pbo) && xe_bo_is_pinned(pbo))) {

[Severity: High]
Does this lockless check allow concurrently pinned user BOs or LATE_RESTORE
kernel BOs to slip through to the destructive purge path? This leads directly
to the forceful `xe_bo_unpin(bo)` mentioned earlier, breaking pin accounting.

> +				kfree(nentry);
> +				pbo_to_put = pbo;
> +				drm_err(&xe->drm,
> +					"%s: addr: 0x%llx is critical kernel bo, requesting SBR\n",
> +					__func__, addr);
> +				break;
> +			}
> +			++vram_mgr->n_queued_pages;
> +			list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
> +		}
> +	}
> +
> +	/* Deferred put outside lock to avoid recursive deadlock */

[Severity: Medium]
If `block` was NULL (indicating a free page), `nentry` was not added to
`queued_pages` inside the `scoped_guard` above. Since the lock is dropped here,
doesn't this leave a window where a concurrent fault for the exact same address
could bypass the `xe_ttm_vram_page_already_processed()` check?

[Severity: High]
Additionally, dropping the lock here before handling the `else` path for free
blocks creates a race window. Can a concurrent thread allocate the free block in
this window before the fault handler re-acquires the lock and calls
`xe_ttm_vram_buddy_alloc()`?

> +	if (pbo_to_put) {
> +		xe_bo_put(pbo_to_put);
> +		/* Hint System controller driver for reset with -EIO  */
> +		return -EIO;
> +	}
> +
> +	if (block) {
[ ... ]
> +		/* Reserve page at address addr*/
> +		scoped_guard(mutex, &vram_mgr->lock) {
> +			ret = xe_ttm_vram_buddy_alloc(vram_mgr, addr, addr + size,
> +						      size, size, &nentry->blocks,
> +						      GPU_BUDDY_RANGE_ALLOCATION,
> +						      NULL, &nentry->used_visible_size);
> +			if (ret) {
> +				drm_warn(&xe->drm,
> +					 "Could not reserve page at addr:0x%llx, ret:%d\n",
> +					 addr, ret);
> +				nentry->status = XE_PAGE_RESERVE_FAIL;
> +				return ret;
> +			}

[Severity: Medium]
If the reservation fails, this error path leaves `nentry` in `queued_pages`
with a failure status. Will this permanently mask all future faults for this bad
page, preventing it from ever being offlined?

> +
> +			list_for_each_entry_safe(pos, n, &vram_mgr->queued_pages, queued_link) {
[ ... ]
> +static struct xe_vram_region *xe_ttm_vram_addr_to_region(struct xe_device *xe, u64 addr)
> +{
[ ... ]
> +		if (addr >= vr->dpa_base && addr < (vr->dpa_base + vr->usable_size))
> +			return vr;
> +
> +		/* CCS, GSM, or DSM — infrastructure zone, needs reset */
> +		if (addr >= (vr->dpa_base + vr->usable_size) &&
> +		    addr < (vr->dpa_base + vr->actual_physical_size))
> +			return NULL;

[Severity: Medium]
As mentioned above, the commit message says this checks the GSMBASE MMIO
register, but this uses a size heuristic based on `actual_physical_size` and
`usable_size`. Is the implementation missing the MMIO register check?

> +	}
> +
> +	/*

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260826135136.204044-16-tejas.upadhyay@intel.com?part=8

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

* Re: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-26 13:51 ` [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well Tejas Upadhyay
@ 2026-08-26 14:07   ` sashiko-bot
  2026-08-26 22:42   ` Andi Shyti
  1 sibling, 0 replies; 54+ messages in thread
From: sashiko-bot @ 2026-08-26 14:07 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:

Pre-existing issues:
- [Critical] Calling `xe_bo_is_vram()` on a purged BO causes a NULL pointer dereference because `bo->ttm.resource` is NULL.
--

commit 8ea3d385f1cb1d34b69c171b968bd8b676aaa611
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>

drm/xe: Extend BO purge to handle vram pages as well

Recent driver update introduce support for purgeable buffer
objects (BOs), extending the API to include VRAM pages to
better manage memory pressure and enable memory offlining.

> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index dde309821237b..52f81e972adad 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
> @@ -921,7 +921,7 @@ void xe_bo_set_purgeable_state(struct xe_bo *bo,
>   *
>   * Return: 0 on success, negative error code on failure
>   */
> -static int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx)
> +int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx)
>  {
>  	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
>  	struct ttm_placement place = {};
> @@ -929,9 +929,6 @@ static int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operatio
>  
>  	xe_bo_assert_held(bo);
>  
> -	if (!ttm_bo->ttm)
> -		return 0;
> -

[Severity: Critical]
This is a pre-existing issue, but I have a question about how xe_bo_is_vram()
handles purged BOs.

When a BO is purged, its TTM resource is freed and set to NULL. However,
xe_bo_is_vram() unconditionally passes bo->ttm.resource to resource_is_vram(),
which then dereferences it:

drivers/gpu/drm/xe/xe_bo.c:xe_bo_is_vram() {
	return resource_is_vram(bo->ttm.resource) ||
		resource_is_stolen_vram(xe_bo_device(bo), bo->ttm.resource);
}

drivers/gpu/drm/xe/xe_bo.c:resource_is_vram() {
	return mem_type_is_vram(res->mem_type);
}

This can lead to a NULL pointer dereference. For instance, in madvise_atomic(),
an unprivileged user can trigger this on a purged BO:

drivers/gpu/drm/xe/xe_vm_madvise.c:madvise_atomic() {
    ...
		/* Invalidate cpu page table, so bo can migrate to smem in next access */
		if (xe_bo_is_vram(bo) &&
		    (bo->attr.atomic_access == DRM_XE_ATOMIC_CPU ||
		     bo->attr.atomic_access == DRM_XE_ATOMIC_GLOBAL))
			ttm_bo_unmap_virtual(&bo->ttm);
    ...
}

It is also called unguarded in xe_pt_target_leaf_level_from_bo(), which could
crash during VM rebind if debug page size mode is enabled:

drivers/gpu/drm/xe/xe_pt.c:xe_pt_target_leaf_level_from_bo() {
    ...
	if (!bo || !xe_bo_is_vram(bo) || !(bo->flags & XE_BO_FLAG_USER))
		return 0;
    ...
}

Does xe_bo_is_vram() need a check for !bo->ttm.resource before accessing
res->mem_type to prevent a kernel oops or panic?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260826135136.204044-16-tejas.upadhyay@intel.com?part=3

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

* Re: [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler
  2026-08-26 13:51 ` [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler Tejas Upadhyay
@ 2026-08-26 14:08   ` sashiko-bot
  2026-08-27  6:46   ` Ghimiray, Himal Prasad
  2026-08-27 15:04   ` Michal Wajdeczko
  2 siblings, 0 replies; 54+ messages in thread
From: sashiko-bot @ 2026-08-26 14:08 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Page reservation is unconditionally disabled on non-Crescent Island platforms (like PVC), silently ignoring configfs settings.
--

commit e2ecbfdccfac5cd8843020d324241d927ec0f055
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>

drm/xe/vram: Check bad_page_reservation policy in fault handler

This commit adds a check for the cached bad_page_reservation policy in the
VRAM address fault handler. If the policy is disabled, it logs the corrupted
address and returns -EOPNOTSUPP instead of offlining the page.

> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index b2b6c1bd2c555..24d1347542651 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -864,6 +864,12 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
>  	vram_mgr = &vr->ttm;
>  	mm = &vram_mgr->mm;
>  
> +	if (!xe->ras.bad_page_reservation) {
        ^^^^

[Severity: High]
Does this unintentionally disable page reservation on non-Crescent Island
platforms that support RAS?

Because xe_ras_init() only populates xe->ras.bad_page_reservation on
XE_CRESCENTISLAND, the cached value remains false (0) on other platforms like
PVC. As a result, this check will unconditionally evaluate to true on those
platforms, skipping page reservation and silently ignoring the configfs setting.

> +		drm_err(&xe->drm, "0x%llx is reported as corrupted address by HW\n",
> +			addr);
> +		return -EOPNOTSUPP;
> +	}
> +
>  	/* Reserve page at address */
>  	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
>  }

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260826135136.204044-16-tejas.upadhyay@intel.com?part=11

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

* Re: [PATCH V18 10/14] drm/xe/ras: Cache bad_page_reservation policy at init
  2026-08-26 13:51 ` [PATCH V18 10/14] drm/xe/ras: Cache bad_page_reservation policy at init Tejas Upadhyay
@ 2026-08-26 14:11   ` sashiko-bot
  2026-08-27  6:45   ` Ghimiray, Himal Prasad
  1 sibling, 0 replies; 54+ messages in thread
From: sashiko-bot @ 2026-08-26 14:11 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

New issues:
- [Medium] The commit message claims caching happens in xe_drm_ras_init(), but it is actually implemented in xe_ras_init().

Pre-existing issues:
- [High] Ignored return value from `xe_drm_ras_init()` leads to potential NULL pointer dereference on error paths.
--

commit 5b627dce853b33e2e2e98dd02e3de8fcd0a8ae35
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>

drm/xe/ras: Cache bad_page_reservation policy at init

This commit caches the configfs bad_page_reservation attribute during driver
initialization to prevent repeated configfs lookups on every fault.

> drm/xe/ras: Cache bad_page_reservation policy at init
> 
> The configfs bad_page_reservation attribute can only be set before
> device bind, so its value is immutable at runtime. Cache it in
> struct xe_drm_ras during xe_drm_ras_init() to avoid repeated configfs
> lookups on every fault.

[Severity: Medium]
The commit message states that caching happens "during xe_drm_ras_init()", but
the patch actually implements the configfs lookup and caching in xe_ras_init()
instead. Should the commit message be updated to reflect the correct function?

> diff --git a/drivers/gpu/drm/xe/xe_ras.c b/drivers/gpu/drm/xe/xe_ras.c
> index d25d25f775310..c7e86ae0e8adb 100644
> --- a/drivers/gpu/drm/xe/xe_ras.c
> +++ b/drivers/gpu/drm/xe/xe_ras.c
[ ... ]
> @@ -804,6 +805,10 @@ void xe_ras_init(struct xe_device *xe)
>  {
>  	int ret;
>  
> +	if (xe->info.platform == XE_CRESCENTISLAND)
> +		xe->ras.bad_page_reservation =
> +			xe_configfs_get_bad_page_reservation(to_pci_dev(xe->drm.dev));
> +
>  	xe_drm_ras_init(xe);

[Severity: High]
This isn't a bug introduced by this patch, but the return value of
xe_drm_ras_init() is completely ignored here. 

If xe_drm_ras_init() fails (e.g., if drmm_kcalloc() returns NULL),
xe->ras.node remains NULL. Because the error is ignored, device initialization
continues and DRM RAS is considered enabled (has_drm_ras remains true).

Later, if a hardware error triggers xe_drm_ras_event(), the code calculates:

    node = &ras->node[severity];

If severity > 0, this results in a non-NULL but invalid pointer (computed as a
small offset from NULL). drm_ras_nl_error_event() receives this pointer, its
!node check passes, and it dereferences node->id, causing a kernel panic.

Should we check the return value of xe_drm_ras_init() and handle the failure?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260826135136.204044-16-tejas.upadhyay@intel.com?part=10

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

* Re: [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs
  2026-08-26 13:51 ` [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
@ 2026-08-26 14:12   ` sashiko-bot
  2026-08-27  6:08   ` Ghimiray, Himal Prasad
  1 sibling, 0 replies; 54+ messages in thread
From: sashiko-bot @ 2026-08-26 14:12 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Missing xe_bo_is_purged() guard in PSMI teardown path causes xe_assert warnings on purged BOs.
--

commit b5b060f35b87d3363b29c5356982c12efa65fab5
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>

drm/xe: Guard teardown paths against purged BOs

This commit adds guards to prevent unpinning or mapping buffer objects that
have already been purged by VRAM page offlining in multiple teardown paths.

> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
> index eede678ad303a..dfcd0e57073be 100644
> --- a/drivers/gpu/drm/xe/xe_bo.h
> +++ b/drivers/gpu/drm/xe/xe_bo.h
> @@ -364,7 +364,8 @@ static inline void xe_bo_unpin_map_no_vm(struct xe_bo *bo)
>  {
>  	if (likely(bo)) {
>  		xe_bo_lock(bo, false);
> -		xe_bo_unpin(bo);
> +		if (!xe_bo_is_purged(bo))
> +			xe_bo_unpin(bo);
>  		xe_bo_unlock(bo);

[Severity: Medium]
Does the PSMI teardown path in psmi_free_object() also need this guard?

Looking at drivers/gpu/drm/xe/xe_psmi.c, psmi_free_object() unpins the
capture BO without checking if it was purged:

drivers/gpu/drm/xe/xe_psmi.c:psmi_free_object() {
        ...
        xe_bo_lock(bo, NULL);
        xe_bo_unpin(bo);
        xe_bo_unlock(bo);
        ...
}

If the PSMI capture buffer is allocated, it is pinned in VRAM and tagged with
the XE_BO_FLAG_PINNED_LATE_RESTORE flag. If a VRAM page offline fault occurs,
xe_ttm_vram_reserve_page_at_addr() will successfully purge and unpin the BO
because the LATE_RESTORE flag explicitly bypasses the system reset check.

Later, when PSMI is disabled or resized, psmi_cleanup() calls
psmi_free_object(), which directly calls xe_bo_unpin() without checking
xe_bo_is_purged(). Calling xe_bo_unpin() on a BO with a 0 pin count triggers
xe_assert(xe, xe_bo_is_pinned(bo)) in Xe and a WARN_ON_ONCE in the TTM core.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260826135136.204044-16-tejas.upadhyay@intel.com?part=5

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

* Re: [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs
  2026-08-26 13:51 ` [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
@ 2026-08-26 14:13   ` sashiko-bot
  2026-08-27 15:16   ` Michal Wajdeczko
  2026-08-28 15:04   ` Rodrigo Vivi
  2 siblings, 0 replies; 54+ messages in thread
From: sashiko-bot @ 2026-08-26 14:13 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] Use-After-Free and data race due to lockless traversal of pos->blocks.
- [Medium] TOCTOU race in xe_ttm_vram_reserve_page_at_addr leads to duplicate tracking entries and state inconsistency.
- [Low] The max_pages field is printed in debugfs but is never initialized or populated.
--

commit b60ddd8b2f9645ba022492a4803a15126cca2249
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
Subject: drm/xe: Expose bad VRAM pages via debugfs

This commit adds a debugfs file vram_bad_pages that shows offlined and
queued VRAM pages across all tiles. Each entry displays the page frame
number, GPU page size, and status flag.

> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
[ ... ]
> @@ -874,3 +875,68 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
>  	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
>  }
>  EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
> +
> +static int vram_bad_pages_show(struct seq_file *m, void *unused)
> +{
> +	struct xe_device *xe = m->private;
> +	struct xe_ttm_vram_offline_resource *pos;
> +	struct ttm_resource_manager *man;
> +	struct gpu_buddy_block *block;
> +	struct xe_ttm_vram_mgr *mgr;
> +	struct xe_tile *tile;
> +	u8 id;
> +
> +	man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
> +	if (man)
> +		seq_printf(m, "max_pages: %d\n",
> +			   to_xe_ttm_vram_mgr(man)->max_pages);

[Severity: Low]
Is there a regression where max_pages is printed but never initialized? 

It is defined in struct xe_ttm_vram_mgr and printed here, but it doesn't
appear to be assigned a value anywhere in the driver codebase.

Will this debugfs file always incorrectly output max_pages: 0?

> +
> +	for_each_tile(tile, xe, id) {
> +		struct xe_vram_region *vr = tile->mem.vram;
> +
> +		man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0 + id);
> +		if (!man || !vr)
> +			continue;
> +		mgr = to_xe_ttm_vram_mgr(man);
> +
> +		rcu_read_lock();
> +
> +		list_for_each_entry_rcu(pos, &mgr->offlined_pages, offlined_link) {
> +			block = list_first_entry_or_null(&pos->blocks,
> +							 struct gpu_buddy_block, link);

[Severity: High]
In xe_ttm_vram_reserve_page_at_addr(), an entry is published to the
queued_pages list via list_add_rcu() before its blocks are populated:

xe_ttm_vram_reserve_page_at_addr() {
    ...
    ++vram_mgr->n_queued_pages;
    list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
    ...
}

If the subsequent buddy allocation fails halfway, it rolls back and frees
the blocks directly back to the slab allocator without respecting RCU grace
periods. 

Additionally, gpu_buddy_alloc_blocks() modifies the list using standard
list_add and list_del rather than RCU-safe variants, which could create a
data race on the list pointers themselves.

Could an RCU reader here obtain a pointer to a block just as it is being
freed, resulting in a Use-After-Free regression when accessing the block
later?

> +			if (!block)
> +				continue;
> +
> +			seq_printf(m, "0x%016llx : 0x%016llx : R\n",
> +				   (gpu_buddy_block_offset(block) + vr->dpa_base) >> PAGE_SHIFT,
> +				   gpu_buddy_block_size(&mgr->mm, block));
> +		}
> +
> +		list_for_each_entry_rcu(pos, &mgr->queued_pages, queued_link) {

[Severity: Medium]
When xe_ttm_vram_reserve_page_at_addr() is called for an unallocated
address, it allocates nentry under the lock but drops the lock before
adding it to queued_pages:

xe_ttm_vram_reserve_page_at_addr() {
    scoped_guard(mutex, &vram_mgr->lock) {
        if (xe_ttm_vram_page_already_processed(vram_mgr, addr))
            return -EEXIST;
        ... if block is NULL, nentry is NOT added here ...
    }
    
    ... lock is dropped ...
    
    if (block) {
        ...
    } else {
        scoped_guard(mutex, &vram_mgr->lock) {
            ++vram_mgr->n_queued_pages;
            list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
            ...
        }
    }
}

Multiple concurrent faults on the same address could both bypass the
xe_ttm_vram_page_already_processed() check because neither added their
entry to the list yet.

Both threads would then reacquire the lock and add their nentry to
queued_pages. One might succeed (moving to offlined_pages) while the other
fails (staying in queued_pages).

Could this iteration encounter a regression with duplicate tracking entries
for the exact same physical address, resulting in conflicting states being
exposed here?

> +			u64 pfn, blk_size;
> +
> +			block = list_first_entry_or_null(&pos->blocks,
> +							 struct gpu_buddy_block, link);
[ ... ]

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260826135136.204044-16-tejas.upadhyay@intel.com?part=12

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

* Re: [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
  2026-08-26 13:51 ` [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
@ 2026-08-26 14:20   ` sashiko-bot
  2026-08-27 18:26   ` Andi Shyti
  1 sibling, 0 replies; 54+ messages in thread
From: sashiko-bot @ 2026-08-26 14:20 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Critical] Concurrent iteration and mutation of `vm->exec_queues.list` using only `down_read` causes list and kernel stack corruption.
- [Medium] The PAGE_OFFLINE ban reason is hidden for non-LR queues until TDR fires, defeating the logic to prevent GPU_HANG masking.
- [Medium] Missing read memory barrier before checking `ban_reason` allows speculative out-of-order execution, causing the UAPI to report a stale status.
--

commit f03e51ea5f032e49889009d1894c9441c7fe6525
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>

drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN

Extend DRM_XE_EXEC_QUEUE_GET_PROPERTY_BAN to return a bitmask indicating
the reason for the ban, rather than a simple boolean. This allows
userspace to distinguish between different ban causes.

> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
> index 99d8c807ff056..0a6e2b81b5a53 100644
> --- a/drivers/gpu/drm/xe/xe_guc_submit.c
> +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
> @@ -1599,6 +1600,12 @@ guc_exec_queue_timedout_job(struct drm_sched_job *drm_job)
>  	else
>  		wedged = xe_device_wedged(xe);
>  
> +	/*
> +	 * Only tag as GPU hang if this is the original timeout, not a
> +	 * consequence of a prior kill (e.g., page-offline).
> +	 */
> +	if (!exec_queue_killed(q))
> +		atomic_or(DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG, &q->ban_reason);

[Severity: Medium]
Will this properly mask the GPU_HANG bit for non-LR (legacy) queues?

When xe_ttm_vram_purge_page() sets PAGE_OFFLINE on non-LR queues, it calls
xe_vm_kill(). However, xe_vm_kill() only explicitly iterates and kills LR
queues (those in &vm->preempt.exec_queues). 

Since non-LR queues are not explicitly marked as killed, wouldn't this check
evaluate to true and still incorrectly append the GPU_HANG reason when the
doomed non-LR queue eventually times out?

>  	set_exec_queue_banned(q);
>  
>  	/* Kick job / queue off hardware */
[ ... ]
> @@ -2580,13 +2590,29 @@ static void guc_exec_queue_multi_queue_drop_suspend(struct xe_exec_queue *q)
[ ... ]
> -static bool guc_exec_queue_reset_status(struct xe_exec_queue *q)
> +static u64 guc_exec_queue_reset_status(struct xe_exec_queue *q)
>  {
[ ... ]
> -	return exec_queue_reset(q) || exec_queue_killed_or_banned_or_wedged(q);
> +	if (exec_queue_reset(q) || exec_queue_killed_or_banned_or_wedged(q)) {
> +		u64 reason = atomic_read_acquire(&q->ban_reason);
> +
> +		/* If no specific reason was recorded, default to GPU hang */
> +		if (!reason)
> +			reason = DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG;
> +		return reason;
> +	}

[Severity: Medium]
Does this sequence allow for a stale or speculative status read?

Because the condition (exec_queue_killed_or_banned_or_wedged) is evaluated
using a relaxed atomic read, there is only a control dependency before
atomic_read_acquire() on q->ban_reason.

On weakly-ordered architectures, the CPU can speculatively load q->ban_reason
before the state check. If the speculative read happens right as
xe_ttm_vram_purge_page() is updating the status, couldn't reason evaluate to 0
and spuriously default to GPU_HANG instead of PAGE_OFFLINE? Would an smp_rmb()
be required here to properly order the reads?

> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index af9e1fa868d7f..8f583f1631bf4 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -596,7 +598,22 @@ static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
>  	xe_bo_unlock(bo);
>  	/*  Ban VM if BO is PPGTT */
>  	if (vm && (flags & XE_BO_FLAG_PAGETABLE)) {
> +		struct xe_exec_queue *eq;
> +		int id;
> +
>  		down_write(&vm->lock);
> +		if (xe->info.has_ctx_tlb_inval) {
> +			down_read(&vm->exec_queues.lock);
> +			for (id = 0; id < ARRAY_SIZE(vm->exec_queues.list); id++)
> +				list_for_each_entry(eq, &vm->exec_queues.list[id],
> +						    vm_exec_queue_link)
> +					atomic_or(q_flag, &eq->ban_reason);
> +			up_read(&vm->exec_queues.lock);

[Severity: Critical]
Is it safe to iterate vm->exec_queues.list while holding only the lock in
read mode?

Currently, the MMU notifier paths like xe_svm_invalidate() submit TLB
invalidations by calling send_tlb_inval_ctx_ppgtt(). That function also takes
down_read(&vm->exec_queues.lock) but then it mutates the list, moving items
using list_move_tail(&q->vm_exec_queue_link, &tlb_inval_list) onto a local
stack variable.

If the shrinker triggers this purge_page path concurrently with the MMU
notifier, both will execute concurrently because they both hold the lock using
down_read().

Could the list_for_each_entry() iterator here follow pointers into the stack
frame of send_tlb_inval_ctx_ppgtt(), resulting in list/kernel stack
corruption and arbitrary memory writes when atomic_or() is called?

> +		} else {
> +			list_for_each_entry(eq, &vm->preempt.exec_queues, lr.link)
> +				atomic_or(q_flag, &eq->ban_reason);
> +		}
> +		smp_wmb(); /* Force all queue bits to be visible before killing the VM */
>  		xe_vm_kill(vm, true);

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260826135136.204044-16-tejas.upadhyay@intel.com?part=13

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

* ✗ CI.checkpatch: warning for Add memory page offlining support (rev21)
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (13 preceding siblings ...)
  2026-08-26 13:51 ` [PATCH V18 14/14] drm/xe: Add fault-inject based VRAM page offline injection Tejas Upadhyay
@ 2026-08-26 14:37 ` Patchwork
  2026-08-26 14:39 ` ✓ CI.KUnit: success " Patchwork
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 54+ messages in thread
From: Patchwork @ 2026-08-26 14:37 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

== Series Details ==

Series: Add memory page offlining support (rev21)
URL   : https://patchwork.freedesktop.org/series/161473/
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
061140b9bc586ae7f40abc1249c97e1cc72d1b9d
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit d39a1795d95fb2ac44d9990e28f73a9d2675d15e
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
Date:   Wed Aug 26 19:21:49 2026 +0530

    drm/xe: Add fault-inject based VRAM page offline injection
    
    Add a fault-inject based debugfs interface for testing VRAM page
    offlining. This replaces the previous standalone debugfs approach
    with the standard kernel fault-inject infrastructure.
    
    Two debugfs entries are created under the xe debugfs root for
    CRI platforms:
    - inject_mempage_offline/: Standard fault-inject knobs (probability,
      times, interval, etc.) created by fault_create_debugfs_attr().
      Without CONFIG_FAULT_INJECTION_DEBUG_FS, the stub returns
      ERR_PTR(-ENODEV) and no knobs are created, making the trigger
      effectively a no-op.
    - inject_mempage_offline_trigger: Write a PFN value to inject a
      specific page, or write "0" to auto-pick the last unallocated
      VRAM page
    
    The trigger accepts:
    - "0"      : auto-pick last unallocated page
    - "0xPFN"  : inject fault at a specific PFN address
    
    Usage:
      echo 100 > inject_mempage_offline/probability
      echo 1 > inject_mempage_offline/times
      echo 0 > inject_mempage_offline_trigger
    
      probability: likelihood of should_fail() returning true (0-100)
      times: number of times injection is allowed (-1 for unlimited)
    
    v5(Sashiko):
    - exclude SRIOV and remove dpa_base addition, already absolute dpa
    v4(Himal):
    - Use xe_fault_mempage_offline() instead of IS_ENABLED() +
      direct should_fail(). CONFIG_FAULT_INJECTION_DEBUG_FS is now
      an implicit requirement for the trigger to function.
    v3(Himal):
    - Use FAULT_ACTION
    v2(sashiko):
    - use cond_resched()
    - validate input first and fix addr < 0 case
    - validate vr, move block, found var as local to scope_guard
    
    Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
+ /mt/dim checkpatch 4a47d4b5bf957bd7e34d8d3ab7096c42161892c6 drm-intel
a3fbfca74c00 drm/xe: Link VRAM object with gpu buddy
de302ba0f44c drm/xe: Link LRC BO and its execution Queue
aaeec1674025 drm/xe: Extend BO purge to handle vram pages as well
a45957fb1d8b drm/xe/bo: Make xe_bo_is_user() public
4c21381f3095 drm/xe: Guard teardown paths against purged BOs
b6265a805ca8 drm/xe/vram: Extract buddy alloc and free helpers
90aeab6891c1 drm/xe/vram: Add page offline data structures and lifecycle
088e92e2342d drm/xe/vram: Add VRAM page offline fault handler
caf644fea7cb drm/xe/configfs: Add bad_page_reservation attribute
f96f12f37dbe drm/xe/ras: Cache bad_page_reservation policy at init
a32253310cfb drm/xe/vram: Check bad_page_reservation policy in fault handler
1215ea99cb79 drm/xe: Expose bad VRAM pages via debugfs
-:19: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#19: 
0x0000000000080000 : 0x0000000000001000 : R   ← tile 1 addr (includes tile offset)

total: 0 errors, 1 warnings, 0 checks, 113 lines checked
f863dd60b2ae drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
d39a1795d95f drm/xe: Add fault-inject based VRAM page offline injection



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

* ✓ CI.KUnit: success for Add memory page offlining support (rev21)
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (14 preceding siblings ...)
  2026-08-26 14:37 ` ✗ CI.checkpatch: warning for Add memory page offlining support (rev21) Patchwork
@ 2026-08-26 14:39 ` Patchwork
  2026-08-26 15:21 ` ✓ Xe.CI.BAT: " Patchwork
  2026-08-26 19:01 ` ✓ Xe.CI.FULL: " Patchwork
  17 siblings, 0 replies; 54+ messages in thread
From: Patchwork @ 2026-08-26 14:39 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

== Series Details ==

Series: Add memory page offlining support (rev21)
URL   : https://patchwork.freedesktop.org/series/161473/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[14:37:52] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[14:37:57] 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
[14:38:29] Starting KUnit Kernel (1/1)...
[14:38:29] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[14:38:29] ================== guc_buf (11 subtests) ===================
[14:38:29] [PASSED] test_smallest
[14:38:29] [PASSED] test_largest
[14:38:29] [PASSED] test_granular
[14:38:29] [PASSED] test_unique
[14:38:29] [PASSED] test_overlap
[14:38:29] [PASSED] test_reusable
[14:38:29] [PASSED] test_too_big
[14:38:29] [PASSED] test_flush
[14:38:29] [PASSED] test_lookup
[14:38:29] [PASSED] test_data
[14:38:29] [PASSED] test_class
[14:38:29] ===================== [PASSED] guc_buf =====================
[14:38:29] =================== guc_dbm (7 subtests) ===================
[14:38:29] [PASSED] test_empty
[14:38:29] [PASSED] test_default
[14:38:29] ======================== test_size  ========================
[14:38:29] [PASSED] 4
[14:38:29] [PASSED] 8
[14:38:29] [PASSED] 32
[14:38:29] [PASSED] 256
[14:38:29] ==================== [PASSED] test_size ====================
[14:38:29] ======================= test_reuse  ========================
[14:38:29] [PASSED] 4
[14:38:29] [PASSED] 8
[14:38:29] [PASSED] 32
[14:38:29] [PASSED] 256
[14:38:29] =================== [PASSED] test_reuse ====================
[14:38:29] =================== test_range_overlap  ====================
[14:38:29] [PASSED] 4
[14:38:29] [PASSED] 8
[14:38:29] [PASSED] 32
[14:38:29] [PASSED] 256
[14:38:29] =============== [PASSED] test_range_overlap ================
[14:38:29] =================== test_range_compact  ====================
[14:38:29] [PASSED] 4
[14:38:29] [PASSED] 8
[14:38:29] [PASSED] 32
[14:38:29] [PASSED] 256
[14:38:29] =============== [PASSED] test_range_compact ================
[14:38:29] ==================== test_range_spare  =====================
[14:38:29] [PASSED] 4
[14:38:29] [PASSED] 8
[14:38:29] [PASSED] 32
[14:38:29] [PASSED] 256
[14:38:29] ================ [PASSED] test_range_spare =================
[14:38:29] ===================== [PASSED] guc_dbm =====================
[14:38:29] =================== guc_idm (6 subtests) ===================
[14:38:29] [PASSED] bad_init
[14:38:29] [PASSED] no_init
[14:38:29] [PASSED] init_fini
[14:38:29] [PASSED] check_used
[14:38:29] [PASSED] check_quota
[14:38:29] [PASSED] check_all
[14:38:29] ===================== [PASSED] guc_idm =====================
[14:38:29] =============== guc_klv_helpers (9 subtests) ===============
[14:38:29] [PASSED] test_count
[14:38:29] [PASSED] test_encode_u32
[14:38:29] [PASSED] test_encode_u64
[14:38:29] [PASSED] test_encode_string
[14:38:29] [PASSED] test_encode_object_raw
[14:38:29] [PASSED] test_encode_object_klv
[14:38:29] [PASSED] test_encode_object_nested
[14:38:29] [PASSED] test_encode_object_basic
[14:38:29] [PASSED] test_print
[14:38:29] ================= [PASSED] guc_klv_helpers =================
[14:38:29] =================== xe_log (4 subtests) ====================
[14:38:29] [PASSED] demo_cper
[14:38:29] [PASSED] demo_dmesg
[14:38:29] ======================= test_dmesg  ========================
[14:38:29] [PASSED] test_fatal
[14:38:29] [PASSED] test_fatal_tile
[14:38:29] [PASSED] test_fatal_gt
[14:38:29] [PASSED] test_fatal_comp
[14:38:29] [PASSED] test_fatal_comp_tile
[14:38:29] [PASSED] test_fatal_comp_gt
[14:38:29] [PASSED] test_fatal_all
[14:38:29] [PASSED] test_recoverable
[14:38:29] [PASSED] test_recoverable_tile
[14:38:29] [PASSED] test_recoverable_gt
[14:38:29] [PASSED] test_recoverable_comp
[14:38:29] [PASSED] test_recoverable_comp_tile
[14:38:29] [PASSED] test_recoverable_comp_gt
[14:38:29] [PASSED] test_recoverable_all
[14:38:29] [PASSED] test_info
[14:38:29] [PASSED] test_info_tile
[14:38:29] [PASSED] test_info_gt
[14:38:29] [PASSED] test_info_err
[14:38:29] [PASSED] test_info_comp
[14:38:29] [PASSED] test_info_comp_tile
[14:38:29] [PASSED] test_info_comp_gt
[14:38:29] [PASSED] test_info_all
[14:38:29] [PASSED] test_hw_fatal
[14:38:29] [PASSED] test_hw_recoverable
[14:38:29] [PASSED] test_hw_corrected
[14:38:29] [PASSED] test_hw_informational
[14:38:29] =================== [PASSED] test_dmesg ====================
[14:38:29] ====================== test_invalid  =======================
[14:38:29] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[14:38:29] ================== [SKIPPED] test_invalid ==================
[14:38:29] ===================== [PASSED] xe_log ======================
[14:38:29] ================== no_relay (3 subtests) ===================
[14:38:29] [PASSED] xe_drops_guc2pf_if_not_ready
[14:38:29] [PASSED] xe_drops_guc2vf_if_not_ready
[14:38:29] [PASSED] xe_rejects_send_if_not_ready
[14:38:29] ==================== [PASSED] no_relay =====================
[14:38:29] ================== pf_relay (14 subtests) ==================
[14:38:29] [PASSED] pf_rejects_guc2pf_too_short
[14:38:29] [PASSED] pf_rejects_guc2pf_too_long
[14:38:29] [PASSED] pf_rejects_guc2pf_no_payload
[14:38:29] [PASSED] pf_fails_no_payload
[14:38:29] [PASSED] pf_fails_bad_origin
[14:38:29] [PASSED] pf_fails_bad_type
[14:38:29] [PASSED] pf_txn_reports_error
[14:38:29] [PASSED] pf_txn_sends_pf2guc
[14:38:29] [PASSED] pf_sends_pf2guc
[14:38:29] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[14:38:29] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[14:38:29] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[14:38:29] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[14:38:29] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[14:38:29] ==================== [PASSED] pf_relay =====================
[14:38:29] ================== vf_relay (3 subtests) ===================
[14:38:29] [PASSED] vf_rejects_guc2vf_too_short
[14:38:29] [PASSED] vf_rejects_guc2vf_too_long
[14:38:29] [PASSED] vf_rejects_guc2vf_no_payload
[14:38:29] ==================== [PASSED] vf_relay =====================
[14:38:29] ================ pf_gt_config (9 subtests) =================
[14:38:29] [PASSED] fair_contexts_1vf
[14:38:29] [PASSED] fair_doorbells_1vf
[14:38:29] [PASSED] fair_ggtt_1vf
[14:38:29] ====================== fair_vram_1vf  ======================
[14:38:29] [PASSED] 3.50 GiB
[14:38:29] [PASSED] 11.5 GiB
[14:38:29] [PASSED] 15.5 GiB
[14:38:29] [PASSED] 31.5 GiB
[14:38:29] [PASSED] 63.5 GiB
[14:38:29] [PASSED] 1.91 GiB
[14:38:29] ================== [PASSED] fair_vram_1vf ==================
[14:38:29] ================ fair_vram_1vf_admin_only  =================
[14:38:29] [PASSED] 3.50 GiB
[14:38:29] [PASSED] 11.5 GiB
[14:38:29] [PASSED] 15.5 GiB
[14:38:29] [PASSED] 31.5 GiB
[14:38:29] [PASSED] 63.5 GiB
[14:38:29] [PASSED] 1.91 GiB
[14:38:29] ============ [PASSED] fair_vram_1vf_admin_only =============
[14:38:29] ====================== fair_contexts  ======================
[14:38:29] [PASSED] 1 VF
[14:38:29] [PASSED] 2 VFs
[14:38:29] [PASSED] 3 VFs
[14:38:29] [PASSED] 4 VFs
[14:38:29] [PASSED] 5 VFs
[14:38:29] [PASSED] 6 VFs
[14:38:29] [PASSED] 7 VFs
[14:38:29] [PASSED] 8 VFs
[14:38:29] [PASSED] 9 VFs
[14:38:29] [PASSED] 10 VFs
[14:38:29] [PASSED] 11 VFs
[14:38:29] [PASSED] 12 VFs
[14:38:29] [PASSED] 13 VFs
[14:38:29] [PASSED] 14 VFs
[14:38:29] [PASSED] 15 VFs
[14:38:29] [PASSED] 16 VFs
[14:38:29] [PASSED] 17 VFs
[14:38:29] [PASSED] 18 VFs
[14:38:29] [PASSED] 19 VFs
[14:38:29] [PASSED] 20 VFs
[14:38:29] [PASSED] 21 VFs
[14:38:29] [PASSED] 22 VFs
[14:38:29] [PASSED] 23 VFs
[14:38:29] [PASSED] 24 VFs
[14:38:29] [PASSED] 25 VFs
[14:38:29] [PASSED] 26 VFs
[14:38:29] [PASSED] 27 VFs
[14:38:29] [PASSED] 28 VFs
[14:38:29] [PASSED] 29 VFs
[14:38:29] [PASSED] 30 VFs
[14:38:29] [PASSED] 31 VFs
[14:38:29] [PASSED] 32 VFs
[14:38:29] [PASSED] 33 VFs
[14:38:29] [PASSED] 34 VFs
[14:38:29] [PASSED] 35 VFs
[14:38:29] [PASSED] 36 VFs
[14:38:29] [PASSED] 37 VFs
[14:38:29] [PASSED] 38 VFs
[14:38:29] [PASSED] 39 VFs
[14:38:29] [PASSED] 40 VFs
[14:38:29] [PASSED] 41 VFs
[14:38:29] [PASSED] 42 VFs
[14:38:29] [PASSED] 43 VFs
[14:38:29] [PASSED] 44 VFs
[14:38:29] [PASSED] 45 VFs
[14:38:29] [PASSED] 46 VFs
[14:38:29] [PASSED] 47 VFs
[14:38:29] [PASSED] 48 VFs
[14:38:29] [PASSED] 49 VFs
[14:38:29] [PASSED] 50 VFs
[14:38:29] [PASSED] 51 VFs
[14:38:29] [PASSED] 52 VFs
[14:38:29] [PASSED] 53 VFs
[14:38:29] [PASSED] 54 VFs
[14:38:29] [PASSED] 55 VFs
[14:38:29] [PASSED] 56 VFs
[14:38:29] [PASSED] 57 VFs
[14:38:29] [PASSED] 58 VFs
[14:38:29] [PASSED] 59 VFs
[14:38:29] [PASSED] 60 VFs
[14:38:29] [PASSED] 61 VFs
[14:38:29] [PASSED] 62 VFs
[14:38:29] [PASSED] 63 VFs
[14:38:29] ================== [PASSED] fair_contexts ==================
[14:38:29] ===================== fair_doorbells  ======================
[14:38:29] [PASSED] 1 VF
[14:38:29] [PASSED] 2 VFs
[14:38:29] [PASSED] 3 VFs
[14:38:29] [PASSED] 4 VFs
[14:38:29] [PASSED] 5 VFs
[14:38:29] [PASSED] 6 VFs
[14:38:29] [PASSED] 7 VFs
[14:38:29] [PASSED] 8 VFs
[14:38:29] [PASSED] 9 VFs
[14:38:29] [PASSED] 10 VFs
[14:38:29] [PASSED] 11 VFs
[14:38:29] [PASSED] 12 VFs
[14:38:29] [PASSED] 13 VFs
[14:38:29] [PASSED] 14 VFs
[14:38:29] [PASSED] 15 VFs
[14:38:29] [PASSED] 16 VFs
[14:38:29] [PASSED] 17 VFs
[14:38:29] [PASSED] 18 VFs
[14:38:29] [PASSED] 19 VFs
[14:38:29] [PASSED] 20 VFs
[14:38:29] [PASSED] 21 VFs
[14:38:29] [PASSED] 22 VFs
[14:38:29] [PASSED] 23 VFs
[14:38:29] [PASSED] 24 VFs
[14:38:29] [PASSED] 25 VFs
[14:38:29] [PASSED] 26 VFs
[14:38:29] [PASSED] 27 VFs
[14:38:29] [PASSED] 28 VFs
[14:38:29] [PASSED] 29 VFs
[14:38:29] [PASSED] 30 VFs
[14:38:29] [PASSED] 31 VFs
[14:38:29] [PASSED] 32 VFs
[14:38:29] [PASSED] 33 VFs
[14:38:29] [PASSED] 34 VFs
[14:38:29] [PASSED] 35 VFs
[14:38:29] [PASSED] 36 VFs
[14:38:29] [PASSED] 37 VFs
[14:38:29] [PASSED] 38 VFs
[14:38:29] [PASSED] 39 VFs
[14:38:29] [PASSED] 40 VFs
[14:38:29] [PASSED] 41 VFs
[14:38:29] [PASSED] 42 VFs
[14:38:29] [PASSED] 43 VFs
[14:38:29] [PASSED] 44 VFs
[14:38:29] [PASSED] 45 VFs
[14:38:29] [PASSED] 46 VFs
[14:38:29] [PASSED] 47 VFs
[14:38:29] [PASSED] 48 VFs
[14:38:29] [PASSED] 49 VFs
[14:38:29] [PASSED] 50 VFs
[14:38:29] [PASSED] 51 VFs
[14:38:29] [PASSED] 52 VFs
[14:38:29] [PASSED] 53 VFs
[14:38:29] [PASSED] 54 VFs
[14:38:29] [PASSED] 55 VFs
[14:38:29] [PASSED] 56 VFs
[14:38:29] [PASSED] 57 VFs
[14:38:29] [PASSED] 58 VFs
[14:38:29] [PASSED] 59 VFs
[14:38:29] [PASSED] 60 VFs
[14:38:29] [PASSED] 61 VFs
[14:38:29] [PASSED] 62 VFs
[14:38:29] [PASSED] 63 VFs
[14:38:29] ================= [PASSED] fair_doorbells ==================
[14:38:29] ======================== fair_ggtt  ========================
[14:38:29] [PASSED] 1 VF
[14:38:29] [PASSED] 2 VFs
[14:38:29] [PASSED] 3 VFs
[14:38:29] [PASSED] 4 VFs
[14:38:29] [PASSED] 5 VFs
[14:38:29] [PASSED] 6 VFs
[14:38:29] [PASSED] 7 VFs
[14:38:29] [PASSED] 8 VFs
[14:38:29] [PASSED] 9 VFs
[14:38:29] [PASSED] 10 VFs
[14:38:29] [PASSED] 11 VFs
[14:38:29] [PASSED] 12 VFs
[14:38:29] [PASSED] 13 VFs
[14:38:29] [PASSED] 14 VFs
[14:38:29] [PASSED] 15 VFs
[14:38:29] [PASSED] 16 VFs
[14:38:29] [PASSED] 17 VFs
[14:38:29] [PASSED] 18 VFs
[14:38:29] [PASSED] 19 VFs
[14:38:29] [PASSED] 20 VFs
[14:38:29] [PASSED] 21 VFs
[14:38:29] [PASSED] 22 VFs
[14:38:29] [PASSED] 23 VFs
[14:38:29] [PASSED] 24 VFs
[14:38:29] [PASSED] 25 VFs
[14:38:29] [PASSED] 26 VFs
[14:38:29] [PASSED] 27 VFs
[14:38:29] [PASSED] 28 VFs
[14:38:29] [PASSED] 29 VFs
[14:38:29] [PASSED] 30 VFs
[14:38:29] [PASSED] 31 VFs
[14:38:29] [PASSED] 32 VFs
[14:38:29] [PASSED] 33 VFs
[14:38:29] [PASSED] 34 VFs
[14:38:29] [PASSED] 35 VFs
[14:38:29] [PASSED] 36 VFs
[14:38:29] [PASSED] 37 VFs
[14:38:29] [PASSED] 38 VFs
[14:38:29] [PASSED] 39 VFs
[14:38:29] [PASSED] 40 VFs
[14:38:29] [PASSED] 41 VFs
[14:38:29] [PASSED] 42 VFs
[14:38:29] [PASSED] 43 VFs
[14:38:29] [PASSED] 44 VFs
[14:38:29] [PASSED] 45 VFs
[14:38:29] [PASSED] 46 VFs
[14:38:29] [PASSED] 47 VFs
[14:38:29] [PASSED] 48 VFs
[14:38:29] [PASSED] 49 VFs
[14:38:29] [PASSED] 50 VFs
[14:38:29] [PASSED] 51 VFs
[14:38:29] [PASSED] 52 VFs
[14:38:29] [PASSED] 53 VFs
[14:38:29] [PASSED] 54 VFs
[14:38:29] [PASSED] 55 VFs
[14:38:29] [PASSED] 56 VFs
[14:38:29] [PASSED] 57 VFs
[14:38:29] [PASSED] 58 VFs
[14:38:29] [PASSED] 59 VFs
[14:38:29] [PASSED] 60 VFs
[14:38:29] [PASSED] 61 VFs
[14:38:29] [PASSED] 62 VFs
[14:38:29] [PASSED] 63 VFs
[14:38:29] ==================== [PASSED] fair_ggtt ====================
[14:38:29] ======================== fair_vram  ========================
[14:38:29] [PASSED] 1 VF
[14:38:29] [PASSED] 2 VFs
[14:38:29] [PASSED] 3 VFs
[14:38:29] [PASSED] 4 VFs
[14:38:29] [PASSED] 5 VFs
[14:38:29] [PASSED] 6 VFs
[14:38:29] [PASSED] 7 VFs
[14:38:29] [PASSED] 8 VFs
[14:38:29] [PASSED] 9 VFs
[14:38:29] [PASSED] 10 VFs
[14:38:29] [PASSED] 11 VFs
[14:38:29] [PASSED] 12 VFs
[14:38:29] [PASSED] 13 VFs
[14:38:29] [PASSED] 14 VFs
[14:38:29] [PASSED] 15 VFs
[14:38:29] [PASSED] 16 VFs
[14:38:29] [PASSED] 17 VFs
[14:38:29] [PASSED] 18 VFs
[14:38:29] [PASSED] 19 VFs
[14:38:29] [PASSED] 20 VFs
[14:38:29] [PASSED] 21 VFs
[14:38:29] [PASSED] 22 VFs
[14:38:29] [PASSED] 23 VFs
[14:38:29] [PASSED] 24 VFs
[14:38:29] [PASSED] 25 VFs
[14:38:29] [PASSED] 26 VFs
[14:38:29] [PASSED] 27 VFs
[14:38:29] [PASSED] 28 VFs
[14:38:29] [PASSED] 29 VFs
[14:38:29] [PASSED] 30 VFs
[14:38:29] [PASSED] 31 VFs
[14:38:29] [PASSED] 32 VFs
[14:38:29] [PASSED] 33 VFs
[14:38:29] [PASSED] 34 VFs
[14:38:29] [PASSED] 35 VFs
[14:38:29] [PASSED] 36 VFs
[14:38:29] [PASSED] 37 VFs
[14:38:29] [PASSED] 38 VFs
[14:38:29] [PASSED] 39 VFs
[14:38:29] [PASSED] 40 VFs
[14:38:29] [PASSED] 41 VFs
[14:38:29] [PASSED] 42 VFs
[14:38:29] [PASSED] 43 VFs
[14:38:29] [PASSED] 44 VFs
[14:38:29] [PASSED] 45 VFs
[14:38:29] [PASSED] 46 VFs
[14:38:29] [PASSED] 47 VFs
[14:38:29] [PASSED] 48 VFs
[14:38:29] [PASSED] 49 VFs
[14:38:29] [PASSED] 50 VFs
[14:38:29] [PASSED] 51 VFs
[14:38:29] [PASSED] 52 VFs
[14:38:29] [PASSED] 53 VFs
[14:38:29] [PASSED] 54 VFs
[14:38:29] [PASSED] 55 VFs
[14:38:29] [PASSED] 56 VFs
[14:38:29] [PASSED] 57 VFs
[14:38:29] [PASSED] 58 VFs
[14:38:29] [PASSED] 59 VFs
[14:38:29] [PASSED] 60 VFs
[14:38:29] [PASSED] 61 VFs
[14:38:29] [PASSED] 62 VFs
[14:38:29] [PASSED] 63 VFs
[14:38:29] ==================== [PASSED] fair_vram ====================
[14:38:29] ================== [PASSED] pf_gt_config ===================
[14:38:29] ===================== lmtt (1 subtest) =====================
[14:38:29] ======================== test_ops  =========================
[14:38:29] [PASSED] 2-level
[14:38:29] [PASSED] multi-level
[14:38:29] ==================== [PASSED] test_ops =====================
[14:38:29] ====================== [PASSED] lmtt =======================
[14:38:29] ================= sriov_packet (1 subtest) =================
[14:38:29] [PASSED] test_descriptor_init
[14:38:29] ================== [PASSED] sriov_packet ===================
[14:38:29] ================= pf_service (11 subtests) =================
[14:38:29] [PASSED] pf_negotiate_any
[14:38:29] [PASSED] pf_negotiate_base_match
[14:38:29] [PASSED] pf_negotiate_base_newer
[14:38:29] [PASSED] pf_negotiate_base_next
[14:38:29] [SKIPPED] pf_negotiate_base_older (no older minor)
[14:38:29] [PASSED] pf_negotiate_base_prev
[14:38:29] [PASSED] pf_negotiate_latest_match
[14:38:29] [PASSED] pf_negotiate_latest_newer
[14:38:29] [PASSED] pf_negotiate_latest_next
[14:38:29] [SKIPPED] pf_negotiate_latest_older (no older minor)
[14:38:29] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[14:38:29] =================== [PASSED] pf_service ====================
[14:38:29] ================= xe_guc_g2g (2 subtests) ==================
[14:38:29] ============== xe_live_guc_g2g_kunit_default  ==============
[14:38:29] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[14:38:29] ============== xe_live_guc_g2g_kunit_allmem  ===============
[14:38:29] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[14:38:29] =================== [SKIPPED] xe_guc_g2g ===================
[14:38:29] =================== xe_mocs (2 subtests) ===================
[14:38:29] ================ xe_live_mocs_kernel_kunit  ================
[14:38:29] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[14:38:29] ================ xe_live_mocs_reset_kunit  =================
[14:38:29] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[14:38:29] ==================== [SKIPPED] xe_mocs =====================
[14:38:29] ================= xe_migrate (2 subtests) ==================
[14:38:29] ================= xe_migrate_sanity_kunit  =================
[14:38:29] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[14:38:29] ================== xe_validate_ccs_kunit  ==================
[14:38:29] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[14:38:29] =================== [SKIPPED] xe_migrate ===================
[14:38:29] ================== xe_dma_buf (1 subtest) ==================
[14:38:29] ==================== xe_dma_buf_kunit  =====================
[14:38:29] ================ [SKIPPED] xe_dma_buf_kunit ================
[14:38:29] =================== [SKIPPED] xe_dma_buf ===================
[14:38:29] ================= xe_bo_shrink (1 subtest) =================
[14:38:29] =================== xe_bo_shrink_kunit  ====================
[14:38:29] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[14:38:29] ================== [SKIPPED] xe_bo_shrink ==================
[14:38:29] ==================== xe_bo (2 subtests) ====================
[14:38:29] ================== xe_ccs_migrate_kunit  ===================
[14:38:29] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[14:38:29] ==================== xe_bo_evict_kunit  ====================
[14:38:29] =============== [SKIPPED] xe_bo_evict_kunit ================
[14:38:29] ===================== [SKIPPED] xe_bo ======================
[14:38:29] =================== xe_any (9 subtests) ====================
[14:38:29] [PASSED] test_to_xe
[14:38:29] [PASSED] test_to_dev
[14:38:29] [PASSED] test_to_pdev
[14:38:29] [PASSED] test_to_drm
[14:38:29] [PASSED] test_if_pdev
[14:38:29] [PASSED] test_if_xe
[14:38:29] [PASSED] test_if_tile
[14:38:29] [PASSED] test_if_gt
[14:38:29] [PASSED] test_to_id
[14:38:29] ===================== [PASSED] xe_any ======================
[14:38:29] ==================== args (13 subtests) ====================
[14:38:29] [PASSED] count_args_test
[14:38:29] [PASSED] call_args_example
[14:38:29] [PASSED] call_args_test
[14:38:29] [PASSED] drop_first_arg_example
[14:38:29] [PASSED] drop_first_arg_test
[14:38:29] [PASSED] first_arg_example
[14:38:29] [PASSED] first_arg_test
[14:38:29] [PASSED] last_arg_example
[14:38:29] [PASSED] last_arg_test
[14:38:29] [PASSED] pick_arg_example
[14:38:29] [PASSED] if_args_example
[14:38:29] [PASSED] if_args_test
[14:38:29] [PASSED] sep_comma_example
[14:38:29] ====================== [PASSED] args =======================
[14:38:29] =================== xe_pci (3 subtests) ====================
[14:38:29] ==================== check_graphics_ip  ====================
[14:38:29] [PASSED] 12.00 Xe_LP
[14:38:29] [PASSED] 12.10 Xe_LP+
[14:38:29] [PASSED] 12.55 Xe_HPG
[14:38:29] [PASSED] 12.60 Xe_HPC
[14:38:29] [PASSED] 12.70 Xe_LPG
[14:38:29] [PASSED] 12.71 Xe_LPG
[14:38:29] [PASSED] 12.74 Xe_LPG+
[14:38:29] [PASSED] 20.01 Xe2_HPG
[14:38:29] [PASSED] 20.02 Xe2_HPG
[14:38:29] [PASSED] 20.04 Xe2_LPG
[14:38:29] [PASSED] 30.00 Xe3_LPG
[14:38:29] [PASSED] 30.01 Xe3_LPG
[14:38:29] [PASSED] 30.03 Xe3_LPG
[14:38:29] [PASSED] 30.04 Xe3_LPG
[14:38:29] [PASSED] 30.05 Xe3_LPG
[14:38:29] [PASSED] 35.10 Xe3p_LPG
[14:38:29] [PASSED] 35.11 Xe3p_XPC
[14:38:29] ================ [PASSED] check_graphics_ip ================
[14:38:29] ===================== check_media_ip  ======================
[14:38:29] [PASSED] 12.00 Xe_M
[14:38:29] [PASSED] 12.55 Xe_HPM
[14:38:29] [PASSED] 13.00 Xe_LPM+
[14:38:29] [PASSED] 13.01 Xe2_HPM
[14:38:29] [PASSED] 20.00 Xe2_LPM
[14:38:29] [PASSED] 30.00 Xe3_LPM
[14:38:29] [PASSED] 30.02 Xe3_LPM
[14:38:29] [PASSED] 35.00 Xe3p_LPM
[14:38:29] [PASSED] 35.03 Xe3p_HPM
[14:38:29] ================= [PASSED] check_media_ip ==================
[14:38:29] =================== check_platform_desc  ===================
[14:38:29] [PASSED] 0x9A60 (TIGERLAKE)
[14:38:29] [PASSED] 0x9A68 (TIGERLAKE)
[14:38:29] [PASSED] 0x9A70 (TIGERLAKE)
[14:38:29] [PASSED] 0x9A40 (TIGERLAKE)
[14:38:29] [PASSED] 0x9A49 (TIGERLAKE)
[14:38:29] [PASSED] 0x9A59 (TIGERLAKE)
[14:38:29] [PASSED] 0x9A78 (TIGERLAKE)
[14:38:29] [PASSED] 0x9AC0 (TIGERLAKE)
[14:38:29] [PASSED] 0x9AC9 (TIGERLAKE)
[14:38:29] [PASSED] 0x9AD9 (TIGERLAKE)
[14:38:29] [PASSED] 0x9AF8 (TIGERLAKE)
[14:38:29] [PASSED] 0x4C80 (ROCKETLAKE)
[14:38:29] [PASSED] 0x4C8A (ROCKETLAKE)
[14:38:29] [PASSED] 0x4C8B (ROCKETLAKE)
[14:38:29] [PASSED] 0x4C8C (ROCKETLAKE)
[14:38:29] [PASSED] 0x4C90 (ROCKETLAKE)
[14:38:29] [PASSED] 0x4C9A (ROCKETLAKE)
[14:38:29] [PASSED] 0x4680 (ALDERLAKE_S)
[14:38:29] [PASSED] 0x4682 (ALDERLAKE_S)
[14:38:29] [PASSED] 0x4688 (ALDERLAKE_S)
[14:38:29] [PASSED] 0x468A (ALDERLAKE_S)
[14:38:29] [PASSED] 0x468B (ALDERLAKE_S)
[14:38:29] [PASSED] 0x4690 (ALDERLAKE_S)
[14:38:29] [PASSED] 0x4692 (ALDERLAKE_S)
[14:38:29] [PASSED] 0x4693 (ALDERLAKE_S)
[14:38:29] [PASSED] 0x46A0 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46A1 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46A2 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46A3 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46A6 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46A8 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46AA (ALDERLAKE_P)
[14:38:29] [PASSED] 0x462A (ALDERLAKE_P)
[14:38:29] [PASSED] 0x4626 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x4628 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46B0 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46B1 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46B2 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46B3 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46C0 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46C1 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46C2 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46C3 (ALDERLAKE_P)
[14:38:29] [PASSED] 0x46D0 (ALDERLAKE_N)
[14:38:29] [PASSED] 0x46D1 (ALDERLAKE_N)
[14:38:29] [PASSED] 0x46D2 (ALDERLAKE_N)
[14:38:29] [PASSED] 0x46D3 (ALDERLAKE_N)
[14:38:29] [PASSED] 0x46D4 (ALDERLAKE_N)
[14:38:29] [PASSED] 0xA721 (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA7A1 (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA7A9 (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA7AC (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA7AD (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA720 (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA7A0 (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA7A8 (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA7AA (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA7AB (ALDERLAKE_P)
[14:38:29] [PASSED] 0xA780 (ALDERLAKE_S)
[14:38:29] [PASSED] 0xA781 (ALDERLAKE_S)
[14:38:29] [PASSED] 0xA782 (ALDERLAKE_S)
[14:38:29] [PASSED] 0xA783 (ALDERLAKE_S)
[14:38:29] [PASSED] 0xA788 (ALDERLAKE_S)
[14:38:29] [PASSED] 0xA789 (ALDERLAKE_S)
[14:38:29] [PASSED] 0xA78A (ALDERLAKE_S)
[14:38:29] [PASSED] 0xA78B (ALDERLAKE_S)
[14:38:29] [PASSED] 0x4905 (DG1)
[14:38:29] [PASSED] 0x4906 (DG1)
[14:38:29] [PASSED] 0x4907 (DG1)
[14:38:29] [PASSED] 0x4908 (DG1)
[14:38:29] [PASSED] 0x4909 (DG1)
[14:38:29] [PASSED] 0x56C0 (DG2)
[14:38:29] [PASSED] 0x56C2 (DG2)
[14:38:29] [PASSED] 0x56C1 (DG2)
[14:38:29] [PASSED] 0x7D51 (METEORLAKE)
[14:38:29] [PASSED] 0x7DD1 (METEORLAKE)
[14:38:29] [PASSED] 0x7D41 (METEORLAKE)
[14:38:29] [PASSED] 0x7D67 (METEORLAKE)
[14:38:29] [PASSED] 0xB640 (METEORLAKE)
[14:38:29] [PASSED] 0x56A0 (DG2)
[14:38:29] [PASSED] 0x56A1 (DG2)
[14:38:29] [PASSED] 0x56A2 (DG2)
[14:38:29] [PASSED] 0x56BE (DG2)
[14:38:29] [PASSED] 0x56BF (DG2)
[14:38:29] [PASSED] 0x5690 (DG2)
[14:38:29] [PASSED] 0x5691 (DG2)
[14:38:29] [PASSED] 0x5692 (DG2)
[14:38:29] [PASSED] 0x56A5 (DG2)
[14:38:29] [PASSED] 0x56A6 (DG2)
[14:38:29] [PASSED] 0x56B0 (DG2)
[14:38:29] [PASSED] 0x56B1 (DG2)
[14:38:29] [PASSED] 0x56BA (DG2)
[14:38:29] [PASSED] 0x56BB (DG2)
[14:38:29] [PASSED] 0x56BC (DG2)
[14:38:29] [PASSED] 0x56BD (DG2)
[14:38:29] [PASSED] 0x5693 (DG2)
[14:38:29] [PASSED] 0x5694 (DG2)
[14:38:29] [PASSED] 0x5695 (DG2)
[14:38:29] [PASSED] 0x56A3 (DG2)
[14:38:29] [PASSED] 0x56A4 (DG2)
[14:38:29] [PASSED] 0x56B2 (DG2)
[14:38:29] [PASSED] 0x56B3 (DG2)
[14:38:29] [PASSED] 0x5696 (DG2)
[14:38:29] [PASSED] 0x5697 (DG2)
[14:38:29] [PASSED] 0xB69 (PVC)
[14:38:29] [PASSED] 0xB6E (PVC)
[14:38:29] [PASSED] 0xBD4 (PVC)
[14:38:29] [PASSED] 0xBD5 (PVC)
[14:38:29] [PASSED] 0xBD6 (PVC)
[14:38:29] [PASSED] 0xBD7 (PVC)
[14:38:29] [PASSED] 0xBD8 (PVC)
[14:38:29] [PASSED] 0xBD9 (PVC)
[14:38:29] [PASSED] 0xBDA (PVC)
[14:38:29] [PASSED] 0xBDB (PVC)
[14:38:29] [PASSED] 0xBE0 (PVC)
[14:38:29] [PASSED] 0xBE1 (PVC)
[14:38:29] [PASSED] 0xBE5 (PVC)
[14:38:29] [PASSED] 0x7D40 (METEORLAKE)
[14:38:29] [PASSED] 0x7D45 (METEORLAKE)
[14:38:29] [PASSED] 0x7D55 (METEORLAKE)
[14:38:29] [PASSED] 0x7D60 (METEORLAKE)
[14:38:29] [PASSED] 0x7DD5 (METEORLAKE)
[14:38:29] [PASSED] 0x6420 (LUNARLAKE)
[14:38:29] [PASSED] 0x64A0 (LUNARLAKE)
[14:38:29] [PASSED] 0x64B0 (LUNARLAKE)
[14:38:29] [PASSED] 0xE202 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE209 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE20B (BATTLEMAGE)
[14:38:29] [PASSED] 0xE20C (BATTLEMAGE)
[14:38:29] [PASSED] 0xE20D (BATTLEMAGE)
[14:38:29] [PASSED] 0xE210 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE211 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE212 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE216 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE220 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE221 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE222 (BATTLEMAGE)
[14:38:29] [PASSED] 0xE223 (BATTLEMAGE)
[14:38:29] [PASSED] 0xB080 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB081 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB082 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB083 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB084 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB085 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB086 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB087 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB08F (PANTHERLAKE)
[14:38:29] [PASSED] 0xB090 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB0A0 (PANTHERLAKE)
[14:38:29] [PASSED] 0xB0B0 (PANTHERLAKE)
[14:38:29] [PASSED] 0xFD80 (PANTHERLAKE)
[14:38:29] [PASSED] 0xFD81 (PANTHERLAKE)
[14:38:29] [PASSED] 0xD740 (NOVALAKE_S)
[14:38:29] [PASSED] 0xD741 (NOVALAKE_S)
[14:38:29] [PASSED] 0xD742 (NOVALAKE_S)
[14:38:29] [PASSED] 0xD743 (NOVALAKE_S)
[14:38:29] [PASSED] 0xD745 (NOVALAKE_S)
[14:38:29] [PASSED] 0xD74A (NOVALAKE_S)
[14:38:29] [PASSED] 0xD74B (NOVALAKE_S)
[14:38:29] [PASSED] 0x674C (CRESCENTISLAND)
[14:38:29] [PASSED] 0x674D (CRESCENTISLAND)
[14:38:29] [PASSED] 0x674E (CRESCENTISLAND)
[14:38:29] [PASSED] 0x674F (CRESCENTISLAND)
[14:38:29] [PASSED] 0x6750 (CRESCENTISLAND)
[14:38:29] [PASSED] 0xD750 (NOVALAKE_P)
[14:38:29] [PASSED] 0xD751 (NOVALAKE_P)
[14:38:29] [PASSED] 0xD752 (NOVALAKE_P)
[14:38:29] [PASSED] 0xD753 (NOVALAKE_P)
[14:38:29] [PASSED] 0xD754 (NOVALAKE_P)
[14:38:29] [PASSED] 0xD755 (NOVALAKE_P)
[14:38:29] [PASSED] 0xD756 (NOVALAKE_P)
[14:38:29] [PASSED] 0xD757 (NOVALAKE_P)
[14:38:29] [PASSED] 0xD75F (NOVALAKE_P)
[14:38:29] =============== [PASSED] check_platform_desc ===============
[14:38:29] ===================== [PASSED] xe_pci ======================
[14:38:29] ============= xe_rtp_tables_test (5 subtests) ==============
[14:38:29] ================== xe_rtp_table_gt_test  ===================
[14:38:29] [PASSED] gt_was/14011060649
[14:38:29] [PASSED] gt_was/14011059788
[14:38:29] [PASSED] gt_was/14015795083
[14:38:29] [PASSED] gt_was/16021867713
[14:38:29] [PASSED] gt_was/14019449301
[14:38:29] [PASSED] gt_was/16028005424
[14:38:29] [PASSED] gt_was/14026578760
[14:38:29] [PASSED] gt_was/1409420604
[14:38:29] [PASSED] gt_was/1408615072
[14:38:29] [PASSED] gt_was/22010523718
[14:38:29] [PASSED] gt_was/14011006942
[14:38:29] [PASSED] gt_was/14014830051
[14:38:29] [PASSED] gt_was/18018781329
[14:38:29] [PASSED] gt_was/1509235366
[14:38:29] [PASSED] gt_was/18018781329
[14:38:29] [PASSED] gt_was/16016694945
[14:38:29] [PASSED] gt_was/14018575942
[14:38:29] [PASSED] gt_was/22016670082
[14:38:29] [PASSED] gt_was/22016670082
[14:38:29] [PASSED] gt_was/14017421178
[14:38:29] [PASSED] gt_was/16025250150
[14:38:29] [PASSED] gt_was/14021871409
[14:38:29] [PASSED] gt_was/16021865536
[14:38:29] [PASSED] gt_was/14021486841
[14:38:29] [PASSED] gt_was/14025160223
[14:38:29] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[14:38:29] [PASSED] gt_was/14025635424
[14:38:29] [PASSED] gt_was/16028005424
[14:38:29] ============== [PASSED] xe_rtp_table_gt_test ===============
[14:38:29] ================== xe_rtp_table_gt_test  ===================
[14:38:29] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[14:38:29] [PASSED] gt_tunings/Tuning: 32B Access Enable
[14:38:29] [PASSED] gt_tunings/Tuning: L3 cache
[14:38:29] [PASSED] gt_tunings/Tuning: L3 cache - media
[14:38:29] [PASSED] gt_tunings/Tuning: Compression Overfetch
[14:38:29] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[14:38:29] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[14:38:29] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[14:38:29] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[14:38:29] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[14:38:29] [PASSED] gt_tunings/Tuning: Stateless compression control
[14:38:29] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[14:38:29] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[14:38:29] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[14:38:29] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[14:38:29] ============== [PASSED] xe_rtp_table_gt_test ===============
[14:38:29] ================== xe_rtp_table_oob_test  ==================
[14:38:29] [PASSED] oob_was/1607983814
[14:38:29] [PASSED] oob_was/16010904313
[14:38:29] [PASSED] oob_was/18022495364
[14:38:29] [PASSED] oob_was/22012773006
[14:38:29] [PASSED] oob_was/14014475959
[14:38:29] [PASSED] oob_was/22011391025
[14:38:29] [PASSED] oob_was/22012727170
[14:38:29] [PASSED] oob_was/22012727685
[14:38:29] [PASSED] oob_was/22016596838
[14:38:29] [PASSED] oob_was/18020744125
[14:38:29] [PASSED] oob_was/1409600907
[14:38:29] [PASSED] oob_was/22014953428
[14:38:29] [PASSED] oob_was/16017236439
[14:38:29] [PASSED] oob_was/14019821291
[14:38:29] [PASSED] oob_was/14015076503
[14:38:29] [PASSED] oob_was/14018913170
[14:38:29] [PASSED] oob_was/14018094691
[14:38:29] [PASSED] oob_was/18024947630
[14:38:29] [PASSED] oob_was/16022287689
[14:38:29] [PASSED] oob_was/13011645652
[14:38:29] [PASSED] oob_was/14022293748
[14:38:29] [PASSED] oob_was/22019794406
[14:38:29] [PASSED] oob_was/22019338487
[14:38:29] [PASSED] oob_was/16023588340
[14:38:29] [PASSED] oob_was/14019789679
[14:38:29] [PASSED] oob_was/14022866841
[14:38:29] [PASSED] oob_was/16021333562
[14:38:29] [PASSED] oob_was/14016712196
[14:38:29] [PASSED] oob_was/14015568240
[14:38:29] [PASSED] oob_was/18013179988
[14:38:29] [PASSED] oob_was/1508761755
[14:38:29] [PASSED] oob_was/16023105232
[14:38:29] [PASSED] oob_was/16026508708
[14:38:29] [PASSED] oob_was/14020001231
[14:38:29] [PASSED] oob_was/16023683509
[14:38:29] [PASSED] oob_was/14025515070
[14:38:29] [PASSED] oob_was/15015404425_disable
[14:38:29] [PASSED] oob_was/16026007364
[14:38:29] [PASSED] oob_was/14020316580
[14:38:29] [PASSED] oob_was/14025883347
[14:38:29] [PASSED] oob_was/16029380221
[14:38:29] [PASSED] oob_was/22022079272
[14:38:29] [PASSED] oob_was/16029897822
[14:38:29] [PASSED] oob_was/14027054324
[14:38:29] ============== [PASSED] xe_rtp_table_oob_test ==============
[14:38:29] ================ xe_rtp_table_dev_oob_test  ================
[14:38:29] [PASSED] device_oob_was/22010954014
[14:38:29] [PASSED] device_oob_was/15015404425
[14:38:29] [PASSED] device_oob_was/22019338487_display
[14:38:29] [PASSED] device_oob_was/14022085890
[14:38:29] [PASSED] device_oob_was/14026539277
[14:38:29] [PASSED] device_oob_was/14026633728
[14:38:29] [PASSED] device_oob_was/14026746987
[14:38:29] [PASSED] device_oob_was/14026779378
[14:38:29] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[14:38:29] ========== xe_rtp_table_missing_upper_bound_test  ==========
[14:38:29] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[14:38:29] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[14:38:29] [PASSED] register_whitelist/1806527549
[14:38:29] [PASSED] register_whitelist/allow_read_ctx_timestamp
[14:38:29] [PASSED] register_whitelist/allow_read_queue_timestamp
[14:38:29] [PASSED] register_whitelist/16014440446
[14:38:29] [PASSED] register_whitelist/16017236439
[14:38:29] [PASSED] register_whitelist/16020183090
[14:38:29] [PASSED] register_whitelist/14024997852
[14:38:29] [PASSED] register_whitelist/14024997852
[14:38:29] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[14:38:29] =============== [PASSED] xe_rtp_tables_test ================
[14:38:29] =================== xe_rtp (3 subtests) ====================
[14:38:29] =================== xe_rtp_rules_tests  ====================
[14:38:29] [PASSED] no
[14:38:29] [PASSED] yes
[14:38:29] [PASSED] no-and-no
[14:38:29] [PASSED] no-and-yes
[14:38:29] [PASSED] yes-and-no
[14:38:29] [PASSED] yes-and-yes
[14:38:29] [PASSED] no-or-no
[14:38:29] [PASSED] no-or-yes
[14:38:29] [PASSED] yes-or-no
[14:38:29] [PASSED] yes-or-yes
[14:38:29] [PASSED] no-yes-or-yes-no
[14:38:29] [PASSED] no-yes-or-yes-yes
[14:38:29] [PASSED] yes-yes-or-no-yes
[14:38:29] [PASSED] yes-yes-or-yes-yes
[14:38:29] [PASSED] no-no-or-yes-or-no
[14:38:29] [PASSED] or
[14:38:29] [PASSED] or-yes
[14:38:29] [PASSED] or-no
[14:38:29] [PASSED] yes-or
[14:38:29] [PASSED] no-or
[14:38:29] [PASSED] no-or-or-yes
[14:38:29] [PASSED] yes-or-or-no
[14:38:29] [PASSED] no-or-or-no
[14:38:29] [PASSED] missing-context-engine-class
[14:38:29] [PASSED] missing-context-engine-class-or-yes
[14:38:29] [PASSED] missing-context-engine-class-or-or-yes
[14:38:29] =============== [PASSED] xe_rtp_rules_tests ================
[14:38:29] =============== xe_rtp_process_to_sr_tests  ================
[14:38:29] [PASSED] coalesce-same-reg
[14:38:29] [PASSED] coalesce-same-reg-literal-and-func
[14:38:29] [PASSED] no-match-no-add
[14:38:29] [PASSED] two-regs-two-entries
[14:38:29] [PASSED] clr-one-set-other
[14:38:29] [PASSED] set-field
[14:38:29] [PASSED] conflict-duplicate
[14:38:29] [PASSED] conflict-not-disjoint
[14:38:29] [PASSED] conflict-not-disjoint-literal-and-func
[14:38:29] [PASSED] conflict-reg-type
[14:38:29] [PASSED] bad-mcr-reg-forced-to-regular
[14:38:29] [PASSED] bad-regular-reg-forced-to-mcr
[14:38:29] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[14:38:29] ================== xe_rtp_process_tests  ===================
[14:38:29] [PASSED] active1
[14:38:29] [PASSED] active2
[14:38:29] [PASSED] active-inactive
[14:38:29] [PASSED] inactive-active
[14:38:29] [PASSED] inactive-active-inactive
[14:38:29] [PASSED] inactive-inactive-inactive
[14:38:29] ============== [PASSED] xe_rtp_process_tests ===============
[14:38:29] ===================== [PASSED] xe_rtp ======================
[14:38:29] ==================== xe_wa (1 subtest) =====================
[14:38:29] ======================== xe_wa_gt  =========================
[14:38:29] [PASSED] TIGERLAKE B0
[14:38:29] [PASSED] DG1 A0
[14:38:29] [PASSED] DG1 B0
[14:38:29] [PASSED] ALDERLAKE_S A0
[14:38:29] [PASSED] ALDERLAKE_S B0
[14:38:29] [PASSED] ALDERLAKE_S C0
[14:38:29] [PASSED] ALDERLAKE_S D0
[14:38:29] [PASSED] ALDERLAKE_P A0
[14:38:29] [PASSED] ALDERLAKE_P B0
[14:38:29] [PASSED] ALDERLAKE_P C0
[14:38:29] [PASSED] ALDERLAKE_S RPLS D0
[14:38:29] [PASSED] ALDERLAKE_P RPLU E0
[14:38:29] [PASSED] DG2 G10 C0
[14:38:29] [PASSED] DG2 G11 B1
[14:38:29] [PASSED] DG2 G12 A1
[14:38:29] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[14:38:29] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[14:38:29] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[14:38:29] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[14:38:29] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[14:38:29] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[14:38:29] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[14:38:29] ==================== [PASSED] xe_wa_gt =====================
[14:38:29] ====================== [PASSED] xe_wa ======================
[14:38:29] ============================================================
[14:38:29] Testing complete. Ran 789 tests: passed: 761, skipped: 28
[14:38:29] Elapsed time: 37.102s total, 4.377s configuring, 32.009s building, 0.689s running

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

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

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[14:39:09] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[14:39:10] 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
[14:39:19] Starting KUnit Kernel (1/1)...
[14:39:19] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[14:39:19] =============== dma-buf-fence (12 subtests) ================
[14:39:19] [PASSED] test_sanitycheck
[14:39:19] [PASSED] test_signaling
[14:39:19] [PASSED] test_add_callback
[14:39:19] [PASSED] test_late_add_callback
[14:39:19] [PASSED] test_rm_callback
[14:39:19] [PASSED] test_late_rm_callback
[14:39:19] [PASSED] test_status
[14:39:19] [PASSED] test_error
[14:39:19] [PASSED] test_wait
[14:39:19] [PASSED] test_wait_timeout
[14:39:19] [PASSED] test_stub
[14:39:19] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[14:39:19] ================== [PASSED] dma-buf-fence ==================
[14:39:19] ============ dma-buf-fence-chain (11 subtests) =============
[14:39:19] [PASSED] test_sanitycheck
[14:39:19] [PASSED] test_find_seqno
[14:39:19] [PASSED] test_find_signaled
[14:39:19] [PASSED] test_find_out_of_order
[14:39:24] [PASSED] test_find_gap
[14:39:24] [PASSED] test_find_race
[14:39:24] [PASSED] test_signal_forward
[14:39:24] [PASSED] test_signal_backward
[14:39:24] [PASSED] test_wait_forward
[14:39:24] [PASSED] test_wait_backward
[14:39:24] [PASSED] test_wait_random
[14:39:24] =============== [PASSED] dma-buf-fence-chain ===============
[14:39:24] ============ dma-buf-fence-unwrap (10 subtests) ============
[14:39:24] [PASSED] test_sanitycheck
[14:39:24] [PASSED] test_unwrap_array
[14:39:24] [PASSED] test_unwrap_chain
[14:39:24] [PASSED] test_unwrap_chain_array
[14:39:24] [PASSED] test_unwrap_merge
[14:39:24] [PASSED] test_unwrap_merge_duplicate
[14:39:24] [PASSED] test_unwrap_merge_seqno
[14:39:24] [PASSED] test_unwrap_merge_order
[14:39:24] [PASSED] test_unwrap_merge_complex
[14:39:24] [PASSED] test_unwrap_merge_complex_seqno
[14:39:24] ============== [PASSED] dma-buf-fence-unwrap ===============
[14:39:24] ================ dma-buf-resv (5 subtests) =================
[14:39:24] [PASSED] test_sanitycheck
[14:39:24] ===================== test_signaling  ======================
[14:39:24] [PASSED] kernel
[14:39:24] [PASSED] write
[14:39:24] [PASSED] read
[14:39:24] [PASSED] bookkeep
[14:39:24] ================= [PASSED] test_signaling ==================
[14:39:24] ====================== test_for_each  ======================
[14:39:24] [PASSED] kernel
[14:39:24] [PASSED] write
[14:39:24] [PASSED] read
[14:39:24] [PASSED] bookkeep
[14:39:24] ================== [PASSED] test_for_each ==================
[14:39:24] ================= test_for_each_unlocked  ==================
[14:39:24] [PASSED] kernel
[14:39:24] [PASSED] write
[14:39:24] [PASSED] read
[14:39:24] [PASSED] bookkeep
[14:39:24] ============= [PASSED] test_for_each_unlocked ==============
[14:39:24] ===================== test_get_fences  =====================
[14:39:24] [PASSED] kernel
[14:39:24] [PASSED] write
[14:39:24] [PASSED] read
[14:39:24] [PASSED] bookkeep
[14:39:24] ================= [PASSED] test_get_fences =================
[14:39:24] ================== [PASSED] dma-buf-resv ===================
[14:39:24] ============================================================
[14:39:24] Testing complete. Ran 50 tests: passed: 49, skipped: 1
[14:39:24] Elapsed time: 15.757s total, 1.734s configuring, 8.651s building, 5.354s running

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



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

* ✓ Xe.CI.BAT: success for Add memory page offlining support (rev21)
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (15 preceding siblings ...)
  2026-08-26 14:39 ` ✓ CI.KUnit: success " Patchwork
@ 2026-08-26 15:21 ` Patchwork
  2026-08-26 19:01 ` ✓ Xe.CI.FULL: " Patchwork
  17 siblings, 0 replies; 54+ messages in thread
From: Patchwork @ 2026-08-26 15:21 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

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

== Series Details ==

Series: Add memory page offlining support (rev21)
URL   : https://patchwork.freedesktop.org/series/161473/
State : success

== Summary ==

CI Bug Log - changes from xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6_BAT -> xe-pw-161473v21_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

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

  No changes in participating hosts


Changes
-------

  No changes found


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

  * Linux: xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6 -> xe-pw-161473v21

  IGT_9076: 8f42b0189d73d9912ad58c99cfaa4ff46c20fcc3 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6: 4a47d4b5bf957bd7e34d8d3ab7096c42161892c6
  xe-pw-161473v21: 161473v21

== Logs ==

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

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

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

* ✓ Xe.CI.FULL: success for Add memory page offlining support (rev21)
  2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
                   ` (16 preceding siblings ...)
  2026-08-26 15:21 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-08-26 19:01 ` Patchwork
  17 siblings, 0 replies; 54+ messages in thread
From: Patchwork @ 2026-08-26 19:01 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

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

== Series Details ==

Series: Add memory page offlining support (rev21)
URL   : https://patchwork.freedesktop.org/series/161473/
State : success

== Summary ==

CI Bug Log - changes from xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6_FULL -> xe-pw-161473v21_FULL
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (2 -> 2)
------------------------------

  No changes in participating hosts

New tests
---------

  New tests have been introduced between xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6_FULL and xe-pw-161473v21_FULL:

### New IGT tests (113) ###

  * igt@kms_flip@absolute-wf_vblank-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.10] s

  * igt@kms_flip@absolute-wf_vblank-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.11] s

  * igt@kms_flip@absolute-wf_vblank-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.12] s

  * igt@kms_flip@absolute-wf_vblank@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.13] s

  * igt@kms_flip@absolute-wf_vblank@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.12] s

  * igt@kms_flip@absolute-wf_vblank@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.14] s

  * igt@kms_flip@basic-flip-vs-dpms@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.76] s

  * igt@kms_flip@basic-flip-vs-dpms@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.75] s

  * igt@kms_flip@basic-flip-vs-dpms@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.76] s

  * igt@kms_flip@basic-flip-vs-modeset@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.77] s

  * igt@kms_flip@basic-flip-vs-modeset@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.77] s

  * igt@kms_flip@basic-flip-vs-modeset@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.77] s

  * igt@kms_flip@basic-flip-vs-wf_vblank@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.08] s

  * igt@kms_flip@basic-flip-vs-wf_vblank@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.25] s

  * igt@kms_flip@basic-flip-vs-wf_vblank@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.08] s

  * igt@kms_flip@basic-plain-flip@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.77] s

  * igt@kms_flip@basic-plain-flip@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.80] s

  * igt@kms_flip@basic-plain-flip@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.80] s

  * igt@kms_flip@blocking-absolute-wf_vblank@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.13] s

  * igt@kms_flip@blocking-absolute-wf_vblank@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.14] s

  * igt@kms_flip@blocking-absolute-wf_vblank@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.13] s

  * igt@kms_flip@blocking-wf_vblank@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.40] s

  * igt@kms_flip@blocking-wf_vblank@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.41] s

  * igt@kms_flip@blocking-wf_vblank@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.41] s

  * igt@kms_flip@bo-too-big-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.27] s

  * igt@kms_flip@bo-too-big-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.26] s

  * igt@kms_flip@bo-too-big-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.26] s

  * igt@kms_flip@bo-too-big@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.28] s

  * igt@kms_flip@bo-too-big@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.29] s

  * igt@kms_flip@bo-too-big@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.27] s

  * igt@kms_flip@busy-flip@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.81] s

  * igt@kms_flip@busy-flip@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.80] s

  * igt@kms_flip@busy-flip@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.81] s

  * igt@kms_flip@dpms-off-confusion-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.04] s

  * igt@kms_flip@dpms-off-confusion-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.03] s

  * igt@kms_flip@dpms-off-confusion-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.02] s

  * igt@kms_flip@dpms-vs-vblank-race-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.76] s

  * igt@kms_flip@dpms-vs-vblank-race-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.77] s

  * igt@kms_flip@dpms-vs-vblank-race-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.77] s

  * igt@kms_flip@dpms-vs-vblank-race@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.78] s

  * igt@kms_flip@dpms-vs-vblank-race@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.80] s

  * igt@kms_flip@dpms-vs-vblank-race@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.83] s

  * igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.38] s

  * igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.39] s

  * igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.37] s

  * igt@kms_flip@flip-vs-absolute-wf_vblank@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.41] s

  * igt@kms_flip@flip-vs-absolute-wf_vblank@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.42] s

  * igt@kms_flip@flip-vs-absolute-wf_vblank@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.40] s

  * igt@kms_flip@flip-vs-blocking-wf-vblank@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.41] s

  * igt@kms_flip@flip-vs-blocking-wf-vblank@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.41] s

  * igt@kms_flip@flip-vs-blocking-wf-vblank@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.39] s

  * igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.79] s

  * igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.78] s

  * igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.80] s

  * igt@kms_flip@flip-vs-dpms-off-vs-modeset@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.75] s

  * igt@kms_flip@flip-vs-dpms-off-vs-modeset@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.75] s

  * igt@kms_flip@flip-vs-dpms-off-vs-modeset@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.75] s

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.01] s

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.02] s

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.04] s

  * igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.04] s

  * igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.03] s

  * igt@kms_flip@flip-vs-expired-vblank@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.04] s

  * igt@kms_flip@flip-vs-panning-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.05] s

  * igt@kms_flip@flip-vs-panning-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.06] s

  * igt@kms_flip@flip-vs-panning-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.05] s

  * igt@kms_flip@flip-vs-panning-vs-hang@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.80] s

  * igt@kms_flip@flip-vs-rmfb-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.03] s

  * igt@kms_flip@flip-vs-rmfb-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.02] s

  * igt@kms_flip@flip-vs-rmfb-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.00] s

  * igt@kms_flip@flip-vs-rmfb@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.01] s

  * igt@kms_flip@flip-vs-rmfb@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.01] s

  * igt@kms_flip@flip-vs-rmfb@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.01] s

  * igt@kms_flip@flip-vs-suspend-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [2.85] s

  * igt@kms_flip@flip-vs-wf_vblank-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.00] s

  * igt@kms_flip@flip-vs-wf_vblank-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.20] s

  * igt@kms_flip@flip-vs-wf_vblank-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.00] s

  * igt@kms_flip@modeset-vs-vblank-race-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.86] s

  * igt@kms_flip@modeset-vs-vblank-race-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.85] s

  * igt@kms_flip@modeset-vs-vblank-race-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.85] s

  * igt@kms_flip@modeset-vs-vblank-race@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.89] s

  * igt@kms_flip@modeset-vs-vblank-race@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.90] s

  * igt@kms_flip@modeset-vs-vblank-race@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [1.89] s

  * igt@kms_flip@nonexisting-fb-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.28] s

  * igt@kms_flip@nonexisting-fb-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.26] s

  * igt@kms_flip@nonexisting-fb-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.26] s

  * igt@kms_flip@plain-flip-fb-recreate-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.29] s

  * igt@kms_flip@plain-flip-fb-recreate-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.27] s

  * igt@kms_flip@plain-flip-fb-recreate-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.30] s

  * igt@kms_flip@plain-flip-fb-recreate@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.32] s

  * igt@kms_flip@plain-flip-fb-recreate@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.34] s

  * igt@kms_flip@plain-flip-fb-recreate@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.32] s

  * igt@kms_flip@plain-flip-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.79] s

  * igt@kms_flip@plain-flip-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.81] s

  * igt@kms_flip@plain-flip-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.81] s

  * igt@kms_flip@plain-flip-ts-check-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.31] s

  * igt@kms_flip@plain-flip-ts-check-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.30] s

  * igt@kms_flip@plain-flip-ts-check-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.30] s

  * igt@kms_flip@plain-flip-ts-check@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.33] s

  * igt@kms_flip@plain-flip-ts-check@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.33] s

  * igt@kms_flip@plain-flip-ts-check@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.32] s

  * igt@kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.73] s

  * igt@kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.72] s

  * igt@kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.71] s

  * igt@kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.74] s

  * igt@kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.74] s

  * igt@kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [0.76] s

  * igt@kms_flip@wf_vblank-ts-check-interruptible@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.40] s

  * igt@kms_flip@wf_vblank-ts-check-interruptible@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.38] s

  * igt@kms_flip@wf_vblank-ts-check-interruptible@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.40] s

  * igt@kms_flip@wf_vblank-ts-check@a-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.40] s

  * igt@kms_flip@wf_vblank-ts-check@b-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.41] s

  * igt@kms_flip@wf_vblank-ts-check@c-hdmi-a3:
    - Statuses : 1 pass(s)
    - Exec time: [4.39] s

  

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

  Here are the changes found in xe-pw-161473v21_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_big_fb@x-tiled-32bpp-rotate-90:
    - shard-bmg:          NOTRUN -> [SKIP][1] ([Intel XE#2327]) +1 other test skip
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_big_fb@x-tiled-32bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-64bpp-rotate-180:
    - shard-bmg:          NOTRUN -> [SKIP][2] ([Intel XE#1124])
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_big_fb@yf-tiled-64bpp-rotate-180.html

  * igt@kms_bw@linear-tiling-1-displays-target-3840x2160p:
    - shard-bmg:          NOTRUN -> [SKIP][3] ([Intel XE#367]) +1 other test skip
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_bw@linear-tiling-1-displays-target-3840x2160p.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][4] ([Intel XE#2887]) +2 other tests skip
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_cdclk@plane-scaling:
    - shard-bmg:          NOTRUN -> [SKIP][5] ([Intel XE#2724] / [Intel XE#7449])
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_cdclk@plane-scaling.html

  * igt@kms_chamelium_edid@hdmi-edid-change-during-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][6] ([Intel XE#2252]) +2 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_chamelium_edid@hdmi-edid-change-during-suspend.html

  * igt@kms_cursor_crc@cursor-offscreen-256x85:
    - shard-bmg:          NOTRUN -> [SKIP][7] ([Intel XE#2320])
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_cursor_crc@cursor-offscreen-256x85.html

  * igt@kms_dsc@dsc-with-bpc-formats-bigjoiner:
    - shard-bmg:          NOTRUN -> [SKIP][8] ([Intel XE#8265])
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_dsc@dsc-with-bpc-formats-bigjoiner.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1:
    - shard-lnl:          [PASS][9] -> [FAIL][10] ([Intel XE#301]) +2 other tests fail
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling:
    - shard-bmg:          NOTRUN -> [SKIP][11] ([Intel XE#7178] / [Intel XE#7351])
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][12] ([Intel XE#4141]) +2 other tests skip
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-argb161616f-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][13] ([Intel XE#7061] / [Intel XE#7356])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_frontbuffer_tracking@fbcdrrs-argb161616f-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-modesetfrombusy:
    - shard-bmg:          NOTRUN -> [SKIP][14] ([Intel XE#2311]) +12 other tests skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_frontbuffer_tracking@fbcdrrs-modesetfrombusy.html

  * igt@kms_frontbuffer_tracking@fbcpsr-indfb-scaledprimary:
    - shard-bmg:          NOTRUN -> [SKIP][15] ([Intel XE#2313]) +14 other tests skip
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_frontbuffer_tracking@fbcpsr-indfb-scaledprimary.html

  * igt@kms_frontbuffer_tracking@psrhdr-argb161616f-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][16] ([Intel XE#7061]) +1 other test skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_frontbuffer_tracking@psrhdr-argb161616f-draw-render.html

  * igt@kms_plane@pixel-format-yf-tiled-modifier-source-clamping:
    - shard-bmg:          NOTRUN -> [SKIP][17] ([Intel XE#7283])
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_plane@pixel-format-yf-tiled-modifier-source-clamping.html

  * igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area:
    - shard-bmg:          NOTRUN -> [SKIP][18] ([Intel XE#1489]) +1 other test skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr@fbc-pr-cursor-plane-onoff:
    - shard-bmg:          NOTRUN -> [SKIP][19] ([Intel XE#2234] / [Intel XE#2850]) +2 other tests skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_psr@fbc-pr-cursor-plane-onoff.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
    - shard-bmg:          NOTRUN -> [SKIP][20] ([Intel XE#2330] / [Intel XE#5813])
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html

  * igt@kms_sharpness_filter@filter-tap:
    - shard-bmg:          NOTRUN -> [SKIP][21] ([Intel XE#6503])
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_sharpness_filter@filter-tap.html

  * igt@kms_sharpness_filter@invalid-plane-with-filter@pipe-a-edp-1-invalid-plane-with-filter:
    - shard-lnl:          [PASS][22] -> [DMESG-WARN][23] ([Intel XE#8551]) +1 other test dmesg-warn
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6/shard-lnl-1/igt@kms_sharpness_filter@invalid-plane-with-filter@pipe-a-edp-1-invalid-plane-with-filter.html
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-lnl-4/igt@kms_sharpness_filter@invalid-plane-with-filter@pipe-a-edp-1-invalid-plane-with-filter.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-bmg:          NOTRUN -> [FAIL][24] ([Intel XE#1729] / [Intel XE#7424])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_tv_load_detect@load-detect:
    - shard-bmg:          NOTRUN -> [SKIP][25] ([Intel XE#2450] / [Intel XE#5857])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@kms_tv_load_detect@load-detect.html

  * igt@xe_evict@evict-beng-mixed-many-threads-small:
    - shard-bmg:          [PASS][26] -> [INCOMPLETE][27] ([Intel XE#6321] / [Intel XE#8355])
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6/shard-bmg-3/igt@xe_evict@evict-beng-mixed-many-threads-small.html
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@xe_evict@evict-beng-mixed-many-threads-small.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr-invalidate-race:
    - shard-bmg:          NOTRUN -> [SKIP][28] ([Intel XE#2322] / [Intel XE#7372])
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr-invalidate-race.html

  * igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-race-imm:
    - shard-bmg:          NOTRUN -> [SKIP][29] ([Intel XE#8374]) +1 other test skip
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-race-imm.html

  * igt@xe_exec_multi_queue@max-queues-close-fd:
    - shard-bmg:          NOTRUN -> [SKIP][30] ([Intel XE#8364]) +6 other tests skip
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@xe_exec_multi_queue@max-queues-close-fd.html

  * igt@xe_exec_reset@gt-stress-reset-mixed-engine-usage:
    - shard-bmg:          NOTRUN -> [INCOMPLETE][31] ([Intel XE#9041])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@xe_exec_reset@gt-stress-reset-mixed-engine-usage.html

  * igt@xe_exec_reset@multi-queue-cat-error:
    - shard-bmg:          NOTRUN -> [SKIP][32] ([Intel XE#8369])
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-10/igt@xe_exec_reset@multi-queue-cat-error.html

  * igt@xe_exec_threads@threads-multi-queue-cm-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][33] ([Intel XE#8378])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@xe_exec_threads@threads-multi-queue-cm-rebind.html

  * igt@xe_fault_injection@inject-fault-probe-function-xe_guc_ads_init:
    - shard-bmg:          [PASS][34] -> [ABORT][35] ([Intel XE#8007])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6/shard-bmg-10/igt@xe_fault_injection@inject-fault-probe-function-xe_guc_ads_init.html
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-8/igt@xe_fault_injection@inject-fault-probe-function-xe_guc_ads_init.html

  * igt@xe_pxp@pxp-stale-bo-bind-post-rpm:
    - shard-bmg:          NOTRUN -> [SKIP][36] ([Intel XE#4733] / [Intel XE#7417])
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@xe_pxp@pxp-stale-bo-bind-post-rpm.html

  * igt@xe_wedged@basic-wedged:
    - shard-bmg:          NOTRUN -> [DMESG-WARN][37] ([Intel XE#8963])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@xe_wedged@basic-wedged.html

  
#### Possible fixes ####

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-bmg:          [FAIL][38] ([Intel XE#3321]) -> [PASS][39] +1 other test pass
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6/shard-bmg-9/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-bmg-9/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-lnl:          [FAIL][40] ([Intel XE#301] / [Intel XE#3149]) -> [PASS][41] +1 other test pass
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  
#### Warnings ####

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-lnl:          [FAIL][42] ([Intel XE#301] / [Intel XE#3149]) -> [FAIL][43] ([Intel XE#301]) +1 other test fail
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v21/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2330
  [Intel XE#2450]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2450
  [Intel XE#2724]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2724
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#5813]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5813
  [Intel XE#5857]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5857
  [Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321
  [Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
  [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
  [Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
  [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
  [Intel XE#7372]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7372
  [Intel XE#7417]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7417
  [Intel XE#7424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7424
  [Intel XE#7449]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7449
  [Intel XE#8007]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8007
  [Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
  [Intel XE#8355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8355
  [Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
  [Intel XE#8369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8369
  [Intel XE#8374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8374
  [Intel XE#8378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8378
  [Intel XE#8551]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8551
  [Intel XE#8963]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8963
  [Intel XE#9041]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9041


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

  * Linux: xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6 -> xe-pw-161473v21

  IGT_9076: 8f42b0189d73d9912ad58c99cfaa4ff46c20fcc3 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-5647-4a47d4b5bf957bd7e34d8d3ab7096c42161892c6: 4a47d4b5bf957bd7e34d8d3ab7096c42161892c6
  xe-pw-161473v21: 161473v21

== Logs ==

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

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

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

* Re: [PATCH V18 01/14] drm/xe: Link VRAM object with gpu buddy
  2026-08-26 13:51 ` [PATCH V18 01/14] drm/xe: Link VRAM object with gpu buddy Tejas Upadhyay
@ 2026-08-26 22:31   ` Andi Shyti
  0 siblings, 0 replies; 54+ messages in thread
From: Andi Shyti @ 2026-08-26 22:31 UTC (permalink / raw)
  To: Tejas Upadhyay
  Cc: intel-xe, himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Matthew Brost

Hi Tejas,

On Wed, Aug 26, 2026 at 07:21:36PM +0530, Tejas Upadhyay wrote:
> Setup to link TTM buffer object inside gpu buddy. This functionality
> is critical for supporting the memory page offline feature on CRI,
> where identified faulty pages must be traced back to their
> originating buffer for safe removal.
> 
> V2(MattB): Clear block->private in xe_ttm_vram_mgr_del as well
> 
> Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
> Reviewed-by: Matthew Brost <matthew.brost@intel.com>
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>

Thanks,
Andi

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

* Re: [PATCH V18 02/14] drm/xe: Link LRC BO and its execution Queue
  2026-08-26 13:51 ` [PATCH V18 02/14] drm/xe: Link LRC BO and its execution Queue Tejas Upadhyay
@ 2026-08-26 22:34   ` Andi Shyti
  0 siblings, 0 replies; 54+ messages in thread
From: Andi Shyti @ 2026-08-26 22:34 UTC (permalink / raw)
  To: Tejas Upadhyay
  Cc: intel-xe, himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko

Hi Tejas,

On Wed, Aug 26, 2026 at 07:21:37PM +0530, Tejas Upadhyay wrote:
> To establish a link between an LRC BO (Logical Ring Context
> Buffer Object) and its corresponding execution Queue in the
> drm/xe driver, you need to store a back-pointer to the queue
> within the BO's private data structure. This allows the
> driver to identify and take corrective action on the specific
> queue if the LRC BO encounters an error (e.g., memory
> corruption or eviction issues).
> 
> V3(Sashiko):
> - Placeholder of 8 byte for non-lrc bo is acceptable
> - Assign bo-q is safe just use READ_ONCE/WRITE_ONCE
> V2(MattB):
> - Handle multiqueue
> 
> Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>

Thanks,
Andi

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

* Re: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-26 13:51 ` [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well Tejas Upadhyay
  2026-08-26 14:07   ` sashiko-bot
@ 2026-08-26 22:42   ` Andi Shyti
  2026-08-27  6:17     ` Upadhyay, Tejas
  1 sibling, 1 reply; 54+ messages in thread
From: Andi Shyti @ 2026-08-26 22:42 UTC (permalink / raw)
  To: Tejas Upadhyay
  Cc: intel-xe, himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	Arvind Yadav

Hi Tejas,

On Wed, Aug 26, 2026 at 07:21:38PM +0530, Tejas Upadhyay wrote:
> Recent driver update introduce support for purgeable buffer
> objects (BOs), extending the API to include VRAM pages to
> better manage memory pressure and enable memory offlining.

this commit description is not really telling anything.

Besides, can we split it in two parts?

Andi

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

* Re: [PATCH V18 04/14] drm/xe/bo: Make xe_bo_is_user() public
  2026-08-26 13:51 ` [PATCH V18 04/14] drm/xe/bo: Make xe_bo_is_user() public Tejas Upadhyay
@ 2026-08-26 22:44   ` Andi Shyti
  0 siblings, 0 replies; 54+ messages in thread
From: Andi Shyti @ 2026-08-26 22:44 UTC (permalink / raw)
  To: Tejas Upadhyay
  Cc: intel-xe, himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko

Hi Tejas,

On Wed, Aug 26, 2026 at 07:21:39PM +0530, Tejas Upadhyay wrote:
> Export xe_bo_is_user() so it can be used by the VRAM page offline
> code to distinguish user-created BOs from kernel BOs when deciding
> whether a faulty page can be safely purged or requires a full reset.
> 
> Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>

Thanks,
Andi

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

* Re: [PATCH V18 06/14] drm/xe/vram: Extract buddy alloc and free helpers
  2026-08-26 13:51 ` [PATCH V18 06/14] drm/xe/vram: Extract buddy alloc and free helpers Tejas Upadhyay
@ 2026-08-26 22:50   ` Andi Shyti
  0 siblings, 0 replies; 54+ messages in thread
From: Andi Shyti @ 2026-08-26 22:50 UTC (permalink / raw)
  To: Tejas Upadhyay
  Cc: intel-xe, himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko

Hi Tejas,

On Wed, Aug 26, 2026 at 07:21:41PM +0530, Tejas Upadhyay wrote:
> Factor out xe_ttm_vram_buddy_alloc() and xe_ttm_vram_buddy_free()
> from xe_ttm_vram_mgr_new() and xe_ttm_vram_mgr_del(). These helpers
> consolidate block allocation with visible-size tracking and
> block->private tagging, making them reusable by the upcoming VRAM
> page offline reservation path.
> 
> No functional change.
> 
> Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>

Thanks,
Andi

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

* Re: [PATCH V18 07/14] drm/xe/vram: Add page offline data structures and lifecycle
  2026-08-26 13:51 ` [PATCH V18 07/14] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
@ 2026-08-26 23:09   ` Andi Shyti
  2026-08-27  6:19   ` Ghimiray, Himal Prasad
  1 sibling, 0 replies; 54+ messages in thread
From: Andi Shyti @ 2026-08-26 23:09 UTC (permalink / raw)
  To: Tejas Upadhyay
  Cc: intel-xe, himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko

Hi Tejas,

On Wed, Aug 26, 2026 at 07:21:42PM +0530, Tejas Upadhyay wrote:
> Add xe_ttm_vram_offline_resource to track individual offlined VRAM
> pages, and extend xe_ttm_vram_mgr with offlined_pages/queued_pages
> lists and their counters.
> 
> Initialize the lists in __xe_ttm_vram_mgr_init() and add
> xe_ttm_vram_free_bad_pages() to release all tracked pages during
> xe_ttm_vram_mgr_fini() teardown.
> 
> v3(Sashiko):
> - Reorder xe_ttm_vram_buddy_free and list_del_rcu
> - Introduce reservation status
> v2(Himal):
> - Address possible leak in xe_ttm_vram_mgr_fini()
> - Remove unused dev and add comment for used_visible_size 0
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>

Andi

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

* Re: [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs
  2026-08-26 13:51 ` [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
  2026-08-26 14:12   ` sashiko-bot
@ 2026-08-27  6:08   ` Ghimiray, Himal Prasad
  2026-08-27  8:27     ` Upadhyay, Tejas
  1 sibling, 1 reply; 54+ messages in thread
From: Ghimiray, Himal Prasad @ 2026-08-27  6:08 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe; +Cc: rodrigo.vivi, michal.wajdeczko



On 26-08-2026 19:21, Tejas Upadhyay wrote:
> VRAM page offlining can purge BOs that are still referenced by page
> tables, exec queues, and DMA-buf exports. Add xe_bo_is_purged()
> guards in the teardown paths to prevent unpinning or mapping an
> already-purged BO:
> 
> - xe_bo_unpin_map_no_vm(): skip unpin if purged
> - xe_dma_buf_map(): return -ENOENT early if purged
> - xe_exec_queue_update_run_ticks(): skip LRC timestamp read if purged
> - xe_pt_destroy(): skip unpin if purged
> 
> v3(Sashiko):
> - Remove dma_resv is already held
> v2(Himal):
> - take dma_resv lock before calling xe_bo_is_purged()
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>   drivers/gpu/drm/xe/xe_bo.h         | 3 ++-
>   drivers/gpu/drm/xe/xe_dma_buf.c    | 3 +++
>   drivers/gpu/drm/xe/xe_exec_queue.c | 8 ++++++--
>   drivers/gpu/drm/xe/xe_pt.c         | 3 ++-
>   4 files changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
> index eede678ad303..dfcd0e57073b 100644
> --- a/drivers/gpu/drm/xe/xe_bo.h
> +++ b/drivers/gpu/drm/xe/xe_bo.h
> @@ -364,7 +364,8 @@ static inline void xe_bo_unpin_map_no_vm(struct xe_bo *bo)
>   {
>   	if (likely(bo)) {
>   		xe_bo_lock(bo, false);
> -		xe_bo_unpin(bo);
> +		if (!xe_bo_is_purged(bo))
> +			xe_bo_unpin(bo);
>   		xe_bo_unlock(bo);
>   
>   		xe_bo_put(bo);
> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c
> index bf0728838ead..5d9f1cd24b7f 100644
> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
> @@ -104,6 +104,9 @@ static struct sg_table *xe_dma_buf_map(struct dma_buf_attachment *attach,
>   	struct sg_table *sgt;
>   	int r = 0;
>   
> +	if (xe_bo_is_purged(bo))
> +		return ERR_PTR(-ENOENT);
> +
>   	if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>   		return ERR_PTR(-EOPNOTSUPP);
>   
> diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
> index 91ed6c0fac84..91e4f3cb5617 100644
> --- a/drivers/gpu/drm/xe/xe_exec_queue.c
> +++ b/drivers/gpu/drm/xe/xe_exec_queue.c
> @@ -1572,8 +1572,12 @@ void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q)
>   	 * errors.
>   	 */
>   	lrc = q->lrc[0];
> -	new_ts = xe_lrc_update_timestamp(lrc, &old_ts);
> -	q->xef->run_ticks[q->class] += (new_ts - old_ts) * q->width;
> +	xe_bo_lock(lrc->bo, false);
> +	if (!xe_bo_is_purged(lrc->bo)) {
> +		new_ts = xe_lrc_update_timestamp(lrc, &old_ts);
> +		q->xef->run_ticks[q->class] += (new_ts - old_ts) * q->width;
> +	}
> +	xe_bo_unlock(lrc->bo);
>   
>   	drm_dev_exit(idx);
>   }
> diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c
> index 5d990c1c3740..dbf1aa26a21b 100644
> --- a/drivers/gpu/drm/xe/xe_pt.c
> +++ b/drivers/gpu/drm/xe/xe_pt.c
> @@ -212,7 +212,8 @@ void xe_pt_destroy(struct xe_pt *pt, u32 flags, struct llist_head *deferred)
>   		return;
>   
>   	XE_WARN_ON(!list_empty(&pt->bo->ttm.base.gpuva.list));
> -	xe_bo_unpin(pt->bo);
> +	if (!xe_bo_is_purged(pt->bo))
> +		xe_bo_unpin(pt->bo);

IMO, moving purge check within xe_bo_unpin seems better, with comment 
what might cause purge.

>   	xe_bo_put_deferred(pt->bo, deferred);
>   
>   	if (pt->level > 0 && pt->num_live) {


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

* RE: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-26 22:42   ` Andi Shyti
@ 2026-08-27  6:17     ` Upadhyay, Tejas
  2026-08-27 14:40       ` Andi Shyti
  0 siblings, 1 reply; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-27  6:17 UTC (permalink / raw)
  To: Andi Shyti
  Cc: intel-xe@lists.freedesktop.org, Ghimiray, Himal Prasad,
	Vivi, Rodrigo, Wajdeczko, Michal, Yadav, Arvind



> -----Original Message-----
> From: Andi Shyti <andi.shyti@kernel.org>
> Sent: 27 August 2026 04:13
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org; Ghimiray, Himal Prasad
> <himal.prasad.ghimiray@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> Wajdeczko, Michal <michal.wajdeczko@intel.com>; Yadav, Arvind
> <arvind.yadav@intel.com>
> Subject: Re: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram
> pages as well
> 
> Hi Tejas,
> 
> On Wed, Aug 26, 2026 at 07:21:38PM +0530, Tejas Upadhyay wrote:
> > Recent driver update introduce support for purgeable buffer objects
> > (BOs), extending the API to include VRAM pages to better manage memory
> > pressure and enable memory offlining.
> 
> this commit description is not really telling anything.

Earlier we were not expecting vram pages getting purged, now with memory page off lining we can purge them, thus API modification done.

> 
> Besides, can we split it in two parts?

Not sure I understand correctly what split mean here, anyhow I will add little elaborative comment here.

Tejas
> 
> Andi

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

* Re: [PATCH V18 07/14] drm/xe/vram: Add page offline data structures and lifecycle
  2026-08-26 13:51 ` [PATCH V18 07/14] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
  2026-08-26 23:09   ` Andi Shyti
@ 2026-08-27  6:19   ` Ghimiray, Himal Prasad
  1 sibling, 0 replies; 54+ messages in thread
From: Ghimiray, Himal Prasad @ 2026-08-27  6:19 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe; +Cc: rodrigo.vivi, michal.wajdeczko



On 26-08-2026 19:21, Tejas Upadhyay wrote:
> Add xe_ttm_vram_offline_resource to track individual offlined VRAM
> pages, and extend xe_ttm_vram_mgr with offlined_pages/queued_pages
> lists and their counters.
> 
> Initialize the lists in __xe_ttm_vram_mgr_init() and add
> xe_ttm_vram_free_bad_pages() to release all tracked pages during
> xe_ttm_vram_mgr_fini() teardown.
> 
> v3(Sashiko):
> - Reorder xe_ttm_vram_buddy_free and list_del_rcu
> - Introduce reservation status
> v2(Himal):
> - Address possible leak in xe_ttm_vram_mgr_fini()
> - Remove unused dev and add comment for used_visible_size 0
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

LGTM
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>

> ---
>   drivers/gpu/drm/xe/xe_ttm_vram_mgr.c       | 25 ++++++++++++++
>   drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h | 38 ++++++++++++++++++++++
>   2 files changed, 63 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index 16ecea497780..1253989a8d06 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -338,12 +338,35 @@ static void xe_ttm_vram_mgr_set_unused(struct drm_device *dev, void *arg)
>   	ttm_resource_manager_set_used(man, false);
>   }
>   
> +static void xe_ttm_vram_free_bad_pages(struct xe_ttm_vram_mgr *mgr)
> +{
> +	struct xe_ttm_vram_offline_resource *pos, *n;
> +
> +	list_for_each_entry_safe(pos, n, &mgr->offlined_pages, offlined_link) {
> +		list_del_rcu(&pos->offlined_link);
> +		xe_ttm_vram_buddy_free(mgr, &pos->blocks, pos->used_visible_size);
> +		--mgr->n_offlined_pages;
> +		kfree_rcu(pos, rcu);
> +	}
> +	list_for_each_entry_safe(pos, n, &mgr->queued_pages, queued_link) {
> +		list_del_rcu(&pos->queued_link);
> +		/* queued entries have no buddy reservation yet */
> +		xe_ttm_vram_buddy_free(mgr, &pos->blocks, 0);
> +		--mgr->n_queued_pages;
> +		kfree_rcu(pos, rcu);
> +	}
> +}
> +
>   static void xe_ttm_vram_mgr_fini(struct drm_device *dev, void *arg)
>   {
>   	struct xe_device *xe = to_xe_device(dev);
>   	struct xe_ttm_vram_mgr *mgr = arg;
>   	struct ttm_resource_manager *man = &mgr->manager;
>   
> +	mutex_lock(&mgr->lock);
> +	xe_ttm_vram_free_bad_pages(mgr);
> +	mutex_unlock(&mgr->lock);
> +
>   	if (ttm_resource_manager_evict_all(&xe->ttm, man))
>   		return;
>   
> @@ -370,6 +393,8 @@ int __xe_ttm_vram_mgr_init(struct xe_device *xe, struct xe_ttm_vram_mgr *mgr,
>   	err = drmm_mutex_init(&xe->drm, &mgr->lock);
>   	if (err)
>   		return err;
> +	INIT_LIST_HEAD(&mgr->offlined_pages);
> +	INIT_LIST_HEAD(&mgr->queued_pages);
>   	mgr->default_page_size = default_page_size;
>   	mgr->visible_size = io_size;
>   	mgr->visible_avail = io_size;
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> index 9106da056b49..dc97b0ad0e51 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> @@ -19,6 +19,14 @@ struct xe_ttm_vram_mgr {
>   	struct ttm_resource_manager manager;
>   	/** @mm: DRM buddy allocator which manages the VRAM */
>   	struct gpu_buddy mm;
> +	/** @offlined_pages: List of offlined pages */
> +	struct list_head offlined_pages;
> +	/** @n_offlined_pages: Number of offlined pages */
> +	u16 n_offlined_pages;
> +	/** @queued_pages: List of queued pages */
> +	struct list_head queued_pages;
> +	/** @n_queued_pages: Number of queued pages */
> +	u16 n_queued_pages;
>   	/** @visible_size: Proped size of the CPU visible portion */
>   	u64 visible_size;
>   	/** @visible_avail: CPU visible portion still unallocated */
> @@ -45,4 +53,34 @@ struct xe_ttm_vram_mgr_resource {
>   	unsigned long flags;
>   };
>   
> +/**
> + * enum xe_page_reserve_status - Buddy reservation status
> + * @XE_PAGE_RESERVE_PENDING: reservation in progress
> + * @XE_PAGE_RESERVE_FAIL: reservation failed
> + */
> +enum xe_page_reserve_status {
> +	XE_PAGE_RESERVE_PENDING = 0,
> +	XE_PAGE_RESERVE_FAIL,
> +};
> +
> +/**
> + * struct xe_ttm_vram_offline_resource - Tracks a single offlined VRAM page
> + */
> +struct xe_ttm_vram_offline_resource {
> +	/** @offlined_link: Link into mgr->offlined_pages */
> +	struct list_head offlined_link;
> +	/** @queued_link: Link into mgr->queued_pages */
> +	struct list_head queued_link;
> +	/** @blocks: Buddy blocks reserved for this page */
> +	struct list_head blocks;
> +	/** @used_visible_size: CPU-visible bytes consumed */
> +	u64 used_visible_size;
> +	/** @addr: Faulty DPA reported by HW */
> +	u64 addr;
> +	/** @status: buddy reservation status */
> +	enum xe_page_reserve_status status;
> +	/** @rcu: RCU head for deferred freeing */
> +	struct rcu_head rcu;
> +};
> +
>   #endif


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

* Re: [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute
  2026-08-26 13:51 ` [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute Tejas Upadhyay
@ 2026-08-27  6:42   ` Ghimiray, Himal Prasad
  2026-08-27 15:00   ` Michal Wajdeczko
  1 sibling, 0 replies; 54+ messages in thread
From: Ghimiray, Himal Prasad @ 2026-08-27  6:42 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe; +Cc: rodrigo.vivi, michal.wajdeczko



On 26-08-2026 19:21, Tejas Upadhyay wrote:
> Add a new configfs attribute 'bad_page_reservation' to control how bad
> VRAM pages are handled:
>    0 - Logging only (report in dmesg, no offlining)
>    1 - Offlining (default)
> 
> The attribute can only be set before binding to the device and defaults
> to true (offlining enabled). This gives administrators control over
> whether corrupted VRAM pages detected by hardware (e.g., ECC errors)
> are actively offlined or only logged.
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>   drivers/gpu/drm/xe/xe_configfs.c | 67 +++++++++++++++++++++++++++++++-
>   drivers/gpu/drm/xe/xe_configfs.h |  2 +
>   2 files changed, 68 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
> index 052cce962161..80c4c5f66e4c 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.c
> +++ b/drivers/gpu/drm/xe/xe_configfs.c
> @@ -61,7 +61,8 @@
>    *	    ├── survivability_mode
>    *	    ├── gt_types_allowed
>    *	    ├── engines_allowed
> - *	    └── enable_psmi
> + *          ├── enable_psmi
> + *          └── bad_page_reservation
>    *
>    * After configuring the attributes as per next section, the device can be
>    * probed with::
> @@ -159,6 +160,19 @@
>    *
>    * This attribute can only be set before binding to the device.
>    *
> + * Bad pages reservation:
> + * ---------------------
> + *
> + * Controls how bad VRAM pages are handled:
> + *  0 - Logging only (report in dmesg, no offlining)
> + *  1 - Offlining (default)
> + *
> + *  Example to disable offlining::
> + *
> + *      # echo 0 > /sys/kernel/config/xe/0000:03:00.0/bad_page_reservation
> + *
> + * This attribute can only be set before binding to the device.
> + *
>    * Context restore BB
>    * ------------------
>    *
> @@ -275,6 +289,7 @@ struct xe_config_group_device {
>   		bool survivability_mode;
>   		bool enable_psmi;
>   		bool enable_multi_queue;
> +		bool bad_page_reservation;
>   		struct {
>   			unsigned int max_vfs;
>   			bool admin_only_pf;
> @@ -295,6 +310,7 @@ static const struct xe_config_device device_defaults = {
>   	.survivability_mode = false,
>   	.enable_psmi = false,
>   	.enable_multi_queue = true,
> +	.bad_page_reservation = true,
>   	.sriov = {
>   		.max_vfs = XE_DEFAULT_MAX_VFS,
>   		.admin_only_pf = XE_DEFAULT_ADMIN_ONLY_PF,
> @@ -616,6 +632,32 @@ static ssize_t enable_multi_queue_store(struct config_item *item, const char *pa
>   	return len;
>   }
>   
> +static ssize_t bad_page_reservation_show(struct config_item *item, char *page)
> +{
> +	struct xe_config_device *dev = to_xe_config_device(item);
> +
> +	return sprintf(page, "%d\n", dev->bad_page_reservation);
> +}
> +
> +static ssize_t bad_page_reservation_store(struct config_item *item, const char *page, size_t len)
> +{
> +	struct xe_config_group_device *dev = to_xe_config_group_device(item);
> +	bool val;
> +	int ret;
> +
> +	ret = kstrtobool(page, &val);
> +	if (ret)
> +		return ret;
> +
> +	guard(mutex)(&dev->lock);
> +	if (is_bound(dev))
> +		return -EBUSY;
> +
> +	dev->config.bad_page_reservation = val;
> +
> +	return len;
> +}
> +

Nit: would have preferred bad_page_reservation_store as static and being 
called in xe_drm_ras.c in next patch, but looks like 
to_xe_config_group_device being static will cause issue.

Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>


>   static bool wa_bb_read_advance(bool dereference, char **p,
>   			       const char *append, size_t len,
>   			       size_t *max_size)
> @@ -855,6 +897,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
>   CONFIGFS_ATTR(, ctx_restore_post_bb);
>   CONFIGFS_ATTR(, enable_multi_queue);
>   CONFIGFS_ATTR(, enable_psmi);
> +CONFIGFS_ATTR(, bad_page_reservation);
>   CONFIGFS_ATTR(, engines_allowed);
>   CONFIGFS_ATTR(, gt_types_allowed);
>   CONFIGFS_ATTR(, survivability_mode);
> @@ -864,6 +907,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
>   	&attr_ctx_restore_post_bb,
>   	&attr_enable_multi_queue,
>   	&attr_enable_psmi,
> +	&attr_bad_page_reservation,
>   	&attr_engines_allowed,
>   	&attr_gt_types_allowed,
>   	&attr_survivability_mode,
> @@ -1142,6 +1186,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
>   	PRI_CUSTOM_ATTR("%llx", engines_allowed);
>   	PRI_CUSTOM_ATTR("%d", enable_multi_queue);
>   	PRI_CUSTOM_ATTR("%d", enable_psmi);
> +	PRI_CUSTOM_ATTR("%d", bad_page_reservation);
>   	PRI_CUSTOM_ATTR("%d", survivability_mode);
>   	PRI_CUSTOM_ATTR("%u", sriov.admin_only_pf);
>   
> @@ -1290,6 +1335,26 @@ bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev)
>   	return ret;
>   }
>   
> +/**
> + * xe_configfs_get_bad_page_reservation - get configfs bad_page_reservation setting
> + * @pdev: pci device
> + *
> + * Return: bad_page_reservation setting in configfs
> + */
> +bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev)
> +{
> +	struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
> +	bool ret;
> +
> +	if (!dev)
> +		return device_defaults.bad_page_reservation;
> +
> +	ret = dev->config.bad_page_reservation;
> +	config_group_put(&dev->group);
> +
> +	return ret;
> +}
> +
>   /**
>    * xe_configfs_get_ctx_restore_mid_bb - get configfs ctx_restore_mid_bb setting
>    * @pdev: pci device
> diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
> index 4fbbeafba473..7405cc5f3207 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.h
> +++ b/drivers/gpu/drm/xe/xe_configfs.h
> @@ -24,6 +24,7 @@ bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
>   u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
>   bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev);
>   bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev);
> +bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev);
>   u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev,
>   				       enum xe_engine_class class,
>   				       const u32 **cs);
> @@ -44,6 +45,7 @@ static inline bool xe_configfs_media_gt_allowed(struct pci_dev *pdev) { return t
>   static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
>   static inline bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev) { return false; }
>   static inline bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev) { return true; }
> +static inline bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev) { return true; }
>   static inline u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev,
>   						     enum xe_engine_class class,
>   						     const u32 **cs) { return 0; }


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

* Re: [PATCH V18 10/14] drm/xe/ras: Cache bad_page_reservation policy at init
  2026-08-26 13:51 ` [PATCH V18 10/14] drm/xe/ras: Cache bad_page_reservation policy at init Tejas Upadhyay
  2026-08-26 14:11   ` sashiko-bot
@ 2026-08-27  6:45   ` Ghimiray, Himal Prasad
  1 sibling, 0 replies; 54+ messages in thread
From: Ghimiray, Himal Prasad @ 2026-08-27  6:45 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe; +Cc: rodrigo.vivi, michal.wajdeczko



On 26-08-2026 19:21, Tejas Upadhyay wrote:
> The configfs bad_page_reservation attribute can only be set before
> device bind, so its value is immutable at runtime. Cache it in
> struct xe_drm_ras during xe_drm_ras_init() to avoid repeated configfs
> lookups on every fault.

Nit:
s/xe_drm_ras_init/xe_ras_init

> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>   drivers/gpu/drm/xe/xe_drm_ras_types.h | 3 +++
>   drivers/gpu/drm/xe/xe_ras.c           | 5 +++++
>   2 files changed, 8 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_drm_ras_types.h b/drivers/gpu/drm/xe/xe_drm_ras_types.h
> index 8d729ad6a264..83899cf04793 100644
> --- a/drivers/gpu/drm/xe/xe_drm_ras_types.h
> +++ b/drivers/gpu/drm/xe/xe_drm_ras_types.h
> @@ -43,6 +43,9 @@ struct xe_drm_ras {
>   
>   	/** @info: info array for all types of errors */
>   	struct xe_drm_ras_counter *info[DRM_XE_RAS_ERR_SEV_MAX];
> +
> +	/** @bad_page_reservation: cached configfs policy, immutable after init */
> +	bool bad_page_reservation;
>   };
>   
>   #endif
> diff --git a/drivers/gpu/drm/xe/xe_ras.c b/drivers/gpu/drm/xe/xe_ras.c
> index d25d25f77531..c7e86ae0e8ad 100644
> --- a/drivers/gpu/drm/xe/xe_ras.c
> +++ b/drivers/gpu/drm/xe/xe_ras.c
> @@ -3,6 +3,7 @@
>    * Copyright © 2026 Intel Corporation
>    */
>   
> +#include "xe_configfs.h"
>   #include "xe_debugfs.h"
>   #include "xe_device.h"
>   #include "xe_drm_ras.h"
> @@ -804,6 +805,10 @@ void xe_ras_init(struct xe_device *xe)
>   {
>   	int ret;
>   

Nit:  AFAIK plan is to have xe.info check here for feature support, so a 
TODO please to remove platform check.

> +	if (xe->info.platform == XE_CRESCENTISLAND)
> +		xe->ras.bad_page_reservation =
> +			xe_configfs_get_bad_page_reservation(to_pci_dev(xe->drm.dev));
> +
>   	xe_drm_ras_init(xe);

With above Nits addressed
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>

>   
>   	if (!xe->info.has_sysctrl)


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

* Re: [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler
  2026-08-26 13:51 ` [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler Tejas Upadhyay
  2026-08-26 14:08   ` sashiko-bot
@ 2026-08-27  6:46   ` Ghimiray, Himal Prasad
  2026-08-27 15:04   ` Michal Wajdeczko
  2 siblings, 0 replies; 54+ messages in thread
From: Ghimiray, Himal Prasad @ 2026-08-27  6:46 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe; +Cc: rodrigo.vivi, michal.wajdeczko



On 26-08-2026 19:21, Tejas Upadhyay wrote:
> Before reserving a page at a faulting address, check the cached
> bad_page_reservation policy from xe->ras. If the policy is disabled
> (logging only), log the corrupted address and return -EOPNOTSUPP so
> that RAS can report to firmware to drop the address from the SRAM
> queue without attempting to offline the page.
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>

> ---
>   drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 6 ++++++
>   1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index b2b6c1bd2c55..24d134754265 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -864,6 +864,12 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
>   	vram_mgr = &vr->ttm;
>   	mm = &vram_mgr->mm;
>   
> +	if (!xe->ras.bad_page_reservation) {
> +		drm_err(&xe->drm, "0x%llx is reported as corrupted address by HW\n",
> +			addr);
> +		return -EOPNOTSUPP;
> +	}
> +
>   	/* Reserve page at address */
>   	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
>   }


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

* Re: [PATCH V18 14/14] drm/xe: Add fault-inject based VRAM page offline injection
  2026-08-26 13:51 ` [PATCH V18 14/14] drm/xe: Add fault-inject based VRAM page offline injection Tejas Upadhyay
@ 2026-08-27  7:10   ` Ghimiray, Himal Prasad
  2026-08-27  8:23     ` Upadhyay, Tejas
  0 siblings, 1 reply; 54+ messages in thread
From: Ghimiray, Himal Prasad @ 2026-08-27  7:10 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe; +Cc: rodrigo.vivi, michal.wajdeczko



On 26-08-2026 19:21, Tejas Upadhyay wrote:
> Add a fault-inject based debugfs interface for testing VRAM page
> offlining. This replaces the previous standalone debugfs approach
> with the standard kernel fault-inject infrastructure.
> 
> Two debugfs entries are created under the xe debugfs root for
> CRI platforms:
> - inject_mempage_offline/: Standard fault-inject knobs (probability,
>    times, interval, etc.) created by fault_create_debugfs_attr().
>    Without CONFIG_FAULT_INJECTION_DEBUG_FS, the stub returns
>    ERR_PTR(-ENODEV) and no knobs are created, making the trigger
>    effectively a no-op.
> - inject_mempage_offline_trigger: Write a PFN value to inject a
>    specific page, or write "0" to auto-pick the last unallocated
>    VRAM page
> 
> The trigger accepts:
> - "0"      : auto-pick last unallocated page
> - "0xPFN"  : inject fault at a specific PFN address
> 
> Usage:
>    echo 100 > inject_mempage_offline/probability
>    echo 1 > inject_mempage_offline/times
>    echo 0 > inject_mempage_offline_trigger
> 
>    probability: likelihood of should_fail() returning true (0-100)
>    times: number of times injection is allowed (-1 for unlimited)
> 
> v5(Sashiko):
> - exclude SRIOV and remove dpa_base addition, already absolute dpa
> v4(Himal):
> - Use xe_fault_mempage_offline() instead of IS_ENABLED() +
>    direct should_fail(). CONFIG_FAULT_INJECTION_DEBUG_FS is now
>    an implicit requirement for the trigger to function.
> v3(Himal):
> - Use FAULT_ACTION
> v2(sashiko):
> - use cond_resched()
> - validate input first and fix addr < 0 case
> - validate vr, move block, found var as local to scope_guard

Seems reclaiming the page at addr is left to unbind/bind of driver.
Need doc for that? Multiple fault injection at random offset might make
contigous vram allocation problematic.
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>   drivers/gpu/drm/xe/xe_debugfs.c      | 47 +++++++++++++++++++++++++
>   drivers/gpu/drm/xe/xe_debugfs.h      |  2 ++
>   drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 52 ++++++++++++++++++++++++++++
>   drivers/gpu/drm/xe/xe_ttm_vram_mgr.h |  1 +
>   4 files changed, 102 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
> index e19eafffbb08..003abf4af2e3 100644
> --- a/drivers/gpu/drm/xe/xe_debugfs.c
> +++ b/drivers/gpu/drm/xe/xe_debugfs.c
> @@ -45,12 +45,18 @@
>   DECLARE_FAULT_ATTR(gt_reset_failure);
>   DECLARE_FAULT_ATTR(inject_csc_hw_error);
>   DECLARE_FAULT_ATTR(wedge_cold_reset);
> +DECLARE_FAULT_ATTR(inject_mempage_offline);
>   
>   static bool csc_hw_error_available(struct xe_device *xe)
>   {
>   	return !IS_SRIOV_VF(xe) && xe->info.platform == XE_BATTLEMAGE;
>   }
>   
> +static bool is_crescent_island_pf(struct xe_device *xe)
> +{
> +	return !IS_SRIOV_VF(xe) && xe->info.platform == XE_CRESCENTISLAND;
> +}
> +
>   /*
>    * Fault injection table.  Each entry registers a debugfs attribute; add a
>    * matching FAULT_ACTION() below for every entry added here.
> @@ -67,6 +73,9 @@ static struct {
>   	  .is_visible = csc_hw_error_available },
>   	{ .name = "wedge_cold_reset",
>   	  .attr = &wedge_cold_reset },
> +	{ .name = "inject_mempage_offline",
> +	  .attr = &inject_mempage_offline,
> +	  .is_visible = is_crescent_island_pf },
>   };
>   
>   /*
> @@ -82,6 +91,39 @@ bool xe_fault_##name(void)				\
>   FAULT_ACTION(gt_reset, gt_reset_failure)
>   FAULT_ACTION(csc_hw_error, inject_csc_hw_error)
>   FAULT_ACTION(wedge_cold_reset, wedge_cold_reset)
> +FAULT_ACTION(mempage_offline, inject_mempage_offline)
> +
> +static ssize_t inject_mempage_offline_trigger(struct file *f,
> +					      const char __user *ubuf,
> +					      size_t size, loff_t *pos)
> +{
> +	struct xe_device *xe = file_inode(f)->i_private;
> +	struct xe_tile *tile = xe_device_get_root_tile(xe);
> +	struct xe_vram_region *vr = tile->mem.vram;
> +	u64 pfn;
> +	int ret;
> +
> +	if (!vr)
> +		return -ENODEV;
> +
> +	ret = kstrtou64_from_user(ubuf, size, 0, &pfn);
> +	if (ret)
> +		return ret;
> +
> +	if (!xe_fault_mempage_offline())
> +		return size;
> +
> +	if (pfn == 0)
> +		return xe_ttm_vram_inject_fault(xe) ?: size;
> +
> +	/* User provided PFN - convert to DPA and inject */
> +	return xe_ttm_vram_handle_addr_fault(xe, pfn << PAGE_SHIFT) ?: size;
> +}
> +
> +static const struct file_operations inject_mempage_offline_fops = {
> +	.owner = THIS_MODULE,
> +	.write = inject_mempage_offline_trigger,
> +};
>   
>   static void xe_fault_inject_debugfs_register(struct xe_device *xe,
>   					     struct dentry *root)
> @@ -96,6 +138,11 @@ static void xe_fault_inject_debugfs_register(struct xe_device *xe,
>   		fault_create_debugfs_attr(xe_fault_inject_entry[i].name, root,
>   					  xe_fault_inject_entry[i].attr);
>   	}
> +
> +	if (is_crescent_island_pf(xe)) {
> +		debugfs_create_file("inject_mempage_offline_trigger", 0200,
> +				    root, xe, &inject_mempage_offline_fops);
> +	}
>   }
>   
>   static void read_residency_counter(struct xe_device *xe, struct xe_mmio *mmio,
> diff --git a/drivers/gpu/drm/xe/xe_debugfs.h b/drivers/gpu/drm/xe/xe_debugfs.h
> index 0dcd28fd7dc0..88d91c78036b 100644
> --- a/drivers/gpu/drm/xe/xe_debugfs.h
> +++ b/drivers/gpu/drm/xe/xe_debugfs.h
> @@ -14,11 +14,13 @@ struct xe_device;
>   bool xe_fault_gt_reset(void);
>   bool xe_fault_csc_hw_error(void);
>   bool xe_fault_wedge_cold_reset(void);
> +bool xe_fault_mempage_offline(void);
>   void xe_debugfs_register(struct xe_device *xe);
>   #else
>   static inline bool xe_fault_gt_reset(void) { return false; }
>   static inline bool xe_fault_csc_hw_error(void) { return false; }
>   static inline bool xe_fault_wedge_cold_reset(void) { return false; }
> +static inline bool xe_fault_mempage_offline(void) { return false; }
>   static inline void xe_debugfs_register(struct xe_device *xe) { }
>   #endif
>   
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index 8f583f1631bf..c54ad017725f 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -895,6 +895,58 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
>   }
>   EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
>   
> +/**
> + * xe_ttm_vram_inject_fault - Inject a VRAM page fault for testing
> + * @xe: xe device instance
> + *
> + * Picks the last unallocated VRAM page and reports it as faulted
> + * via xe_ttm_vram_handle_addr_fault(). Used by the fault-inject
> + * debugfs interface for testing page offlining.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int xe_ttm_vram_inject_fault(struct xe_device *xe)
> +{
> +	struct xe_tile *tile = xe_device_get_root_tile(xe);
> +	struct xe_vram_region *vr = tile->mem.vram;
> +	struct xe_ttm_vram_mgr *vram_mgr = &vr->ttm;
> +	struct gpu_buddy *mm = &vram_mgr->mm;
> +	u64 addr;
> +
> +	if (vr->actual_physical_size < SZ_4K)
> +		return -ENOSPC;
> +
> +	addr = vr->actual_physical_size - SZ_4K;
> +	while (addr < vr->actual_physical_size) {
> +		struct gpu_buddy_block *block;
> +		bool found = false;
> +
> +		scoped_guard(mutex, &vram_mgr->lock) {
> +			block = gpu_buddy_allocated_addr_to_block(mm, addr);
> +			if (!block)
> +				found = true;
> +		}
> +
> +		/*
> +		 * Intentional race window: xe_ttm_vram_handle_addr_fault()
> +		 * re-acquires vram_mgr->lock internally, so we cannot hold
> +		 * it here. A concurrent allocation claiming this page between
> +		 * the two calls is an acceptable false negative for this
> +		 * test-only path.
> +		 */
> +		if (found)
> +			return xe_ttm_vram_handle_addr_fault(xe, addr + vr->dpa_base);
> +
> +		cond_resched();
> +		if (addr == 0)
> +			break;
> +		addr -= SZ_4K;
> +	}
> +
> +	return -ENOSPC;
> +}
> +EXPORT_SYMBOL(xe_ttm_vram_inject_fault);
> +
>   static int vram_bad_pages_show(struct seq_file *m, void *unused)
>   {
>   	struct xe_device *xe = m->private;
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> index f354c26c4257..8878e36292b2 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> @@ -33,6 +33,7 @@ void xe_ttm_vram_get_used(struct ttm_resource_manager *man,
>   			  u64 *used, u64 *used_visible);
>   
>   int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr);
> +int xe_ttm_vram_inject_fault(struct xe_device *xe);
>   void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root);
>   static inline struct xe_ttm_vram_mgr_resource *
>   to_xe_ttm_vram_mgr_resource(struct ttm_resource *res)


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

* RE: [PATCH V18 14/14] drm/xe: Add fault-inject based VRAM page offline injection
  2026-08-27  7:10   ` Ghimiray, Himal Prasad
@ 2026-08-27  8:23     ` Upadhyay, Tejas
  0 siblings, 0 replies; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-27  8:23 UTC (permalink / raw)
  To: Ghimiray, Himal Prasad, intel-xe@lists.freedesktop.org
  Cc: Vivi, Rodrigo, Wajdeczko, Michal



> -----Original Message-----
> From: Ghimiray, Himal Prasad <himal.prasad.ghimiray@intel.com>
> Sent: 27 August 2026 12:40
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> xe@lists.freedesktop.org
> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Wajdeczko, Michal
> <michal.wajdeczko@intel.com>
> Subject: Re: [PATCH V18 14/14] drm/xe: Add fault-inject based VRAM page
> offline injection
> 
> 
> 
> On 26-08-2026 19:21, Tejas Upadhyay wrote:
> > Add a fault-inject based debugfs interface for testing VRAM page
> > offlining. This replaces the previous standalone debugfs approach with
> > the standard kernel fault-inject infrastructure.
> >
> > Two debugfs entries are created under the xe debugfs root for CRI
> > platforms:
> > - inject_mempage_offline/: Standard fault-inject knobs (probability,
> >    times, interval, etc.) created by fault_create_debugfs_attr().
> >    Without CONFIG_FAULT_INJECTION_DEBUG_FS, the stub returns
> >    ERR_PTR(-ENODEV) and no knobs are created, making the trigger
> >    effectively a no-op.
> > - inject_mempage_offline_trigger: Write a PFN value to inject a
> >    specific page, or write "0" to auto-pick the last unallocated
> >    VRAM page
> >
> > The trigger accepts:
> > - "0"      : auto-pick last unallocated page
> > - "0xPFN"  : inject fault at a specific PFN address
> >
> > Usage:
> >    echo 100 > inject_mempage_offline/probability
> >    echo 1 > inject_mempage_offline/times
> >    echo 0 > inject_mempage_offline_trigger
> >
> >    probability: likelihood of should_fail() returning true (0-100)
> >    times: number of times injection is allowed (-1 for unlimited)
> >
> > v5(Sashiko):
> > - exclude SRIOV and remove dpa_base addition, already absolute dpa
> > v4(Himal):
> > - Use xe_fault_mempage_offline() instead of IS_ENABLED() +
> >    direct should_fail(). CONFIG_FAULT_INJECTION_DEBUG_FS is now
> >    an implicit requirement for the trigger to function.
> > v3(Himal):
> > - Use FAULT_ACTION
> > v2(sashiko):
> > - use cond_resched()
> > - validate input first and fix addr < 0 case
> > - validate vr, move block, found var as local to scope_guard
> 
> Seems reclaiming the page at addr is left to unbind/bind of driver.
> Need doc for that? Multiple fault injection at random offset might make
> contigous vram allocation problematic.

Yes, this comes under one of those tests where rebind of driver is required. I will add comment to respective api doc as well as add warning message. 

Tejas
> >
> > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > ---
> >   drivers/gpu/drm/xe/xe_debugfs.c      | 47 +++++++++++++++++++++++++
> >   drivers/gpu/drm/xe/xe_debugfs.h      |  2 ++
> >   drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 52
> ++++++++++++++++++++++++++++
> >   drivers/gpu/drm/xe/xe_ttm_vram_mgr.h |  1 +
> >   4 files changed, 102 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_debugfs.c
> > b/drivers/gpu/drm/xe/xe_debugfs.c index e19eafffbb08..003abf4af2e3
> > 100644
> > --- a/drivers/gpu/drm/xe/xe_debugfs.c
> > +++ b/drivers/gpu/drm/xe/xe_debugfs.c
> > @@ -45,12 +45,18 @@
> >   DECLARE_FAULT_ATTR(gt_reset_failure);
> >   DECLARE_FAULT_ATTR(inject_csc_hw_error);
> >   DECLARE_FAULT_ATTR(wedge_cold_reset);
> > +DECLARE_FAULT_ATTR(inject_mempage_offline);
> >
> >   static bool csc_hw_error_available(struct xe_device *xe)
> >   {
> >   	return !IS_SRIOV_VF(xe) && xe->info.platform == XE_BATTLEMAGE;
> >   }
> >
> > +static bool is_crescent_island_pf(struct xe_device *xe) {
> > +	return !IS_SRIOV_VF(xe) && xe->info.platform ==
> XE_CRESCENTISLAND; }
> > +
> >   /*
> >    * Fault injection table.  Each entry registers a debugfs attribute; add a
> >    * matching FAULT_ACTION() below for every entry added here.
> > @@ -67,6 +73,9 @@ static struct {
> >   	  .is_visible = csc_hw_error_available },
> >   	{ .name = "wedge_cold_reset",
> >   	  .attr = &wedge_cold_reset },
> > +	{ .name = "inject_mempage_offline",
> > +	  .attr = &inject_mempage_offline,
> > +	  .is_visible = is_crescent_island_pf },
> >   };
> >
> >   /*
> > @@ -82,6 +91,39 @@ bool xe_fault_##name(void)
> 	\
> >   FAULT_ACTION(gt_reset, gt_reset_failure)
> >   FAULT_ACTION(csc_hw_error, inject_csc_hw_error)
> >   FAULT_ACTION(wedge_cold_reset, wedge_cold_reset)
> > +FAULT_ACTION(mempage_offline, inject_mempage_offline)
> > +
> > +static ssize_t inject_mempage_offline_trigger(struct file *f,
> > +					      const char __user *ubuf,
> > +					      size_t size, loff_t *pos)
> > +{
> > +	struct xe_device *xe = file_inode(f)->i_private;
> > +	struct xe_tile *tile = xe_device_get_root_tile(xe);
> > +	struct xe_vram_region *vr = tile->mem.vram;
> > +	u64 pfn;
> > +	int ret;
> > +
> > +	if (!vr)
> > +		return -ENODEV;
> > +
> > +	ret = kstrtou64_from_user(ubuf, size, 0, &pfn);
> > +	if (ret)
> > +		return ret;
> > +
> > +	if (!xe_fault_mempage_offline())
> > +		return size;
> > +
> > +	if (pfn == 0)
> > +		return xe_ttm_vram_inject_fault(xe) ?: size;
> > +
> > +	/* User provided PFN - convert to DPA and inject */
> > +	return xe_ttm_vram_handle_addr_fault(xe, pfn << PAGE_SHIFT) ?:
> size;
> > +}
> > +
> > +static const struct file_operations inject_mempage_offline_fops = {
> > +	.owner = THIS_MODULE,
> > +	.write = inject_mempage_offline_trigger, };
> >
> >   static void xe_fault_inject_debugfs_register(struct xe_device *xe,
> >   					     struct dentry *root)
> > @@ -96,6 +138,11 @@ static void xe_fault_inject_debugfs_register(struct
> xe_device *xe,
> >   		fault_create_debugfs_attr(xe_fault_inject_entry[i].name, root,
> >   					  xe_fault_inject_entry[i].attr);
> >   	}
> > +
> > +	if (is_crescent_island_pf(xe)) {
> > +		debugfs_create_file("inject_mempage_offline_trigger", 0200,
> > +				    root, xe, &inject_mempage_offline_fops);
> > +	}
> >   }
> >
> >   static void read_residency_counter(struct xe_device *xe, struct
> > xe_mmio *mmio, diff --git a/drivers/gpu/drm/xe/xe_debugfs.h
> > b/drivers/gpu/drm/xe/xe_debugfs.h index 0dcd28fd7dc0..88d91c78036b
> > 100644
> > --- a/drivers/gpu/drm/xe/xe_debugfs.h
> > +++ b/drivers/gpu/drm/xe/xe_debugfs.h
> > @@ -14,11 +14,13 @@ struct xe_device;
> >   bool xe_fault_gt_reset(void);
> >   bool xe_fault_csc_hw_error(void);
> >   bool xe_fault_wedge_cold_reset(void);
> > +bool xe_fault_mempage_offline(void);
> >   void xe_debugfs_register(struct xe_device *xe);
> >   #else
> >   static inline bool xe_fault_gt_reset(void) { return false; }
> >   static inline bool xe_fault_csc_hw_error(void) { return false; }
> >   static inline bool xe_fault_wedge_cold_reset(void) { return false; }
> > +static inline bool xe_fault_mempage_offline(void) { return false; }
> >   static inline void xe_debugfs_register(struct xe_device *xe) { }
> >   #endif
> >
> > diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > index 8f583f1631bf..c54ad017725f 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > @@ -895,6 +895,58 @@ int xe_ttm_vram_handle_addr_fault(struct
> xe_device *xe, u64 addr)
> >   }
> >   EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
> >
> > +/**
> > + * xe_ttm_vram_inject_fault - Inject a VRAM page fault for testing
> > + * @xe: xe device instance
> > + *
> > + * Picks the last unallocated VRAM page and reports it as faulted
> > + * via xe_ttm_vram_handle_addr_fault(). Used by the fault-inject
> > + * debugfs interface for testing page offlining.
> > + *
> > + * Return: 0 on success, negative error code on failure.
> > + */
> > +int xe_ttm_vram_inject_fault(struct xe_device *xe) {
> > +	struct xe_tile *tile = xe_device_get_root_tile(xe);
> > +	struct xe_vram_region *vr = tile->mem.vram;
> > +	struct xe_ttm_vram_mgr *vram_mgr = &vr->ttm;
> > +	struct gpu_buddy *mm = &vram_mgr->mm;
> > +	u64 addr;
> > +
> > +	if (vr->actual_physical_size < SZ_4K)
> > +		return -ENOSPC;
> > +
> > +	addr = vr->actual_physical_size - SZ_4K;
> > +	while (addr < vr->actual_physical_size) {
> > +		struct gpu_buddy_block *block;
> > +		bool found = false;
> > +
> > +		scoped_guard(mutex, &vram_mgr->lock) {
> > +			block = gpu_buddy_allocated_addr_to_block(mm,
> addr);
> > +			if (!block)
> > +				found = true;
> > +		}
> > +
> > +		/*
> > +		 * Intentional race window: xe_ttm_vram_handle_addr_fault()
> > +		 * re-acquires vram_mgr->lock internally, so we cannot hold
> > +		 * it here. A concurrent allocation claiming this page between
> > +		 * the two calls is an acceptable false negative for this
> > +		 * test-only path.
> > +		 */
> > +		if (found)
> > +			return xe_ttm_vram_handle_addr_fault(xe, addr + vr-
> >dpa_base);
> > +
> > +		cond_resched();
> > +		if (addr == 0)
> > +			break;
> > +		addr -= SZ_4K;
> > +	}
> > +
> > +	return -ENOSPC;
> > +}
> > +EXPORT_SYMBOL(xe_ttm_vram_inject_fault);
> > +
> >   static int vram_bad_pages_show(struct seq_file *m, void *unused)
> >   {
> >   	struct xe_device *xe = m->private;
> > diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> > b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> > index f354c26c4257..8878e36292b2 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> > @@ -33,6 +33,7 @@ void xe_ttm_vram_get_used(struct
> ttm_resource_manager *man,
> >   			  u64 *used, u64 *used_visible);
> >
> >   int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr);
> > +int xe_ttm_vram_inject_fault(struct xe_device *xe);
> >   void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root);
> >   static inline struct xe_ttm_vram_mgr_resource *
> >   to_xe_ttm_vram_mgr_resource(struct ttm_resource *res)


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

* RE: [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs
  2026-08-27  6:08   ` Ghimiray, Himal Prasad
@ 2026-08-27  8:27     ` Upadhyay, Tejas
  0 siblings, 0 replies; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-27  8:27 UTC (permalink / raw)
  To: Ghimiray, Himal Prasad, intel-xe@lists.freedesktop.org
  Cc: Vivi, Rodrigo, Wajdeczko, Michal



> -----Original Message-----
> From: Ghimiray, Himal Prasad <himal.prasad.ghimiray@intel.com>
> Sent: 27 August 2026 11:39
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> xe@lists.freedesktop.org
> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Wajdeczko, Michal
> <michal.wajdeczko@intel.com>
> Subject: Re: [PATCH V18 05/14] drm/xe: Guard teardown paths against
> purged BOs
> 
> 
> 
> On 26-08-2026 19:21, Tejas Upadhyay wrote:
> > VRAM page offlining can purge BOs that are still referenced by page
> > tables, exec queues, and DMA-buf exports. Add xe_bo_is_purged() guards
> > in the teardown paths to prevent unpinning or mapping an
> > already-purged BO:
> >
> > - xe_bo_unpin_map_no_vm(): skip unpin if purged
> > - xe_dma_buf_map(): return -ENOENT early if purged
> > - xe_exec_queue_update_run_ticks(): skip LRC timestamp read if purged
> > - xe_pt_destroy(): skip unpin if purged
> >
> > v3(Sashiko):
> > - Remove dma_resv is already held
> > v2(Himal):
> > - take dma_resv lock before calling xe_bo_is_purged()
> >
> > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > ---
> >   drivers/gpu/drm/xe/xe_bo.h         | 3 ++-
> >   drivers/gpu/drm/xe/xe_dma_buf.c    | 3 +++
> >   drivers/gpu/drm/xe/xe_exec_queue.c | 8 ++++++--
> >   drivers/gpu/drm/xe/xe_pt.c         | 3 ++-
> >   4 files changed, 13 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
> > index eede678ad303..dfcd0e57073b 100644
> > --- a/drivers/gpu/drm/xe/xe_bo.h
> > +++ b/drivers/gpu/drm/xe/xe_bo.h
> > @@ -364,7 +364,8 @@ static inline void xe_bo_unpin_map_no_vm(struct
> xe_bo *bo)
> >   {
> >   	if (likely(bo)) {
> >   		xe_bo_lock(bo, false);
> > -		xe_bo_unpin(bo);
> > +		if (!xe_bo_is_purged(bo))
> > +			xe_bo_unpin(bo);
> >   		xe_bo_unlock(bo);
> >
> >   		xe_bo_put(bo);
> > diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
> > b/drivers/gpu/drm/xe/xe_dma_buf.c index bf0728838ead..5d9f1cd24b7f
> > 100644
> > --- a/drivers/gpu/drm/xe/xe_dma_buf.c
> > +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
> > @@ -104,6 +104,9 @@ static struct sg_table *xe_dma_buf_map(struct
> dma_buf_attachment *attach,
> >   	struct sg_table *sgt;
> >   	int r = 0;
> >
> > +	if (xe_bo_is_purged(bo))
> > +		return ERR_PTR(-ENOENT);
> > +
> >   	if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
> >   		return ERR_PTR(-EOPNOTSUPP);
> >
> > diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c
> > b/drivers/gpu/drm/xe/xe_exec_queue.c
> > index 91ed6c0fac84..91e4f3cb5617 100644
> > --- a/drivers/gpu/drm/xe/xe_exec_queue.c
> > +++ b/drivers/gpu/drm/xe/xe_exec_queue.c
> > @@ -1572,8 +1572,12 @@ void xe_exec_queue_update_run_ticks(struct
> xe_exec_queue *q)
> >   	 * errors.
> >   	 */
> >   	lrc = q->lrc[0];
> > -	new_ts = xe_lrc_update_timestamp(lrc, &old_ts);
> > -	q->xef->run_ticks[q->class] += (new_ts - old_ts) * q->width;
> > +	xe_bo_lock(lrc->bo, false);
> > +	if (!xe_bo_is_purged(lrc->bo)) {
> > +		new_ts = xe_lrc_update_timestamp(lrc, &old_ts);
> > +		q->xef->run_ticks[q->class] += (new_ts - old_ts) * q->width;
> > +	}
> > +	xe_bo_unlock(lrc->bo);
> >
> >   	drm_dev_exit(idx);
> >   }
> > diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c
> > index 5d990c1c3740..dbf1aa26a21b 100644
> > --- a/drivers/gpu/drm/xe/xe_pt.c
> > +++ b/drivers/gpu/drm/xe/xe_pt.c
> > @@ -212,7 +212,8 @@ void xe_pt_destroy(struct xe_pt *pt, u32 flags,
> struct llist_head *deferred)
> >   		return;
> >
> >   	XE_WARN_ON(!list_empty(&pt->bo->ttm.base.gpuva.list));
> > -	xe_bo_unpin(pt->bo);
> > +	if (!xe_bo_is_purged(pt->bo))
> > +		xe_bo_unpin(pt->bo);
> 
> IMO, moving purge check within xe_bo_unpin seems better, with comment
> what might cause purge.

Ack, agree on this, let me move it in xe_bo_unpin

Tejas
> 
> >   	xe_bo_put_deferred(pt->bo, deferred);
> >
> >   	if (pt->level > 0 && pt->num_live) {


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

* Re: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-27  6:17     ` Upadhyay, Tejas
@ 2026-08-27 14:40       ` Andi Shyti
  2026-08-27 14:48         ` Upadhyay, Tejas
  2026-08-28  5:25         ` Upadhyay, Tejas
  0 siblings, 2 replies; 54+ messages in thread
From: Andi Shyti @ 2026-08-27 14:40 UTC (permalink / raw)
  To: Upadhyay, Tejas
  Cc: intel-xe@lists.freedesktop.org, Ghimiray, Himal Prasad,
	Vivi, Rodrigo, Wajdeczko, Michal, Yadav, Arvind

> > 
> > Besides, can we split it in two parts?
> 
> Not sure I understand correctly what split mean here, anyhow I will add little elaborative comment here.

we can have one patch that is adding xe_ttm_bo_purge() to the
library and one removing the if statement. They look independent
to me and both are vaguely hinted in the commit log.

Andi

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

* RE: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-27 14:40       ` Andi Shyti
@ 2026-08-27 14:48         ` Upadhyay, Tejas
  2026-08-28  5:25         ` Upadhyay, Tejas
  1 sibling, 0 replies; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-27 14:48 UTC (permalink / raw)
  To: Andi Shyti
  Cc: intel-xe@lists.freedesktop.org, Ghimiray, Himal Prasad,
	Vivi, Rodrigo, Wajdeczko, Michal, Yadav, Arvind



> -----Original Message-----
> From: Andi Shyti <andi.shyti@kernel.org>
> Sent: 27 August 2026 20:10
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org; Ghimiray, Himal Prasad
> <himal.prasad.ghimiray@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> Wajdeczko, Michal <michal.wajdeczko@intel.com>; Yadav, Arvind
> <arvind.yadav@intel.com>
> Subject: Re: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram
> pages as well
> 
> > >
> > > Besides, can we split it in two parts?
> >
> > Not sure I understand correctly what split mean here, anyhow I will add little
> elaborative comment here.
> 
> we can have one patch that is adding xe_ttm_bo_purge() to the library and
> one removing the if statement. They look independent to me and both are
> vaguely hinted in the commit log.

Okay makes sense, I will add one separate patch for adding xe_ttm_bo_purge() to the library and rest in other.

Tejas
> 
> Andi

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

* Re: [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute
  2026-08-26 13:51 ` [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute Tejas Upadhyay
  2026-08-27  6:42   ` Ghimiray, Himal Prasad
@ 2026-08-27 15:00   ` Michal Wajdeczko
  2026-08-28 17:48     ` Upadhyay, Tejas
  1 sibling, 1 reply; 54+ messages in thread
From: Michal Wajdeczko @ 2026-08-27 15:00 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe; +Cc: himal.prasad.ghimiray, rodrigo.vivi



On 8/26/2026 3:51 PM, Tejas Upadhyay wrote:
> Add a new configfs attribute 'bad_page_reservation' to control how bad
> VRAM pages are handled:
>   0 - Logging only (report in dmesg, no offlining)
>   1 - Offlining (default)
> 
> The attribute can only be set before binding to the device and defaults
> to true (offlining enabled). This gives administrators control over
> whether corrupted VRAM pages detected by hardware (e.g., ECC errors)
> are actively offlined or only logged.
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_configfs.c | 67 +++++++++++++++++++++++++++++++-
>  drivers/gpu/drm/xe/xe_configfs.h |  2 +
>  2 files changed, 68 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
> index 052cce962161..80c4c5f66e4c 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.c
> +++ b/drivers/gpu/drm/xe/xe_configfs.c
> @@ -61,7 +61,8 @@
>   *	    ├── survivability_mode
>   *	    ├── gt_types_allowed
>   *	    ├── engines_allowed
> - *	    └── enable_psmi
> + *          ├── enable_psmi
> + *          └── bad_page_reservation

please double check alignment - look for \t

>   *
>   * After configuring the attributes as per next section, the device can be
>   * probed with::
> @@ -159,6 +160,19 @@
>   *
>   * This attribute can only be set before binding to the device.
>   *
> + * Bad pages reservation:
> + * ---------------------
> + *
> + * Controls how bad VRAM pages are handled:
> + *  0 - Logging only (report in dmesg, no offlining)
> + *  1 - Offlining (default)

this is bool, so Y/N/y/n will also work

> + *
> + *  Example to disable offlining::
> + *
> + *      # echo 0 > /sys/kernel/config/xe/0000:03:00.0/bad_page_reservation

if this is about VRAM, why attribute name does not say that?

maybe
	"enable_vram_offline"
or
	"disable_vram_offline"

to benefit from default '0' ?

> + *
> + * This attribute can only be set before binding to the device.

shouldn't we say that it is "available only on CRI+" or something?

> + *
>   * Context restore BB
>   * ------------------
>   *
> @@ -275,6 +289,7 @@ struct xe_config_group_device {
>  		bool survivability_mode;
>  		bool enable_psmi;
>  		bool enable_multi_queue;
> +		bool bad_page_reservation;
>  		struct {
>  			unsigned int max_vfs;
>  			bool admin_only_pf;
> @@ -295,6 +310,7 @@ static const struct xe_config_device device_defaults = {
>  	.survivability_mode = false,
>  	.enable_psmi = false,
>  	.enable_multi_queue = true,
> +	.bad_page_reservation = true,
>  	.sriov = {
>  		.max_vfs = XE_DEFAULT_MAX_VFS,
>  		.admin_only_pf = XE_DEFAULT_ADMIN_ONLY_PF,
> @@ -616,6 +632,32 @@ static ssize_t enable_multi_queue_store(struct config_item *item, const char *pa
>  	return len;
>  }
>  
> +static ssize_t bad_page_reservation_show(struct config_item *item, char *page)
> +{
> +	struct xe_config_device *dev = to_xe_config_device(item);
> +
> +	return sprintf(page, "%d\n", dev->bad_page_reservation);

	%s and str_yes_no() ?> +}
> +
> +static ssize_t bad_page_reservation_store(struct config_item *item, const char *page, size_t len)
> +{
> +	struct xe_config_group_device *dev = to_xe_config_group_device(item);
> +	bool val;
> +	int ret;
> +
> +	ret = kstrtobool(page, &val);
> +	if (ret)
> +		return ret;
> +
> +	guard(mutex)(&dev->lock);
> +	if (is_bound(dev))
> +		return -EBUSY;
> +
> +	dev->config.bad_page_reservation = val;
> +
> +	return len;
> +}
> +
>  static bool wa_bb_read_advance(bool dereference, char **p,
>  			       const char *append, size_t len,
>  			       size_t *max_size)
> @@ -855,6 +897,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
>  CONFIGFS_ATTR(, ctx_restore_post_bb);
>  CONFIGFS_ATTR(, enable_multi_queue);
>  CONFIGFS_ATTR(, enable_psmi);
> +CONFIGFS_ATTR(, bad_page_reservation);
>  CONFIGFS_ATTR(, engines_allowed);
>  CONFIGFS_ATTR(, gt_types_allowed);
>  CONFIGFS_ATTR(, survivability_mode);

shouldn't you also update xe_config_device_is_visible() to make it CRI+ only?
> @@ -864,6 +907,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
>  	&attr_ctx_restore_post_bb,
>  	&attr_enable_multi_queue,
>  	&attr_enable_psmi,
> +	&attr_bad_page_reservation,
>  	&attr_engines_allowed,
>  	&attr_gt_types_allowed,
>  	&attr_survivability_mode,
> @@ -1142,6 +1186,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
>  	PRI_CUSTOM_ATTR("%llx", engines_allowed);
>  	PRI_CUSTOM_ATTR("%d", enable_multi_queue);
>  	PRI_CUSTOM_ATTR("%d", enable_psmi);
> +	PRI_CUSTOM_ATTR("%d", bad_page_reservation);
>  	PRI_CUSTOM_ATTR("%d", survivability_mode);
>  	PRI_CUSTOM_ATTR("%u", sriov.admin_only_pf);
>  
> @@ -1290,6 +1335,26 @@ bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev)
>  	return ret;
>  }
>  
> +/**
> + * xe_configfs_get_bad_page_reservation - get configfs bad_page_reservation setting
> + * @pdev: pci device
> + *
> + * Return: bad_page_reservation setting in configfs
> + */
> +bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev)
> +{
> +	struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
> +	bool ret;
> +
> +	if (!dev)
> +		return device_defaults.bad_page_reservation;
> +
> +	ret = dev->config.bad_page_reservation;
> +	config_group_put(&dev->group);
> +
> +	return ret;
> +}
> +
>  /**
>   * xe_configfs_get_ctx_restore_mid_bb - get configfs ctx_restore_mid_bb setting
>   * @pdev: pci device
> diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
> index 4fbbeafba473..7405cc5f3207 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.h
> +++ b/drivers/gpu/drm/xe/xe_configfs.h
> @@ -24,6 +24,7 @@ bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
>  u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
>  bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev);
>  bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev);
> +bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev);
>  u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev,
>  				       enum xe_engine_class class,
>  				       const u32 **cs);
> @@ -44,6 +45,7 @@ static inline bool xe_configfs_media_gt_allowed(struct pci_dev *pdev) { return t
>  static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
>  static inline bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev) { return false; }
>  static inline bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev) { return true; }
> +static inline bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev) { return true; }
>  static inline u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev,
>  						     enum xe_engine_class class,
>  						     const u32 **cs) { return 0; }


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

* Re: [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler
  2026-08-26 13:51 ` [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler Tejas Upadhyay
  2026-08-26 14:08   ` sashiko-bot
  2026-08-27  6:46   ` Ghimiray, Himal Prasad
@ 2026-08-27 15:04   ` Michal Wajdeczko
  2 siblings, 0 replies; 54+ messages in thread
From: Michal Wajdeczko @ 2026-08-27 15:04 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe, Koujalagi, Mallesh
  Cc: himal.prasad.ghimiray, rodrigo.vivi



On 8/26/2026 3:51 PM, Tejas Upadhyay wrote:
> Before reserving a page at a faulting address, check the cached
> bad_page_reservation policy from xe->ras. If the policy is disabled
> (logging only), log the corrupted address and return -EOPNOTSUPP so
> that RAS can report to firmware to drop the address from the SRAM
> queue without attempting to offline the page.
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index b2b6c1bd2c55..24d134754265 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -864,6 +864,12 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
>  	vram_mgr = &vr->ttm;
>  	mm = &vram_mgr->mm;
>  
> +	if (!xe->ras.bad_page_reservation) {
> +		drm_err(&xe->drm, "0x%llx is reported as corrupted address by HW\n",
> +			addr);

we do have easier to use

	xe_err(xe, ...)

and also recently added SIGID logs:

	xe_log_err(xe, ...)

which maybe we should consider here?
or is it done by the other layer?

@Mallesh ?

> +		return -EOPNOTSUPP;
> +	}
> +
>  	/* Reserve page at address */
>  	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
>  }


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

* Re: [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs
  2026-08-26 13:51 ` [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
  2026-08-26 14:13   ` sashiko-bot
@ 2026-08-27 15:16   ` Michal Wajdeczko
  2026-08-28 19:06     ` Upadhyay, Tejas
  2026-08-28 15:04   ` Rodrigo Vivi
  2 siblings, 1 reply; 54+ messages in thread
From: Michal Wajdeczko @ 2026-08-27 15:16 UTC (permalink / raw)
  To: Tejas Upadhyay, intel-xe; +Cc: himal.prasad.ghimiray, rodrigo.vivi



On 8/26/2026 3:51 PM, Tejas Upadhyay wrote:
> Add a debugfs file "vram_bad_pages" that shows offlined and queued
> VRAM pages across all tiles. Each entry displays the page frame number,
> GPU page size, and status flag (R=reserved, P=pending, F=failed).
> 
> example,
> cat /sys/kernel/debug/dri/0/vram_bad_pages
> 
> max_pages: 10000
> 0x0000000000000000 : 0x0000000000001000 : R
> 0x0000000000001234 : 0x0000000000001000 : P
> 0x0000000000080000 : 0x0000000000001000 : R   ← tile 1 addr (includes tile offset)
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_debugfs.c            |  4 ++
>  drivers/gpu/drm/xe/xe_ttm_vram_mgr.c       | 66 ++++++++++++++++++++++
>  drivers/gpu/drm/xe/xe_ttm_vram_mgr.h       |  2 +
>  drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h |  2 +
>  4 files changed, 74 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
> index 28135f84e286..e19eafffbb08 100644
> --- a/drivers/gpu/drm/xe/xe_debugfs.c
> +++ b/drivers/gpu/drm/xe/xe_debugfs.c
> @@ -32,6 +32,7 @@
>  #include "xe_sriov_vf.h"
>  #include "xe_step.h"
>  #include "xe_tile_debugfs.h"
> +#include "xe_ttm_vram_mgr.h"
>  #include "xe_vsec.h"
>  #include "xe_wa.h"
>  
> @@ -773,6 +774,9 @@ void xe_debugfs_register(struct xe_device *xe)
>  	if (man)
>  		ttm_resource_manager_create_debugfs(man, root, "stolen_mm");
>  
> +	if (xe->info.platform == XE_CRESCENTISLAND)

maybe better to move that check to xe_ttm_vram_debugfs_init() ?

> +		xe_ttm_vram_debugfs_init(xe, root);
> +
>  	for_each_tile(tile, xe, tile_id)
>  		xe_tile_debugfs_register(tile);
>  
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index 24d134754265..af9e1fa868d7 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -5,6 +5,7 @@
>   */
>  
>  #include <linux/cgroup_dmem.h>
> +#include <linux/debugfs.h>
>  
>  #include <drm/drm_managed.h>
>  #include <drm/drm_drv.h>
> @@ -874,3 +875,68 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
>  	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
>  }
>  EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
> +
> +static int vram_bad_pages_show(struct seq_file *m, void *unused)
> +{
> +	struct xe_device *xe = m->private;
> +	struct xe_ttm_vram_offline_resource *pos;
> +	struct ttm_resource_manager *man;
> +	struct gpu_buddy_block *block;
> +	struct xe_ttm_vram_mgr *mgr;
> +	struct xe_tile *tile;
> +	u8 id;
> +
> +	man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
> +	if (man)
> +		seq_printf(m, "max_pages: %d\n",

is this the same value for PL_VRAM1, VRAM2 .. ?

> +			   to_xe_ttm_vram_mgr(man)->max_pages);
> +
> +	for_each_tile(tile, xe, id) {

as we loop over each tile, shouldn't we add this "bad_pages" debugfs
entry under separate tileN/ folder ?
> +		struct xe_vram_region *vr = tile->mem.vram;
> +
> +		man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0 + id);
> +		if (!man || !vr)
> +			continue;
> +		mgr = to_xe_ttm_vram_mgr(man);
> +
> +		rcu_read_lock();
> +
> +		list_for_each_entry_rcu(pos, &mgr->offlined_pages, offlined_link) {
> +			block = list_first_entry_or_null(&pos->blocks,
> +							 struct gpu_buddy_block, link);
> +			if (!block)
> +				continue;
> +
> +			seq_printf(m, "0x%016llx : 0x%016llx : R\n",
> +				   (gpu_buddy_block_offset(block) + vr->dpa_base) >> PAGE_SHIFT,
> +				   gpu_buddy_block_size(&mgr->mm, block));
> +		}
> +
> +		list_for_each_entry_rcu(pos, &mgr->queued_pages, queued_link) {
> +			u64 pfn, blk_size;
> +
> +			block = list_first_entry_or_null(&pos->blocks,
> +							 struct gpu_buddy_block, link);
> +			if (block) {
> +				pfn = (gpu_buddy_block_offset(block) + vr->dpa_base) >> PAGE_SHIFT;
> +				blk_size = gpu_buddy_block_size(&mgr->mm, block);
> +			} else {
> +				pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> +				blk_size = PAGE_SIZE;
> +			}
> +
> +			seq_printf(m, "0x%016llx : 0x%016llx : %c\n",
> +				   pfn, blk_size, pos->status ? 'F' : 'P');
> +		}
> +
> +		rcu_read_unlock();
> +	}
> +
> +	return 0;
> +}
> +DEFINE_SHOW_ATTRIBUTE(vram_bad_pages);
> +
> +void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root)
> +{
> +	debugfs_create_file("vram_bad_pages", 0444, root, xe, &vram_bad_pages_fops);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> index d5392beff30c..f354c26c4257 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> @@ -9,6 +9,7 @@
>  #include "xe_ttm_vram_mgr_types.h"
>  
>  enum dma_data_direction;
> +struct dentry;
>  struct xe_device;
>  struct xe_tile;
>  struct xe_vram_region;
> @@ -32,6 +33,7 @@ void xe_ttm_vram_get_used(struct ttm_resource_manager *man,
>  			  u64 *used, u64 *used_visible);
>  
>  int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr);
> +void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root);
>  static inline struct xe_ttm_vram_mgr_resource *
>  to_xe_ttm_vram_mgr_resource(struct ttm_resource *res)
>  {
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> index dc97b0ad0e51..efcf3e1d4e80 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> @@ -37,6 +37,8 @@ struct xe_ttm_vram_mgr {
>  	struct mutex lock;
>  	/** @mem_type: The TTM memory type */
>  	u32 mem_type;
> +	/** @max_pages: max pages that can be in offline queue retrieved from FW */
> +	u16 max_pages;
>  };
>  
>  /**


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

* Re: [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
  2026-08-26 13:51 ` [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
  2026-08-26 14:20   ` sashiko-bot
@ 2026-08-27 18:26   ` Andi Shyti
  2026-08-28  5:31     ` Upadhyay, Tejas
  1 sibling, 1 reply; 54+ messages in thread
From: Andi Shyti @ 2026-08-27 18:26 UTC (permalink / raw)
  To: Tejas Upadhyay
  Cc: intel-xe, himal.prasad.ghimiray, rodrigo.vivi, michal.wajdeczko,
	José Roberto de Souza, Michal Mrozek

> @@ -582,6 +583,7 @@ u64 xe_ttm_vram_get_avail(struct ttm_resource_manager *man)
>  
>  static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
>  {
> +	u32	q_flag = DRM_XE_EXEC_QUEUE_BAN_REASON_PAGE_OFFLINE;

you have a spurious tab here.

>  	struct ttm_operation_ctx ctx = {};
>  	struct xe_exec_queue *q_to_put = NULL;
>  	struct xe_exec_queue *q = NULL;

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

* RE: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-27 14:40       ` Andi Shyti
  2026-08-27 14:48         ` Upadhyay, Tejas
@ 2026-08-28  5:25         ` Upadhyay, Tejas
  2026-08-28  7:39           ` Andi Shyti
  1 sibling, 1 reply; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-28  5:25 UTC (permalink / raw)
  To: Andi Shyti
  Cc: intel-xe@lists.freedesktop.org, Ghimiray, Himal Prasad,
	Vivi, Rodrigo, Wajdeczko, Michal, Yadav, Arvind



> -----Original Message-----
> From: Andi Shyti <andi.shyti@kernel.org>
> Sent: 27 August 2026 20:10
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org; Ghimiray, Himal Prasad
> <himal.prasad.ghimiray@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> Wajdeczko, Michal <michal.wajdeczko@intel.com>; Yadav, Arvind
> <arvind.yadav@intel.com>
> Subject: Re: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram
> pages as well
> 
> > >
> > > Besides, can we split it in two parts?
> >
> > Not sure I understand correctly what split mean here, anyhow I will add little
> elaborative comment here.
> 
> we can have one patch that is adding xe_ttm_bo_purge() to the library and
> one removing the if statement. They look independent to me and both are
> vaguely hinted in the commit log.

Hi Andi,

I think for such small patch to split does not look good, rather I will make more descriptive commit message to explain what all it does. I hope that is fine.

Tejas
> 
> Andi

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

* RE: [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
  2026-08-27 18:26   ` Andi Shyti
@ 2026-08-28  5:31     ` Upadhyay, Tejas
  0 siblings, 0 replies; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-28  5:31 UTC (permalink / raw)
  To: Andi Shyti
  Cc: intel-xe@lists.freedesktop.org, Ghimiray, Himal Prasad,
	Vivi, Rodrigo, Wajdeczko, Michal, Souza, Jose, Mrozek, Michal



> -----Original Message-----
> From: Andi Shyti <andi.shyti@kernel.org>
> Sent: 27 August 2026 23:57
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org; Ghimiray, Himal Prasad
> <himal.prasad.ghimiray@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> Wajdeczko, Michal <michal.wajdeczko@intel.com>; Souza, Jose
> <jose.souza@intel.com>; Mrozek, Michal <michal.mrozek@intel.com>
> Subject: Re: [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in
> EXEC_QUEUE_GET_PROPERTY_BAN
> 
> > @@ -582,6 +583,7 @@ u64 xe_ttm_vram_get_avail(struct
> > ttm_resource_manager *man)
> >
> >  static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo
> > *bo)  {
> > +	u32	q_flag =
> DRM_XE_EXEC_QUEUE_BAN_REASON_PAGE_OFFLINE;
> 
> you have a spurious tab here.

Okay, don't know checkpatch --strict did not complain. I will remove it anyway in next version.

Tejas
> 
> >  	struct ttm_operation_ctx ctx = {};
> >  	struct xe_exec_queue *q_to_put = NULL;
> >  	struct xe_exec_queue *q = NULL;

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

* Re: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-28  5:25         ` Upadhyay, Tejas
@ 2026-08-28  7:39           ` Andi Shyti
  2026-08-28 17:29             ` Upadhyay, Tejas
  0 siblings, 1 reply; 54+ messages in thread
From: Andi Shyti @ 2026-08-28  7:39 UTC (permalink / raw)
  To: Upadhyay, Tejas
  Cc: intel-xe@lists.freedesktop.org, Ghimiray, Himal Prasad,
	Vivi, Rodrigo, Wajdeczko, Michal, Yadav, Arvind

Hi Tejas,

> > > >
> > > > Besides, can we split it in two parts?
> > >
> > > Not sure I understand correctly what split mean here, anyhow I will add little
> > elaborative comment here.
> > 
> > we can have one patch that is adding xe_ttm_bo_purge() to the library and
> > one removing the if statement. They look independent to me and both are
> > vaguely hinted in the commit log.
> 
> Hi Andi,
> 
> I think for such small patch to split does not look good, rather I will make more descriptive commit message to explain what all it does. I hope that is fine.

To me, it's good. There is no limit to how small a patch can be,
but there is a limitation that patches should contain a single
logical change. This patch contains two logical changes.

Andi

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

* Re: [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs
  2026-08-26 13:51 ` [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
  2026-08-26 14:13   ` sashiko-bot
  2026-08-27 15:16   ` Michal Wajdeczko
@ 2026-08-28 15:04   ` Rodrigo Vivi
  2 siblings, 0 replies; 54+ messages in thread
From: Rodrigo Vivi @ 2026-08-28 15:04 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe, himal.prasad.ghimiray, michal.wajdeczko

On Wed, Aug 26, 2026 at 07:21:47PM +0530, Tejas Upadhyay wrote:
> Add a debugfs file "vram_bad_pages" that shows offlined and queued
> VRAM pages across all tiles. Each entry displays the page frame number,
> GPU page size, and status flag (R=reserved, P=pending, F=failed).
> 
> example,
> cat /sys/kernel/debug/dri/0/vram_bad_pages
> 
> max_pages: 10000
> 0x0000000000000000 : 0x0000000000001000 : R
> 0x0000000000001234 : 0x0000000000001000 : P
> 0x0000000000080000 : 0x0000000000001000 : R   ← tile 1 addr (includes tile offset)
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

> ---
>  drivers/gpu/drm/xe/xe_debugfs.c            |  4 ++
>  drivers/gpu/drm/xe/xe_ttm_vram_mgr.c       | 66 ++++++++++++++++++++++
>  drivers/gpu/drm/xe/xe_ttm_vram_mgr.h       |  2 +
>  drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h |  2 +
>  4 files changed, 74 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
> index 28135f84e286..e19eafffbb08 100644
> --- a/drivers/gpu/drm/xe/xe_debugfs.c
> +++ b/drivers/gpu/drm/xe/xe_debugfs.c
> @@ -32,6 +32,7 @@
>  #include "xe_sriov_vf.h"
>  #include "xe_step.h"
>  #include "xe_tile_debugfs.h"
> +#include "xe_ttm_vram_mgr.h"
>  #include "xe_vsec.h"
>  #include "xe_wa.h"
>  
> @@ -773,6 +774,9 @@ void xe_debugfs_register(struct xe_device *xe)
>  	if (man)
>  		ttm_resource_manager_create_debugfs(man, root, "stolen_mm");
>  
> +	if (xe->info.platform == XE_CRESCENTISLAND)
> +		xe_ttm_vram_debugfs_init(xe, root);
> +
>  	for_each_tile(tile, xe, tile_id)
>  		xe_tile_debugfs_register(tile);
>  
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index 24d134754265..af9e1fa868d7 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -5,6 +5,7 @@
>   */
>  
>  #include <linux/cgroup_dmem.h>
> +#include <linux/debugfs.h>
>  
>  #include <drm/drm_managed.h>
>  #include <drm/drm_drv.h>
> @@ -874,3 +875,68 @@ int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr)
>  	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base, vram_mgr, mm);
>  }
>  EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
> +
> +static int vram_bad_pages_show(struct seq_file *m, void *unused)
> +{
> +	struct xe_device *xe = m->private;
> +	struct xe_ttm_vram_offline_resource *pos;
> +	struct ttm_resource_manager *man;
> +	struct gpu_buddy_block *block;
> +	struct xe_ttm_vram_mgr *mgr;
> +	struct xe_tile *tile;
> +	u8 id;
> +
> +	man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
> +	if (man)
> +		seq_printf(m, "max_pages: %d\n",
> +			   to_xe_ttm_vram_mgr(man)->max_pages);
> +
> +	for_each_tile(tile, xe, id) {
> +		struct xe_vram_region *vr = tile->mem.vram;
> +
> +		man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0 + id);
> +		if (!man || !vr)
> +			continue;
> +		mgr = to_xe_ttm_vram_mgr(man);
> +
> +		rcu_read_lock();
> +
> +		list_for_each_entry_rcu(pos, &mgr->offlined_pages, offlined_link) {
> +			block = list_first_entry_or_null(&pos->blocks,
> +							 struct gpu_buddy_block, link);
> +			if (!block)
> +				continue;
> +
> +			seq_printf(m, "0x%016llx : 0x%016llx : R\n",
> +				   (gpu_buddy_block_offset(block) + vr->dpa_base) >> PAGE_SHIFT,
> +				   gpu_buddy_block_size(&mgr->mm, block));
> +		}
> +
> +		list_for_each_entry_rcu(pos, &mgr->queued_pages, queued_link) {
> +			u64 pfn, blk_size;
> +
> +			block = list_first_entry_or_null(&pos->blocks,
> +							 struct gpu_buddy_block, link);
> +			if (block) {
> +				pfn = (gpu_buddy_block_offset(block) + vr->dpa_base) >> PAGE_SHIFT;
> +				blk_size = gpu_buddy_block_size(&mgr->mm, block);
> +			} else {
> +				pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> +				blk_size = PAGE_SIZE;
> +			}
> +
> +			seq_printf(m, "0x%016llx : 0x%016llx : %c\n",
> +				   pfn, blk_size, pos->status ? 'F' : 'P');
> +		}
> +
> +		rcu_read_unlock();
> +	}
> +
> +	return 0;
> +}
> +DEFINE_SHOW_ATTRIBUTE(vram_bad_pages);
> +
> +void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root)
> +{
> +	debugfs_create_file("vram_bad_pages", 0444, root, xe, &vram_bad_pages_fops);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> index d5392beff30c..f354c26c4257 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> @@ -9,6 +9,7 @@
>  #include "xe_ttm_vram_mgr_types.h"
>  
>  enum dma_data_direction;
> +struct dentry;
>  struct xe_device;
>  struct xe_tile;
>  struct xe_vram_region;
> @@ -32,6 +33,7 @@ void xe_ttm_vram_get_used(struct ttm_resource_manager *man,
>  			  u64 *used, u64 *used_visible);
>  
>  int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr);
> +void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root);
>  static inline struct xe_ttm_vram_mgr_resource *
>  to_xe_ttm_vram_mgr_resource(struct ttm_resource *res)
>  {
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> index dc97b0ad0e51..efcf3e1d4e80 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> @@ -37,6 +37,8 @@ struct xe_ttm_vram_mgr {
>  	struct mutex lock;
>  	/** @mem_type: The TTM memory type */
>  	u32 mem_type;
> +	/** @max_pages: max pages that can be in offline queue retrieved from FW */
> +	u16 max_pages;
>  };
>  
>  /**
> -- 
> 2.52.0
> 

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

* RE: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well
  2026-08-28  7:39           ` Andi Shyti
@ 2026-08-28 17:29             ` Upadhyay, Tejas
  0 siblings, 0 replies; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-28 17:29 UTC (permalink / raw)
  To: Andi Shyti
  Cc: intel-xe@lists.freedesktop.org, Ghimiray, Himal Prasad,
	Vivi, Rodrigo, Wajdeczko, Michal, Yadav, Arvind



> -----Original Message-----
> From: Andi Shyti <andi.shyti@kernel.org>
> Sent: 28 August 2026 13:09
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org; Ghimiray, Himal Prasad
> <himal.prasad.ghimiray@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> Wajdeczko, Michal <michal.wajdeczko@intel.com>; Yadav, Arvind
> <arvind.yadav@intel.com>
> Subject: Re: [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram
> pages as well
> 
> Hi Tejas,
> 
> > > > >
> > > > > Besides, can we split it in two parts?
> > > >
> > > > Not sure I understand correctly what split mean here, anyhow I
> > > > will add little
> > > elaborative comment here.
> > >
> > > we can have one patch that is adding xe_ttm_bo_purge() to the
> > > library and one removing the if statement. They look independent to
> > > me and both are vaguely hinted in the commit log.
> >
> > Hi Andi,
> >
> > I think for such small patch to split does not look good, rather I will make
> more descriptive commit message to explain what all it does. I hope that is
> fine.
> 
> To me, it's good. There is no limit to how small a patch can be, but there is a
> limitation that patches should contain a single logical change. This patch
> contains two logical changes.

Alirght, let me split the patch in that case.

Thanks,
Tejsa
> 
> Andi

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

* RE: [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute
  2026-08-27 15:00   ` Michal Wajdeczko
@ 2026-08-28 17:48     ` Upadhyay, Tejas
  0 siblings, 0 replies; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-28 17:48 UTC (permalink / raw)
  To: Wajdeczko, Michal, intel-xe@lists.freedesktop.org
  Cc: Ghimiray, Himal Prasad, Vivi, Rodrigo



> -----Original Message-----
> From: Wajdeczko, Michal <michal.wajdeczko@intel.com>
> Sent: 27 August 2026 20:31
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> xe@lists.freedesktop.org
> Cc: Ghimiray, Himal Prasad <himal.prasad.ghimiray@intel.com>; Vivi, Rodrigo
> <rodrigo.vivi@intel.com>
> Subject: Re: [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation
> attribute
> 
> 
> 
> On 8/26/2026 3:51 PM, Tejas Upadhyay wrote:
> > Add a new configfs attribute 'bad_page_reservation' to control how bad
> > VRAM pages are handled:
> >   0 - Logging only (report in dmesg, no offlining)
> >   1 - Offlining (default)
> >
> > The attribute can only be set before binding to the device and
> > defaults to true (offlining enabled). This gives administrators
> > control over whether corrupted VRAM pages detected by hardware (e.g.,
> > ECC errors) are actively offlined or only logged.
> >
> > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > ---
> >  drivers/gpu/drm/xe/xe_configfs.c | 67
> > +++++++++++++++++++++++++++++++-
> drivers/gpu/drm/xe/xe_configfs.h |
> > 2 +
> >  2 files changed, 68 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> > b/drivers/gpu/drm/xe/xe_configfs.c
> > index 052cce962161..80c4c5f66e4c 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.c
> > +++ b/drivers/gpu/drm/xe/xe_configfs.c
> > @@ -61,7 +61,8 @@
> >   *	    ├── survivability_mode
> >   *	    ├── gt_types_allowed
> >   *	    ├── engines_allowed
> > - *	    └── enable_psmi
> > + *          ├── enable_psmi
> > + *          └── bad_page_reservation
> 
> please double check alignment - look for \t
> 
> >   *
> >   * After configuring the attributes as per next section, the device can be
> >   * probed with::
> > @@ -159,6 +160,19 @@
> >   *
> >   * This attribute can only be set before binding to the device.
> >   *
> > + * Bad pages reservation:
> > + * ---------------------
> > + *
> > + * Controls how bad VRAM pages are handled:
> > + *  0 - Logging only (report in dmesg, no offlining)
> > + *  1 - Offlining (default)
> 
> this is bool, so Y/N/y/n will also work

Ya

> 
> > + *
> > + *  Example to disable offlining::
> > + *
> > + *      # echo 0 > /sys/kernel/config/xe/0000:03:00.0/bad_page_reservation
> 
> if this is about VRAM, why attribute name does not say that?
> 
> maybe
> 	"enable_vram_offline"
> or
> 	"disable_vram_offline"
> 
> to benefit from default '0' ?

Will use disable_vram_page_offline

> 
> > + *
> > + * This attribute can only be set before binding to the device.
> 
> shouldn't we say that it is "available only on CRI+" or something?

Its available on CRI only, will mention that here

> 
> > + *
> >   * Context restore BB
> >   * ------------------
> >   *
> > @@ -275,6 +289,7 @@ struct xe_config_group_device {
> >  		bool survivability_mode;
> >  		bool enable_psmi;
> >  		bool enable_multi_queue;
> > +		bool bad_page_reservation;
> >  		struct {
> >  			unsigned int max_vfs;
> >  			bool admin_only_pf;
> > @@ -295,6 +310,7 @@ static const struct xe_config_device device_defaults
> = {
> >  	.survivability_mode = false,
> >  	.enable_psmi = false,
> >  	.enable_multi_queue = true,
> > +	.bad_page_reservation = true,
> >  	.sriov = {
> >  		.max_vfs = XE_DEFAULT_MAX_VFS,
> >  		.admin_only_pf = XE_DEFAULT_ADMIN_ONLY_PF, @@ -616,6
> +632,32 @@
> > static ssize_t enable_multi_queue_store(struct config_item *item, const char
> *pa
> >  	return len;
> >  }
> >
> > +static ssize_t bad_page_reservation_show(struct config_item *item,
> > +char *page) {
> > +	struct xe_config_device *dev = to_xe_config_device(item);
> > +
> > +	return sprintf(page, "%d\n", dev->bad_page_reservation);
> 
> 	%s and str_yes_no() ?> +}

Sure

> > +
> > +static ssize_t bad_page_reservation_store(struct config_item *item,
> > +const char *page, size_t len) {
> > +	struct xe_config_group_device *dev =
> to_xe_config_group_device(item);
> > +	bool val;
> > +	int ret;
> > +
> > +	ret = kstrtobool(page, &val);
> > +	if (ret)
> > +		return ret;
> > +
> > +	guard(mutex)(&dev->lock);
> > +	if (is_bound(dev))
> > +		return -EBUSY;
> > +
> > +	dev->config.bad_page_reservation = val;
> > +
> > +	return len;
> > +}
> > +
> >  static bool wa_bb_read_advance(bool dereference, char **p,
> >  			       const char *append, size_t len,
> >  			       size_t *max_size)
> > @@ -855,6 +897,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
> > CONFIGFS_ATTR(, ctx_restore_post_bb);  CONFIGFS_ATTR(,
> > enable_multi_queue);  CONFIGFS_ATTR(, enable_psmi);
> > +CONFIGFS_ATTR(, bad_page_reservation);
> >  CONFIGFS_ATTR(, engines_allowed);
> >  CONFIGFS_ATTR(, gt_types_allowed);
> >  CONFIGFS_ATTR(, survivability_mode);
> 
> shouldn't you also update xe_config_device_is_visible() to make it CRI+ only?

Ya for CRI only, will add that.

Tejas
> > @@ -864,6 +907,7 @@ static struct configfs_attribute
> *xe_config_device_attrs[] = {
> >  	&attr_ctx_restore_post_bb,
> >  	&attr_enable_multi_queue,
> >  	&attr_enable_psmi,
> > +	&attr_bad_page_reservation,
> >  	&attr_engines_allowed,
> >  	&attr_gt_types_allowed,
> >  	&attr_survivability_mode,
> > @@ -1142,6 +1186,7 @@ static void dump_custom_dev_config(struct
> pci_dev *pdev,
> >  	PRI_CUSTOM_ATTR("%llx", engines_allowed);
> >  	PRI_CUSTOM_ATTR("%d", enable_multi_queue);
> >  	PRI_CUSTOM_ATTR("%d", enable_psmi);
> > +	PRI_CUSTOM_ATTR("%d", bad_page_reservation);
> >  	PRI_CUSTOM_ATTR("%d", survivability_mode);
> >  	PRI_CUSTOM_ATTR("%u", sriov.admin_only_pf);
> >
> > @@ -1290,6 +1335,26 @@ bool
> xe_configfs_get_enable_multi_queue(struct pci_dev *pdev)
> >  	return ret;
> >  }
> >
> > +/**
> > + * xe_configfs_get_bad_page_reservation - get configfs
> > +bad_page_reservation setting
> > + * @pdev: pci device
> > + *
> > + * Return: bad_page_reservation setting in configfs  */ bool
> > +xe_configfs_get_bad_page_reservation(struct pci_dev *pdev) {
> > +	struct xe_config_group_device *dev =
> find_xe_config_group_device(pdev);
> > +	bool ret;
> > +
> > +	if (!dev)
> > +		return device_defaults.bad_page_reservation;
> > +
> > +	ret = dev->config.bad_page_reservation;
> > +	config_group_put(&dev->group);
> > +
> > +	return ret;
> > +}
> > +
> >  /**
> >   * xe_configfs_get_ctx_restore_mid_bb - get configfs ctx_restore_mid_bb
> setting
> >   * @pdev: pci device
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> > b/drivers/gpu/drm/xe/xe_configfs.h
> > index 4fbbeafba473..7405cc5f3207 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.h
> > +++ b/drivers/gpu/drm/xe/xe_configfs.h
> > @@ -24,6 +24,7 @@ bool xe_configfs_media_gt_allowed(struct pci_dev
> > *pdev);
> >  u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);  bool
> > xe_configfs_get_psmi_enabled(struct pci_dev *pdev);  bool
> > xe_configfs_get_enable_multi_queue(struct pci_dev *pdev);
> > +bool xe_configfs_get_bad_page_reservation(struct pci_dev *pdev);
> >  u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev,
> >  				       enum xe_engine_class class,
> >  				       const u32 **cs);
> > @@ -44,6 +45,7 @@ static inline bool
> > xe_configfs_media_gt_allowed(struct pci_dev *pdev) { return t  static
> > inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) {
> > return U64_MAX; }  static inline bool
> > xe_configfs_get_psmi_enabled(struct pci_dev *pdev) { return false; }
> > static inline bool xe_configfs_get_enable_multi_queue(struct pci_dev
> > *pdev) { return true; }
> > +static inline bool xe_configfs_get_bad_page_reservation(struct
> > +pci_dev *pdev) { return true; }
> >  static inline u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev,
> >  						     enum xe_engine_class
> class,
> >  						     const u32 **cs) { return 0; }


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

* RE: [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs
  2026-08-27 15:16   ` Michal Wajdeczko
@ 2026-08-28 19:06     ` Upadhyay, Tejas
  0 siblings, 0 replies; 54+ messages in thread
From: Upadhyay, Tejas @ 2026-08-28 19:06 UTC (permalink / raw)
  To: Wajdeczko, Michal, intel-xe@lists.freedesktop.org,
	Iddamsetty, Aravind
  Cc: Ghimiray, Himal Prasad, Vivi, Rodrigo



> -----Original Message-----
> From: Wajdeczko, Michal <michal.wajdeczko@intel.com>
> Sent: 27 August 2026 20:47
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> xe@lists.freedesktop.org
> Cc: Ghimiray, Himal Prasad <himal.prasad.ghimiray@intel.com>; Vivi, Rodrigo
> <rodrigo.vivi@intel.com>
> Subject: Re: [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs
> 
> 
> 
> On 8/26/2026 3:51 PM, Tejas Upadhyay wrote:
> > Add a debugfs file "vram_bad_pages" that shows offlined and queued
> > VRAM pages across all tiles. Each entry displays the page frame
> > number, GPU page size, and status flag (R=reserved, P=pending, F=failed).
> >
> > example,
> > cat /sys/kernel/debug/dri/0/vram_bad_pages
> >
> > max_pages: 10000
> > 0x0000000000000000 : 0x0000000000001000 : R
> > 0x0000000000001234 : 0x0000000000001000 : P
> > 0x0000000000080000 : 0x0000000000001000 : R   ← tile 1 addr (includes
> tile offset)
> >
> > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > ---
> >  drivers/gpu/drm/xe/xe_debugfs.c            |  4 ++
> >  drivers/gpu/drm/xe/xe_ttm_vram_mgr.c       | 66
> ++++++++++++++++++++++
> >  drivers/gpu/drm/xe/xe_ttm_vram_mgr.h       |  2 +
> >  drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h |  2 +
> >  4 files changed, 74 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_debugfs.c
> > b/drivers/gpu/drm/xe/xe_debugfs.c index 28135f84e286..e19eafffbb08
> > 100644
> > --- a/drivers/gpu/drm/xe/xe_debugfs.c
> > +++ b/drivers/gpu/drm/xe/xe_debugfs.c
> > @@ -32,6 +32,7 @@
> >  #include "xe_sriov_vf.h"
> >  #include "xe_step.h"
> >  #include "xe_tile_debugfs.h"
> > +#include "xe_ttm_vram_mgr.h"
> >  #include "xe_vsec.h"
> >  #include "xe_wa.h"
> >
> > @@ -773,6 +774,9 @@ void xe_debugfs_register(struct xe_device *xe)
> >  	if (man)
> >  		ttm_resource_manager_create_debugfs(man, root,
> "stolen_mm");
> >
> > +	if (xe->info.platform == XE_CRESCENTISLAND)
> 
> maybe better to move that check to xe_ttm_vram_debugfs_init() ?

I can do that. May be you are referring clean view in parent function and checks in child func.

> 
> > +		xe_ttm_vram_debugfs_init(xe, root);
> > +
> >  	for_each_tile(tile, xe, tile_id)
> >  		xe_tile_debugfs_register(tile);
> >
> > diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > index 24d134754265..af9e1fa868d7 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > @@ -5,6 +5,7 @@
> >   */
> >
> >  #include <linux/cgroup_dmem.h>
> > +#include <linux/debugfs.h>
> >
> >  #include <drm/drm_managed.h>
> >  #include <drm/drm_drv.h>
> > @@ -874,3 +875,68 @@ int xe_ttm_vram_handle_addr_fault(struct
> xe_device *xe, u64 addr)
> >  	return xe_ttm_vram_reserve_page_at_addr(xe, addr - vr->dpa_base,
> > vram_mgr, mm);  }  EXPORT_SYMBOL(xe_ttm_vram_handle_addr_fault);
> > +
> > +static int vram_bad_pages_show(struct seq_file *m, void *unused) {
> > +	struct xe_device *xe = m->private;
> > +	struct xe_ttm_vram_offline_resource *pos;
> > +	struct ttm_resource_manager *man;
> > +	struct gpu_buddy_block *block;
> > +	struct xe_ttm_vram_mgr *mgr;
> > +	struct xe_tile *tile;
> > +	u8 id;
> > +
> > +	man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
> > +	if (man)
> > +		seq_printf(m, "max_pages: %d\n",
> 
> is this the same value for PL_VRAM1, VRAM2 .. ?

Yes it will be same. Also this value will eventually come from RAS post integration with their code. RAS code is in review still, once it will come, RAS will give us FW read value. This is just place holder I can say. During integration with RAS I will refactor max_pages.

> 
> > +			   to_xe_ttm_vram_mgr(man)->max_pages);
> > +
> > +	for_each_tile(tile, xe, id) {
> 
> as we loop over each tile, shouldn't we add this "bad_pages" debugfs entry
> under separate tileN/ folder ?

No there is no such recommendation from arch and there is no real need for users to know address belongs to which tile. @Iddamsetty, Aravind any comments?

Tejas 
> > +		struct xe_vram_region *vr = tile->mem.vram;
> > +
> > +		man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0 + id);
> > +		if (!man || !vr)
> > +			continue;
> > +		mgr = to_xe_ttm_vram_mgr(man);
> > +
> > +		rcu_read_lock();
> > +
> > +		list_for_each_entry_rcu(pos, &mgr->offlined_pages,
> offlined_link) {
> > +			block = list_first_entry_or_null(&pos->blocks,
> > +							 struct
> gpu_buddy_block, link);
> > +			if (!block)
> > +				continue;
> > +
> > +			seq_printf(m, "0x%016llx : 0x%016llx : R\n",
> > +				   (gpu_buddy_block_offset(block) + vr-
> >dpa_base) >> PAGE_SHIFT,
> > +				   gpu_buddy_block_size(&mgr->mm, block));
> > +		}
> > +
> > +		list_for_each_entry_rcu(pos, &mgr->queued_pages,
> queued_link) {
> > +			u64 pfn, blk_size;
> > +
> > +			block = list_first_entry_or_null(&pos->blocks,
> > +							 struct
> gpu_buddy_block, link);
> > +			if (block) {
> > +				pfn = (gpu_buddy_block_offset(block) + vr-
> >dpa_base) >> PAGE_SHIFT;
> > +				blk_size = gpu_buddy_block_size(&mgr->mm,
> block);
> > +			} else {
> > +				pfn = (pos->addr + vr->dpa_base) >>
> PAGE_SHIFT;
> > +				blk_size = PAGE_SIZE;
> > +			}
> > +
> > +			seq_printf(m, "0x%016llx : 0x%016llx : %c\n",
> > +				   pfn, blk_size, pos->status ? 'F' : 'P');
> > +		}
> > +
> > +		rcu_read_unlock();
> > +	}
> > +
> > +	return 0;
> > +}
> > +DEFINE_SHOW_ATTRIBUTE(vram_bad_pages);
> > +
> > +void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry
> > +*root) {
> > +	debugfs_create_file("vram_bad_pages", 0444, root, xe,
> > +&vram_bad_pages_fops); }
> > diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> > b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> > index d5392beff30c..f354c26c4257 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
> > @@ -9,6 +9,7 @@
> >  #include "xe_ttm_vram_mgr_types.h"
> >
> >  enum dma_data_direction;
> > +struct dentry;
> >  struct xe_device;
> >  struct xe_tile;
> >  struct xe_vram_region;
> > @@ -32,6 +33,7 @@ void xe_ttm_vram_get_used(struct
> ttm_resource_manager *man,
> >  			  u64 *used, u64 *used_visible);
> >
> >  int xe_ttm_vram_handle_addr_fault(struct xe_device *xe, u64 addr);
> > +void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry
> > +*root);
> >  static inline struct xe_ttm_vram_mgr_resource *
> > to_xe_ttm_vram_mgr_resource(struct ttm_resource *res)  { diff --git
> > a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> > b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> > index dc97b0ad0e51..efcf3e1d4e80 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
> > @@ -37,6 +37,8 @@ struct xe_ttm_vram_mgr {
> >  	struct mutex lock;
> >  	/** @mem_type: The TTM memory type */
> >  	u32 mem_type;
> > +	/** @max_pages: max pages that can be in offline queue retrieved
> from FW */
> > +	u16 max_pages;
> >  };
> >
> >  /**


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

end of thread, other threads:[~2026-08-28 19:06 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-26 13:51 [PATCH V18 00/14] Add memory page offlining support Tejas Upadhyay
2026-08-26 13:51 ` [PATCH V18 01/14] drm/xe: Link VRAM object with gpu buddy Tejas Upadhyay
2026-08-26 22:31   ` Andi Shyti
2026-08-26 13:51 ` [PATCH V18 02/14] drm/xe: Link LRC BO and its execution Queue Tejas Upadhyay
2026-08-26 22:34   ` Andi Shyti
2026-08-26 13:51 ` [PATCH V18 03/14] drm/xe: Extend BO purge to handle vram pages as well Tejas Upadhyay
2026-08-26 14:07   ` sashiko-bot
2026-08-26 22:42   ` Andi Shyti
2026-08-27  6:17     ` Upadhyay, Tejas
2026-08-27 14:40       ` Andi Shyti
2026-08-27 14:48         ` Upadhyay, Tejas
2026-08-28  5:25         ` Upadhyay, Tejas
2026-08-28  7:39           ` Andi Shyti
2026-08-28 17:29             ` Upadhyay, Tejas
2026-08-26 13:51 ` [PATCH V18 04/14] drm/xe/bo: Make xe_bo_is_user() public Tejas Upadhyay
2026-08-26 22:44   ` Andi Shyti
2026-08-26 13:51 ` [PATCH V18 05/14] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
2026-08-26 14:12   ` sashiko-bot
2026-08-27  6:08   ` Ghimiray, Himal Prasad
2026-08-27  8:27     ` Upadhyay, Tejas
2026-08-26 13:51 ` [PATCH V18 06/14] drm/xe/vram: Extract buddy alloc and free helpers Tejas Upadhyay
2026-08-26 22:50   ` Andi Shyti
2026-08-26 13:51 ` [PATCH V18 07/14] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
2026-08-26 23:09   ` Andi Shyti
2026-08-27  6:19   ` Ghimiray, Himal Prasad
2026-08-26 13:51 ` [PATCH V18 08/14] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
2026-08-26 14:05   ` sashiko-bot
2026-08-26 13:51 ` [PATCH V18 09/14] drm/xe/configfs: Add bad_page_reservation attribute Tejas Upadhyay
2026-08-27  6:42   ` Ghimiray, Himal Prasad
2026-08-27 15:00   ` Michal Wajdeczko
2026-08-28 17:48     ` Upadhyay, Tejas
2026-08-26 13:51 ` [PATCH V18 10/14] drm/xe/ras: Cache bad_page_reservation policy at init Tejas Upadhyay
2026-08-26 14:11   ` sashiko-bot
2026-08-27  6:45   ` Ghimiray, Himal Prasad
2026-08-26 13:51 ` [PATCH V18 11/14] drm/xe/vram: Check bad_page_reservation policy in fault handler Tejas Upadhyay
2026-08-26 14:08   ` sashiko-bot
2026-08-27  6:46   ` Ghimiray, Himal Prasad
2026-08-27 15:04   ` Michal Wajdeczko
2026-08-26 13:51 ` [PATCH V18 12/14] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
2026-08-26 14:13   ` sashiko-bot
2026-08-27 15:16   ` Michal Wajdeczko
2026-08-28 19:06     ` Upadhyay, Tejas
2026-08-28 15:04   ` Rodrigo Vivi
2026-08-26 13:51 ` [PATCH V18 13/14] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
2026-08-26 14:20   ` sashiko-bot
2026-08-27 18:26   ` Andi Shyti
2026-08-28  5:31     ` Upadhyay, Tejas
2026-08-26 13:51 ` [PATCH V18 14/14] drm/xe: Add fault-inject based VRAM page offline injection Tejas Upadhyay
2026-08-27  7:10   ` Ghimiray, Himal Prasad
2026-08-27  8:23     ` Upadhyay, Tejas
2026-08-26 14:37 ` ✗ CI.checkpatch: warning for Add memory page offlining support (rev21) Patchwork
2026-08-26 14:39 ` ✓ CI.KUnit: success " Patchwork
2026-08-26 15:21 ` ✓ Xe.CI.BAT: " Patchwork
2026-08-26 19:01 ` ✓ 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