* [PATCH V20 01/15] drm/xe: Link VRAM object with gpu buddy
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 02/15] drm/xe: Link LRC BO and its execution queue with safe lifetime rules Tejas Upadhyay
` (17 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Andi Shyti
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: Andi Shyti <andi.shyti@linux.intel.com>
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] 38+ messages in thread* [PATCH V20 02/15] drm/xe: Link LRC BO and its execution queue with safe lifetime rules
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 01/15] drm/xe: Link VRAM object with gpu buddy Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 03/15] drm/xe: Export xe_ttm_bo_purge() Tejas Upadhyay
` (16 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Andi Shyti
Introduce an execution queue back-pointer (`q`) within `struct xe_bo`, primarily
for Logical Ring Context (LRC) Buffer Objects. This back-pointer allows the
driver to identify and execute targeted corrective actions on a specific queue
if its associated LRC BO encounters errors like memory corruption or eviction.
Because this back-pointer takes no reference on its target execution queue, strict
lifetime and serialization rules are implemented to prevent concurrent readers
from encountering use-after-free or dangling pointer bugs:
- Encapsulate tracking logic inside xe_exec_queue_set_lrc_bo_backpointer() and
xe_exec_queue_clear_lrc_bo_backpointer().
- Explicitly wrap all back-pointer writes and clears under the BO's dma_resv lock
via xe_bo_lock(). Readers must hold this same lock across both the pointer read
and its subsequent xe_exec_queue_get_unless_zero() call to guarantee serialization
against teardown.
- Defer publishing the back-pointer until the very end of xe_exec_queue_create().
This ensures that early initialization failure paths (which bypass the kref
mechanism and immediately free the queue structure) never leak a transient pointer
to concurrent readers.
- Clear the back-pointer at the absolute top of __xe_exec_queue_fini(). This strips
the pointer before q->ops->fini() destroys the hardware backend, ensuring that
any reader holding the BO lock either observes a fully functional queue or NULL.
For multi-queue engines, secondary LRC BOs safely point to the primary queue, which
is guaranteed to outlive the teardown pass due to active references held by its
secondaries.
V4 (MattB):
- Add LRC BO's execution queue safe lifetime rules
V3 (Sashiko):
- Use 8-byte placeholder structure compatibility for non-LRC BO cases.
- Wrap assignments and clears securely under dma_resv locks.
V2 (Matt B):
- Add native support handling multi-queue configuration tracking.
Co-authored-by: Copilot
Reviewed-by: Andi Shyti <andi.shyti@linux.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_types.h | 8 ++++
drivers/gpu/drm/xe/xe_exec_queue.c | 64 ++++++++++++++++++++++++++++++
2 files changed, 72 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h
index e45f24301050..0eb93052c1d5 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,13 @@ 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.
+ * Protected by the BO dma_resv: readers must hold it across both the
+ * read and xe_exec_queue_get_unless_zero(). The BO holds no reference
+ * on the queue.
+ */
+ 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..f3ea4807ac33 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -322,10 +322,66 @@ struct xe_lrc *xe_exec_queue_lrc(struct xe_exec_queue *q)
return q->lrc[0];
}
+/*
+ * Publish the queue back-pointer in the LRC BOs.
+ *
+ * The BO holds no reference on the queue; the queue owns the LRCs, and
+ * therefore the BOs, instead. The back-pointer is made safe by two rules:
+ *
+ * - It is published only once the queue is fully constructed and can no
+ * longer be destroyed by an error path that bypasses the kref (see
+ * xe_exec_queue_create()), so a reader that successfully takes a
+ * reference can never be handed a queue that is freed without going
+ * through xe_exec_queue_destroy().
+ *
+ * - It is written and cleared under the BO dma_resv. Readers must hold
+ * the same lock across both the read and
+ * xe_exec_queue_get_unless_zero(), which serializes them against
+ * xe_exec_queue_clear_lrc_bo_backpointer() below.
+ *
+ * For a multi-queue group the LRC BOs point at the primary queue, which is
+ * kept alive by the reference every secondary holds on it.
+ */
+static void xe_exec_queue_set_lrc_bo_backpointer(struct xe_exec_queue *q)
+{
+ struct xe_exec_queue *primary = xe_exec_queue_multi_queue_primary(q);
+ int i;
+
+ for (i = 0; i < q->width; ++i) {
+ struct xe_bo *bo = q->lrc[i]->bo;
+
+ xe_bo_lock(bo, false);
+ bo->q = primary;
+ xe_bo_unlock(bo);
+ }
+}
+
+/*
+ * Drop the queue back-pointer before anything belonging to the queue is
+ * torn down. This must happen before q->ops->fini(), otherwise a reader
+ * could take a reference and then operate on an already destroyed backend.
+ */
+static void xe_exec_queue_clear_lrc_bo_backpointer(struct xe_exec_queue *q)
+{
+ int i;
+
+ for (i = 0; i < q->width; ++i) {
+ struct xe_bo *bo = q->lrc[i] ? q->lrc[i]->bo : NULL;
+
+ if (!bo)
+ continue;
+
+ xe_bo_lock(bo, false);
+ bo->q = NULL;
+ xe_bo_unlock(bo);
+ }
+}
+
static void __xe_exec_queue_fini(struct xe_exec_queue *q)
{
int i;
+ xe_exec_queue_clear_lrc_bo_backpointer(q);
q->ops->fini(q);
for (i = 0; i < q->width; ++i)
@@ -450,6 +506,14 @@ struct xe_exec_queue *xe_exec_queue_create(struct xe_device *xe, struct xe_vm *v
goto err_post_init;
}
+ /*
+ * Publish the LRC BO back-pointers last: past this point the queue can
+ * only be destroyed through xe_exec_queue_destroy(), so a concurrent
+ * reader that takes a reference via bo->q cannot race with the
+ * kref-bypassing error paths below.
+ */
+ xe_exec_queue_set_lrc_bo_backpointer(q);
+
return q;
err_post_init:
--
2.52.0
^ permalink raw reply related [flat|nested] 38+ messages in thread* [PATCH V20 03/15] drm/xe: Export xe_ttm_bo_purge()
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 01/15] drm/xe: Link VRAM object with gpu buddy Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 02/15] drm/xe: Link LRC BO and its execution queue with safe lifetime rules Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 04/15] drm/xe: Handle NULL resource and allow purging of VRAM pages Tejas Upadhyay
` (15 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Andi Shyti, Arvind Yadav
Remove the static qualifier from xe_ttm_bo_purge() and add its
prototype to xe_bo.h. This allows the function to be called
from other parts of the driver outside of xe_bo.c, specifically
needed for the memory page offline feature.
Cc: Andi Shyti <andi.shyti@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
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 | 2 +-
drivers/gpu/drm/xe/xe_bo.h | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index dde309821237..8f93e09e51bb 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 = {};
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] 38+ messages in thread* [PATCH V20 04/15] drm/xe: Handle NULL resource and allow purging of VRAM pages
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (2 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 03/15] drm/xe: Export xe_ttm_bo_purge() Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 15:28 ` sashiko-bot
2026-09-02 14:53 ` [PATCH V20 05/15] drm/xe/bo: Make xe_bo_is_user() public Tejas Upadhyay
` (14 subsequent siblings)
18 siblings, 1 reply; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Andi Shyti
Add NULL checks for the buffer object's resource pointer in
xe_bo_is_vram() and xe_bo_is_stolen() to prevent potential NULL
pointer dereferences when checking memory location during page
offlining.
Additionally, remove the `!ttm_bo->ttm` check from
xe_ttm_bo_purge(). This restriction is stripped away to
explicitly allow the driver to purge VRAM pages during the
memory page offline sequence.
v2(Sashiko):
- Split export and this patch also Check NULL res in
xe_bo_is_vram() and xe_bo_is_stolen()
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Cc: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
drivers/gpu/drm/xe/xe_bo.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 8f93e09e51bb..d30a8411d2a3 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -104,13 +104,16 @@ static bool resource_is_vram(struct ttm_resource *res)
bool xe_bo_is_vram(struct xe_bo *bo)
{
- return resource_is_vram(bo->ttm.resource) ||
- resource_is_stolen_vram(xe_bo_device(bo), bo->ttm.resource);
+ struct ttm_resource *res = bo->ttm.resource;
+
+ return res && (resource_is_vram(res) || resource_is_stolen_vram(xe_bo_device(bo), res));
}
bool xe_bo_is_stolen(struct xe_bo *bo)
{
- return bo->ttm.resource->mem_type == XE_PL_STOLEN;
+ struct ttm_resource *res = bo->ttm.resource;
+
+ return res && res->mem_type == XE_PL_STOLEN;
}
/**
@@ -929,9 +932,6 @@ int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *
xe_bo_assert_held(bo);
- if (!ttm_bo->ttm)
- return 0;
-
if (!xe_bo_madv_is_dontneed(bo))
return 0;
--
2.52.0
^ permalink raw reply related [flat|nested] 38+ messages in thread* Re: [PATCH V20 04/15] drm/xe: Handle NULL resource and allow purging of VRAM pages
2026-09-02 14:53 ` [PATCH V20 04/15] drm/xe: Handle NULL resource and allow purging of VRAM pages Tejas Upadhyay
@ 2026-09-02 15:28 ` sashiko-bot
0 siblings, 0 replies; 38+ messages in thread
From: sashiko-bot @ 2026-09-02 15:28 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:
- [High] Null pointer dereference in `xe_vm_snapshot_capture` when capturing a VM containing a purged BO.
--
commit f809a0c4f30d1158f4546c8b29fd7d07fc7912ae
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
drm/xe: Handle NULL resource and allow purging of VRAM pages
This patch adds NULL checks for the buffer object's resource pointer in
xe_bo_is_vram() and xe_bo_is_stolen() to prevent potential NULL pointer
dereferences. It also removes the restriction in xe_ttm_bo_purge() to
explicitly allow the driver to purge VRAM pages.
> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index 8f93e09e51bb8..d30a8411d2a33 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
[ ... ]
> @@ -929,9 +932,6 @@ int xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *
>
> xe_bo_assert_held(bo);
>
> - if (!ttm_bo->ttm)
> - return 0;
> -
[Severity: High]
This is a pre-existing issue, but by removing this check to allow VRAM pages
to be purged, does it expose a NULL pointer dereference in
xe_vm_snapshot_capture()?
If a BO mapped in a VM with the XE_VMA_DUMPABLE flag is purged (e.g., via
VRAM page offlining or memory pressure after being marked DONTNEED), its
backing store is freed and bo->ttm.resource is set to NULL.
If a GPU hang subsequently triggers a devcoredump, xe_vm_snapshot_capture()
iterates over the VMAs and unconditionally dereferences bo->ttm.resource
without holding the BO's dma-resv lock or checking for NULL:
drivers/gpu/drm/xe/xe_vm.c:xe_vm_snapshot_capture() {
...
if (bo) {
snap->snap[i].cpu_caching = bo->cpu_caching;
snap->snap[i].bo = xe_bo_get(bo);
snap->snap[i].bo_ofs = xe_vma_bo_offset(vma);
switch (bo->ttm.resource->mem_type) {
...
}
Could this cause a kernel panic if a local user marks a dumpable BO as
DONTNEED, waits for it to be purged, and then intentionally hangs the GPU?
> if (!xe_bo_madv_is_dontneed(bo))
> return 0;
>
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=4
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH V20 05/15] drm/xe/bo: Make xe_bo_is_user() public
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (3 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 04/15] drm/xe: Handle NULL resource and allow purging of VRAM pages Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 06/15] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
` (13 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Andi Shyti
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: Andi Shyti <andi.shyti@linux.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 | 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 d30a8411d2a3..c255327669da 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -161,7 +161,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] 38+ messages in thread* [PATCH V20 06/15] drm/xe: Guard teardown paths against purged BOs
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (4 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 05/15] drm/xe/bo: Make xe_bo_is_user() public Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 15:57 ` sashiko-bot
2026-09-02 14:53 ` [PATCH V20 07/15] drm/xe/vram: Extract buddy allocation and free helpers Tejas Upadhyay
` (12 subsequent siblings)
18 siblings, 1 reply; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe; +Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
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
v4(Sashiko):
- Move bo purge check in xe_bo_unpin() to handle all instances
v3(Sashiko):
- Remove dma_resv is already held
v2(Himal):
- take dma_resv lock before calling xe_bo_is_purged()
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 | 3 +++
drivers/gpu/drm/xe/xe_dma_buf.c | 3 +++
drivers/gpu/drm/xe/xe_exec_queue.c | 8 ++++++--
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index c255327669da..b162753cebb7 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -3267,6 +3267,9 @@ void xe_bo_unpin(struct xe_bo *bo)
struct ttm_place *place = &bo->placements[0];
struct xe_device *xe = xe_bo_device(bo);
+ if (xe_bo_is_purged(bo))
+ return;
+
xe_assert(xe, !bo->ttm.base.import_attach);
xe_assert(xe, xe_bo_is_pinned(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 f3ea4807ac33..e63559a2f582 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -1630,8 +1630,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);
}
--
2.52.0
^ permalink raw reply related [flat|nested] 38+ messages in thread* Re: [PATCH V20 06/15] drm/xe: Guard teardown paths against purged BOs
2026-09-02 14:53 ` [PATCH V20 06/15] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
@ 2026-09-02 15:57 ` sashiko-bot
2026-09-02 17:52 ` Upadhyay, Tejas
0 siblings, 1 reply; 38+ messages in thread
From: sashiko-bot @ 2026-09-02 15:57 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: intel-xe
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] xe_bo_unpin_external() is missing the xe_bo_is_purged() guard, which will cause a crash when unpinning purged DMA-buf exports.
- [High] xe_dma_buf_begin_cpu_access() fails to check if the BO is purged.
--
commit 58df7bf49c93c1c7134f73fd8224de6fa0f907f3
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
Subject: drm/xe: Guard teardown paths against purged BOs
This commit adds xe_bo_is_purged guards to various teardown and mapping
paths in the xe driver. It prevents unpinning or mapping a buffer object
that has already been purged by VRAM page offlining.
> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index c255327669da5..b162753cebb70 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
> @@ -3267,6 +3267,9 @@ void xe_bo_unpin(struct xe_bo *bo)
> struct ttm_place *place = &bo->placements[0];
> struct xe_device *xe = xe_bo_device(bo);
>
> + if (xe_bo_is_purged(bo))
> + return;
> +
[Severity: High]
Does xe_bo_unpin_external also need a check for purged BOs?
When a DMA-buf exported BO is purged, closing the DMA-buf file descriptor
from userspace will call xe_dma_buf_unpin, which calls xe_bo_unpin_external:
drivers/gpu/drm/xe/xe_dma_buf.c:xe_dma_buf_unpin() {
...
xe_bo_unpin_external(bo);
}
Because xe_bo_unpin_external lacks the xe_bo_is_purged check, it will
attempt to unpin an already-unpinned BO. This leads to a pin_count underflow
and fails the assertion:
drivers/gpu/drm/xe/xe_bo.c:xe_bo_unpin_external() {
...
xe_assert(xe, !bo->vm);
xe_assert(xe, xe_bo_is_pinned(bo));
...
}
> xe_assert(xe, !bo->ttm.base.import_attach);
> xe_assert(xe, xe_bo_is_pinned(bo));
>
> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c
> index bf0728838ead5..5d9f1cd24b7f3 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);
> +
[Severity: High]
Does xe_dma_buf_begin_cpu_access need a similar guard against purged BOs?
If a DMA-buf exported BO is purged, and userspace invokes the
DMA_BUF_IOCTL_SYNC ioctl to begin CPU access, xe_dma_buf_begin_cpu_access
will call xe_bo_migrate:
drivers/gpu/drm/xe/xe_dma_buf.c:xe_dma_buf_begin_cpu_access() {
...
xe_validation_guard(...) {
ret = drm_exec_lock_obj(&exec, &bo->ttm.base);
...
ret = xe_bo_migrate(bo, XE_PL_TT, NULL, &exec);
...
}
Without an xe_bo_is_purged check before migrating, xe_bo_migrate will try
to migrate a destroyed buffer object. This can cause a NULL pointer
dereference since bo->ttm.resource->mem_type can be NULL for purged BOs,
or it will silently migrate the empty backing store to XE_PL_TT, providing
userspace with garbage memory.
> if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
> return ERR_PTR(-EOPNOTSUPP);
>
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=6
^ permalink raw reply [flat|nested] 38+ messages in thread* RE: [PATCH V20 06/15] drm/xe: Guard teardown paths against purged BOs
2026-09-02 15:57 ` sashiko-bot
@ 2026-09-02 17:52 ` Upadhyay, Tejas
0 siblings, 0 replies; 38+ messages in thread
From: Upadhyay, Tejas @ 2026-09-02 17:52 UTC (permalink / raw)
To: sashiko-reviews@lists.linux.dev; +Cc: intel-xe@lists.freedesktop.org
> -----Original Message-----
> From: sashiko-bot@kernel.org <sashiko-bot@kernel.org>
> Sent: 02 September 2026 21:28
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org
> Subject: Re: [PATCH V20 06/15] drm/xe: Guard teardown paths against
> purged BOs
>
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s)
> to consider:
> - [High] xe_bo_unpin_external() is missing the xe_bo_is_purged() guard,
> which will cause a crash when unpinning purged DMA-buf exports.
> - [High] xe_dma_buf_begin_cpu_access() fails to check if the BO is purged.
> --
>
> commit 58df7bf49c93c1c7134f73fd8224de6fa0f907f3
> Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
> Subject: drm/xe: Guard teardown paths against purged BOs
>
> This commit adds xe_bo_is_purged guards to various teardown and mapping
> paths in the xe driver. It prevents unpinning or mapping a buffer object that
> has already been purged by VRAM page offlining.
>
> > diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> > index c255327669da5..b162753cebb70 100644
> > --- a/drivers/gpu/drm/xe/xe_bo.c
> > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > @@ -3267,6 +3267,9 @@ void xe_bo_unpin(struct xe_bo *bo)
> > struct ttm_place *place = &bo->placements[0];
> > struct xe_device *xe = xe_bo_device(bo);
> >
> > + if (xe_bo_is_purged(bo))
> > + return;
> > +
>
> [Severity: High]
> Does xe_bo_unpin_external also need a check for purged BOs?
>
> When a DMA-buf exported BO is purged, closing the DMA-buf file descriptor
> from userspace will call xe_dma_buf_unpin, which calls xe_bo_unpin_external:
>
> drivers/gpu/drm/xe/xe_dma_buf.c:xe_dma_buf_unpin() {
> ...
> xe_bo_unpin_external(bo);
> }
>
> Because xe_bo_unpin_external lacks the xe_bo_is_purged check, it will
> attempt to unpin an already-unpinned BO. This leads to a pin_count
> underflow and fails the assertion:
>
> drivers/gpu/drm/xe/xe_bo.c:xe_bo_unpin_external() {
> ...
> xe_assert(xe, !bo->vm);
> xe_assert(xe, xe_bo_is_pinned(bo));
> ...
> }
>
> > xe_assert(xe, !bo->ttm.base.import_attach);
> > xe_assert(xe, xe_bo_is_pinned(bo));
Exported Bos are run though SBR not purged.
> >
> > diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
> > b/drivers/gpu/drm/xe/xe_dma_buf.c index
> bf0728838ead5..5d9f1cd24b7f3
> > 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);
> > +
>
> [Severity: High]
> Does xe_dma_buf_begin_cpu_access need a similar guard against purged
> BOs?
>
> If a DMA-buf exported BO is purged, and userspace invokes the
> DMA_BUF_IOCTL_SYNC ioctl to begin CPU access,
> xe_dma_buf_begin_cpu_access will call xe_bo_migrate:
>
> drivers/gpu/drm/xe/xe_dma_buf.c:xe_dma_buf_begin_cpu_access() {
> ...
> xe_validation_guard(...) {
> ret = drm_exec_lock_obj(&exec, &bo->ttm.base);
> ...
> ret = xe_bo_migrate(bo, XE_PL_TT, NULL, &exec);
> ...
> }
>
> Without an xe_bo_is_purged check before migrating, xe_bo_migrate will try to
> migrate a destroyed buffer object. This can cause a NULL pointer dereference
> since bo->ttm.resource->mem_type can be NULL for purged BOs, or it will
> silently migrate the empty backing store to XE_PL_TT, providing userspace
> with garbage memory.
Exported Bos are run though SBR not purged.
Tejas
>
> > if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
> > return ERR_PTR(-EOPNOTSUPP);
> >
>
> [ ... ]
>
> --
> Sashiko AI review ·
> https://sashiko.dev/#/patchset/20260902145343.465686-17-
> tejas.upadhyay@intel.com?part=6
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH V20 07/15] drm/xe/vram: Extract buddy allocation and free helpers
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (5 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 06/15] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 08/15] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
` (11 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Andi Shyti
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 new helpers consolidate block allocation/deallocation with
visible-size tracking. This modularization makes the logic reusable by
the upcoming VRAM page offlining reservation path.
This update includes a functional change: block->private now tracks the
owning ttm_resource instead of the tbo. Tracking the resource avoids
stale pointer bugs when TTM hands resources to a ghost object during
accelerated moves or pipelined gutting, ensuring the cached pointer
shares the exact lifetime of the blocks.
v2 (Matt B):
- Pass and store ttm_resource pointer rather than tbo to avoid stale
BO backpointers.
Reviewed-by: Andi Shyti <andi.shyti@linux.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_ttm_vram_mgr.c | 90 ++++++++++++++++++----------
1 file changed, 59 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..a5116dc05166 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -49,6 +49,48 @@ 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,
+ struct ttm_resource *res, 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;
+
+ /*
+ * Track the owning resource, never the owning BO. A BO backpointer
+ * cached here goes stale the moment TTM hands the resource to a ghost
+ * object (ttm_buffer_object_transfer()), which happens on every
+ * accelerated move and on pipelined gutting. The resource, in
+ * contrast, has exactly the same lifetime as these blocks and TTM
+ * keeps &ttm_resource.bo pointing at the current owner for us.
+ */
+ list_for_each_entry(block, blocks, link)
+ block->private = res;
+
+ 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 +99,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 +159,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,
+ &vres->base, &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 +196,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] 38+ messages in thread* [PATCH V20 08/15] drm/xe/vram: Add page offline data structures and lifecycle
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (6 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 07/15] drm/xe/vram: Extract buddy allocation and free helpers Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
` (10 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Andi Shyti
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
Reviewed-by: Andi Shyti <andi.shyti@linux.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_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 a5116dc05166..d97739a84a2d 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -346,12 +346,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;
@@ -378,6 +401,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] 38+ messages in thread* [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault handler
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (7 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 08/15] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 16:25 ` sashiko-bot
2026-09-02 14:53 ` [PATCH V20 10/15] drm/xe/configfs: Add disable_vram_page_offline attribute Tejas Upadhyay
` (9 subsequent siblings)
18 siblings, 1 reply; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe; +Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
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 corresponding
VRAM region. Checks if the address falls within usable space,
or infrastructure zones (CCS, GSM, DSM) where it returns NULL
to flag a reset path. If the target address is outside any
known region returns ERR_PTR(-EOPNOTSUPP)
- 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.
v14(Sashiko/MattB):
- Retry queued pages during xe_ttm_vram_mgr_del()
- Move all changes to find owner of bo to its API
v13(Himal):
- Remove redundant code
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
Co-authored-by: Copilot
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 | 330 +++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_ttm_vram_mgr.h | 1 +
2 files changed, 331 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index d97739a84a2d..0ab92bc3c699 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"
@@ -208,6 +214,36 @@ static void xe_ttm_vram_buddy_free(struct xe_ttm_vram_mgr *mgr,
mgr->visible_avail += used_visible;
}
+/*
+ * Retry pending page-offline reservations.
+ *
+ * A reservation can fail because the blocks backing the bad page are still
+ * allocated: either the owning BO could not be purged, or the purge was
+ * pipelined and TTM handed the resource to a ghost object which frees it
+ * only once the move fences signal. Rather than giving up, entries stay on
+ * @queued_pages and are retried here every time VRAM blocks come back.
+ *
+ * Called with @mgr->lock held.
+ */
+static void xe_ttm_vram_retry_queued_pages(struct xe_ttm_vram_mgr *mgr)
+{
+ struct xe_ttm_vram_offline_resource *pos, *n;
+
+ lockdep_assert_held(&mgr->lock);
+
+ list_for_each_entry_safe(pos, n, &mgr->queued_pages, queued_link) {
+ if (xe_ttm_vram_buddy_alloc(mgr, pos->addr, pos->addr + SZ_4K,
+ SZ_4K, SZ_4K, &pos->blocks,
+ GPU_BUDDY_RANGE_ALLOCATION, NULL,
+ &pos->used_visible_size))
+ continue;
+ --mgr->n_queued_pages;
+ list_del_rcu(&pos->queued_link);
+ ++mgr->n_offlined_pages;
+ list_add_rcu(&pos->offlined_link, &mgr->offlined_pages);
+ }
+}
+
static void xe_ttm_vram_mgr_del(struct ttm_resource_manager *man,
struct ttm_resource *res)
{
@@ -217,6 +253,8 @@ static void xe_ttm_vram_mgr_del(struct ttm_resource_manager *man,
mutex_lock(&mgr->lock);
xe_ttm_vram_buddy_free(mgr, &vres->blocks, vres->used_visible_size);
+ if (unlikely(!list_empty(&mgr->queued_pages)))
+ xe_ttm_vram_retry_queued_pages(mgr);
mutex_unlock(&mgr->lock);
ttm_resource_fini(man, res);
@@ -580,3 +618,295 @@ 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;
+}
+
+/*
+ * Resolve the BO currently owning @block and take a reference on it.
+ *
+ * Called with @mgr->lock held, which serializes against
+ * xe_ttm_vram_buddy_free() clearing block->private.
+ *
+ * Returns NULL when there is no xe_bo we can act on: either the block is
+ * free, or the resource is temporarily owned by a TTM ghost object because
+ * a move or a pipelined gutting is still in flight. In both cases the
+ * blocks will hit xe_ttm_vram_mgr_del() on their own and the pending
+ * reservation is retried from there.
+ */
+static struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block *block)
+{
+ struct ttm_resource *res = block->private;
+ struct ttm_buffer_object *tbo;
+ struct xe_bo *bo;
+
+ if (!res)
+ return NULL;
+
+ /*
+ * res->bo is updated under bdev->lru_lock by ttm_resource_set_bo().
+ * Racing with a ghost transfer here is benign: we either see the old
+ * owner (whose purge is a no-op and the retry path recovers) or the
+ * ghost (rejected below).
+ *
+ * A ghost is a bare ttm_transfer_obj, not an xe_bo, so ttm_to_xe_bo()
+ * on one would be out of bounds. xe_bo_is_xe_bo() rejects it since
+ * only our own BOs carry xe_ttm_bo_destroy().
+ */
+ tbo = READ_ONCE(res->bo);
+ if (!tbo || !xe_bo_is_xe_bo(tbo))
+ return NULL;
+
+ bo = ttm_to_xe_bo(tbo);
+
+ /* The BO may already be in teardown with a zero refcount */
+ return xe_bo_get_unless_zero(bo) ? bo : NULL;
+}
+
+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 *pos, *n;
+ struct xe_ttm_vram_offline_resource *nentry;
+ struct xe_bo *pbo_to_put = NULL;
+ struct xe_bo *pbo = 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) {
+ pbo = xe_ttm_vram_block_owner_get(block);
+
+ /*
+ * Critical kernel BO? Best-effort check without resv lock;
+ * worst case a concurrent pin causes reset path unnecessarily.
+ */
+ if (pbo && ((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;
+ }
+ }
+ /* Queue both free and occupied (to-be-purged) pages */
+ ++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 (pbo) {
+ /*
+ * Purge BO containing address - reference held from above.
+ * This does not necessarily free the blocks synchronously: if
+ * the BO is not idle, ttm_bo_pipeline_gutting() hands the
+ * resource to a ghost object and it is released only once the
+ * move fences signal. The reservation below then fails and is
+ * retried from xe_ttm_vram_mgr_del().
+ */
+ 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);
+ }
+
+ 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) {
+ nentry->status = XE_PAGE_RESERVE_FAIL;
+ drm_dbg(&xe->drm,
+ "Page at addr:0x%llx still busy (%d), deferring reservation\n",
+ addr, ret);
+ return 0;
+ }
+
+ 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.
+ *
+ * A return of 0 means the page is tracked. It may still be listed as
+ * pending if the blocks backing it could not be freed immediately; the
+ * reservation is then completed from xe_ttm_vram_mgr_del().
+ */
+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] 38+ messages in thread* Re: [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault handler
2026-09-02 14:53 ` [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
@ 2026-09-02 16:25 ` sashiko-bot
2026-09-02 23:04 ` Matthew Brost
0 siblings, 1 reply; 38+ messages in thread
From: sashiko-bot @ 2026-09-02 16:25 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: intel-xe
Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] Lockless read of `res->bo` in `xe_ttm_vram_block_owner_get` leads to a Use-After-Free when racing with a TTM ghost object transfer.
- [High] Race condition when offlining a free VRAM page allows the faulty page to be allocated and never purged.
- [High] Forcefully unpinning BOs in `xe_ttm_vram_purge_page` violates pin counting semantics and creates TOCTOU vulnerabilities.
- [High] `xe_ttm_vram_addr_to_region` ignores the `kernel_vram` region, causing hardware faults in critical kernel memory to be silently ignored.
- [Medium] A race condition between two-phase page reservation and synchronous BO eviction falsely marks successfully offlined pages as failed.
--
commit 23a2bf9a5461265765230ffd0e7a9d24c27ca918
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
Subject: drm/xe/vram: Add VRAM page offline fault handler
This commit introduces a hardware VRAM page offline fault handler for the xe
driver. It adds functionality to purge the buffer object containing the faulty
address, ban the associated VM or exec queue, and reserve the hardware page in
the buddy allocator to prevent future use.
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index d97739a84a2d1..0ab92bc3c6998 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
[ ... ]
> @@ -580,3 +618,295 @@ 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)
> +{
[ ... ]
> + 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 this forcefully break the pin counting contract by unpinning a BO on
behalf of an unknown owner?
In xe_ttm_vram_purge_page(), this unconditionally unpins the BO if it is
pinned, stealing a pin reference belonging to another subsystem (such as the
display controller). When the true owner later unpins the BO, could this
trigger an underflow crash?
> + ret = xe_ttm_bo_purge(&bo->ttm, &ctx);
> + xe_bo_unlock(bo);
> +
> +out:
[ ... ]
> +static struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block *block)
> +{
> + struct ttm_resource *res = block->private;
> + struct ttm_buffer_object *tbo;
> + struct xe_bo *bo;
> +
> + if (!res)
> + return NULL;
> +
> + /*
> + * res->bo is updated under bdev->lru_lock by ttm_resource_set_bo().
> + * Racing with a ghost transfer here is benign: we either see the old
> + * owner (whose purge is a no-op and the retry path recovers) or the
> + * ghost (rejected below).
> + *
> + * A ghost is a bare ttm_transfer_obj, not an xe_bo, so ttm_to_xe_bo()
> + * on one would be out of bounds. xe_bo_is_xe_bo() rejects it since
> + * only our own BOs carry xe_ttm_bo_destroy().
> + */
> + tbo = READ_ONCE(res->bo);
> + if (!tbo || !xe_bo_is_xe_bo(tbo))
> + return NULL;
> +
> + bo = ttm_to_xe_bo(tbo);
[Severity: High]
Is it safe to read res->bo locklessly and pass it to xe_bo_is_xe_bo()?
In xe_ttm_vram_block_owner_get(), tbo is read locklessly. A concurrent
accelerated move or pipelined gutting can transfer the resource to a TTM
ghost object under bdev->lru_lock. This drops the last reference to the
original BO, freeing it via kfree().
If the thread is preempted and resumes after the original BO is freed,
passing the stale tbo pointer to xe_bo_is_xe_bo(tbo) will dereference
tbo->destroy on freed memory, causing a use-after-free regression.
> +
> + /* The BO may already be in teardown with a zero refcount */
> + return xe_bo_get_unless_zero(bo) ? bo : NULL;
> +}
> +
> +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)
> +{
[ ... ]
> + if (block) {
> + pbo = xe_ttm_vram_block_owner_get(block);
> +
> + /*
> + * Critical kernel BO? Best-effort check without resv lock;
> + * worst case a concurrent pin causes reset path unnecessarily.
> + */
> + if (pbo && ((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 pin check create a time-of-check to time-of-use race condition?
In xe_ttm_vram_reserve_page_at_addr(), xe_bo_is_pinned(pbo) is checked
without holding the appropriate locks. A user BO could be pinned right after
this check (e.g., for display scanout), and then forcefully unpinned and
purged.
The display hardware could then continue scanning out the old physical
address, potentially leaking data of whatever new BO is allocated there.
> + kfree(nentry);
> + pbo_to_put = pbo;
> + drm_err(&xe->drm,
> + "%s: addr: 0x%llx is critical kernel bo, requesting SBR\n",
> + __func__, addr);
> + break;
> + }
> + }
> + /* Queue both free and occupied (to-be-purged) pages */
> + ++vram_mgr->n_queued_pages;
> + list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
> + }
> +
> + /* Deferred put outside lock to avoid recursive deadlock */
[Severity: High]
Can a concurrent allocation claim a faulty free page when the lock is dropped?
In xe_ttm_vram_reserve_page_at_addr(), when a hardware fault occurs at a free
address, gpu_buddy_allocated_addr_to_block() returns NULL, meaning pbo is
NULL. The page is queued and vram_mgr->lock is dropped to prevent deadlocks.
During this lockless window, a concurrent TTM allocation can claim this
exact free buddy block. When the fault handler later re-acquires the lock
and attempts xe_ttm_vram_buddy_alloc(), it will fail, returning 0 without
purging (since pbo was NULL). This leaves the newly allocated BO using a
faulty hardware page, which will cause persistent hardware errors.
> + if (pbo_to_put) {
> + xe_bo_put(pbo_to_put);
> + /* Hint System controller driver for reset with -EIO */
> + return -EIO;
> + }
> +
> + if (pbo) {
> + /*
> + * Purge BO containing address - reference held from above.
> + * This does not necessarily free the blocks synchronously: if
> + * the BO is not idle, ttm_bo_pipeline_gutting() hands the
> + * resource to a ghost object and it is released only once the
> + * move fences signal. The reservation below then fails and is
> + * retried from xe_ttm_vram_mgr_del().
> + */
> + 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);
> + }
> +
> + 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) {
> + nentry->status = XE_PAGE_RESERVE_FAIL;
> + drm_dbg(&xe->drm,
> + "Page at addr:0x%llx still busy (%d), deferring reservation\n",
> + addr, ret);
> + return 0;
> + }
[Severity: Medium]
Does this unconditionally attempt buddy allocation without checking if the
retry path already succeeded?
In xe_ttm_vram_reserve_page_at_addr(), if xe_ttm_vram_purge_page() frees the
BO's VRAM resource synchronously, it invokes xe_ttm_vram_mgr_del() which
triggers xe_ttm_vram_retry_queued_pages(). The retry logic will successfully
allocate the buddy block.
When the original thread re-acquires the lock here and blindly calls
xe_ttm_vram_buddy_alloc(), it will fail with -ENOSPC because the block is
already reserved. The page's status is then falsely marked as
XE_PAGE_RESERVE_FAIL, leading to misleading internal state.
> +
> + 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)
> +{
> + struct xe_tile *tile;
> + u8 id;
> +
> + for_each_tile(tile, xe, id) {
> + struct xe_vram_region *vr = tile->mem.vram;
> +
> + if (!vr)
> + continue;
[Severity: High]
Does this skip checking the kernel-dedicated VRAM region?
In xe_ttm_vram_addr_to_region(), the address lookup loop only checks
tile->mem.vram and neglects tile->mem.kernel_vram. If a hardware fault occurs
within kernel_vram, the address mapping fails and returns
ERR_PTR(-EOPNOTSUPP). This causes faults in kernel memory to be silently
ignored instead of triggering a system reset.
> +
> + if (addr >= vr->dpa_base && addr < (vr->dpa_base + vr->usable_size))
> + return vr;
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=9
^ permalink raw reply [flat|nested] 38+ messages in thread* Re: [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault handler
2026-09-02 16:25 ` sashiko-bot
@ 2026-09-02 23:04 ` Matthew Brost
2026-09-03 4:22 ` Matthew Brost
0 siblings, 1 reply; 38+ messages in thread
From: Matthew Brost @ 2026-09-02 23:04 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Tejas Upadhyay, intel-xe
On Wed, Sep 02, 2026 at 04:25:40PM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
> - [High] Lockless read of `res->bo` in `xe_ttm_vram_block_owner_get` leads to a Use-After-Free when racing with a TTM ghost object transfer.
> - [High] Race condition when offlining a free VRAM page allows the faulty page to be allocated and never purged.
> - [High] Forcefully unpinning BOs in `xe_ttm_vram_purge_page` violates pin counting semantics and creates TOCTOU vulnerabilities.
> - [High] `xe_ttm_vram_addr_to_region` ignores the `kernel_vram` region, causing hardware faults in critical kernel memory to be silently ignored.
> - [Medium] A race condition between two-phase page reservation and synchronous BO eviction falsely marks successfully offlined pages as failed.
> --
>
> commit 23a2bf9a5461265765230ffd0e7a9d24c27ca918
> Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
> Subject: drm/xe/vram: Add VRAM page offline fault handler
>
> This commit introduces a hardware VRAM page offline fault handler for the xe
> driver. It adds functionality to purge the buffer object containing the faulty
> address, ban the associated VM or exec queue, and reserve the hardware page in
> the buddy allocator to prevent future use.
>
> > diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > index d97739a84a2d1..0ab92bc3c6998 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> [ ... ]
> > @@ -580,3 +618,295 @@ 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)
> > +{
> [ ... ]
> > + 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 this forcefully break the pin counting contract by unpinning a BO on
> behalf of an unknown owner?
>
> In xe_ttm_vram_purge_page(), this unconditionally unpins the BO if it is
> pinned, stealing a pin reference belonging to another subsystem (such as the
> display controller). When the true owner later unpins the BO, could this
> trigger an underflow crash?
>
> > + ret = xe_ttm_bo_purge(&bo->ttm, &ctx);
> > + xe_bo_unlock(bo);
> > +
> > +out:
> [ ... ]
> > +static struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block *block)
> > +{
> > + struct ttm_resource *res = block->private;
> > + struct ttm_buffer_object *tbo;
> > + struct xe_bo *bo;
> > +
> > + if (!res)
> > + return NULL;
> > +
> > + /*
> > + * res->bo is updated under bdev->lru_lock by ttm_resource_set_bo().
> > + * Racing with a ghost transfer here is benign: we either see the old
> > + * owner (whose purge is a no-op and the retry path recovers) or the
> > + * ghost (rejected below).
> > + *
> > + * A ghost is a bare ttm_transfer_obj, not an xe_bo, so ttm_to_xe_bo()
> > + * on one would be out of bounds. xe_bo_is_xe_bo() rejects it since
> > + * only our own BOs carry xe_ttm_bo_destroy().
> > + */
> > + tbo = READ_ONCE(res->bo);
> > + if (!tbo || !xe_bo_is_xe_bo(tbo))
> > + return NULL;
> > +
> > + bo = ttm_to_xe_bo(tbo);
>
> [Severity: High]
> Is it safe to read res->bo locklessly and pass it to xe_bo_is_xe_bo()?
>
> In xe_ttm_vram_block_owner_get(), tbo is read locklessly. A concurrent
> accelerated move or pipelined gutting can transfer the resource to a TTM
> ghost object under bdev->lru_lock. This drops the last reference to the
> original BO, freeing it via kfree().
>
> If the thread is preempted and resumes after the original BO is freed,
> passing the stale tbo pointer to xe_bo_is_xe_bo(tbo) will dereference
> tbo->destroy on freed memory, causing a use-after-free regression.
>
This one is correct and this memory unsafe here.
Luckily, this fix is easy...
This one will need to be fixed, snippet below:
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index 6a954018012a..ff937ab3837a 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -733,7 +733,8 @@ static bool xe_ttm_vram_page_already_processed(struct xe_ttm_vram_mgr *mgr,
* blocks will hit xe_ttm_vram_mgr_del() on their own and the pending
* reservation is retried from there.
*/
-static struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block *block)
+static struct xe_bo *xe_ttm_vram_block_owner_get(struct xe_device *xe,
+ struct gpu_buddy_block *block)
{
struct ttm_resource *res = block->private;
struct ttm_buffer_object *tbo;
@@ -742,6 +743,8 @@ static struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block *block)
if (!res)
return NULL;
+ guard(spinlock)(&xe->ttm.lru_lock);
+
/*
* res->bo is updated under bdev->lru_lock by ttm_resource_set_bo().
* Racing with a ghost transfer here is benign: we either see the old
@@ -788,7 +791,7 @@ static int xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
nentry->addr = addr;
if (block) {
- pbo = xe_ttm_vram_block_owner_get(block);
+ pbo = xe_ttm_vram_block_owner_get(xe, block);
/*
* Critical kernel BO? Best-effort check without resv lock;
> > +
> > + /* The BO may already be in teardown with a zero refcount */
> > + return xe_bo_get_unless_zero(bo) ? bo : NULL;
> > +}
> > +
> > +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)
> > +{
> [ ... ]
> > + if (block) {
> > + pbo = xe_ttm_vram_block_owner_get(block);
> > +
> > + /*
> > + * Critical kernel BO? Best-effort check without resv lock;
> > + * worst case a concurrent pin causes reset path unnecessarily.
> > + */
> > + if (pbo && ((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 pin check create a time-of-check to time-of-use race condition?
>
> In xe_ttm_vram_reserve_page_at_addr(), xe_bo_is_pinned(pbo) is checked
> without holding the appropriate locks. A user BO could be pinned right after
> this check (e.g., for display scanout), and then forcefully unpinned and
> purged.
>
> The display hardware could then continue scanning out the old physical
> address, potentially leaking data of whatever new BO is allocated there.
>
We should probably file a Jira for this, as I agree this possible with
the right race + NIC trying to pin the BO, but unsure how to handle one
properly.
> > + kfree(nentry);
> > + pbo_to_put = pbo;
> > + drm_err(&xe->drm,
> > + "%s: addr: 0x%llx is critical kernel bo, requesting SBR\n",
> > + __func__, addr);
> > + break;
> > + }
> > + }
> > + /* Queue both free and occupied (to-be-purged) pages */
> > + ++vram_mgr->n_queued_pages;
> > + list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
> > + }
> > +
> > + /* Deferred put outside lock to avoid recursive deadlock */
>
> [Severity: High]
> Can a concurrent allocation claim a faulty free page when the lock is dropped?
>
> In xe_ttm_vram_reserve_page_at_addr(), when a hardware fault occurs at a free
> address, gpu_buddy_allocated_addr_to_block() returns NULL, meaning pbo is
> NULL. The page is queued and vram_mgr->lock is dropped to prevent deadlocks.
>
> During this lockless window, a concurrent TTM allocation can claim this
> exact free buddy block. When the fault handler later re-acquires the lock
> and attempts xe_ttm_vram_buddy_alloc(), it will fail, returning 0 without
> purging (since pbo was NULL). This leaves the newly allocated BO using a
> faulty hardware page, which will cause persistent hardware errors.
>
This also looks right. So I think:
@@ -804,10 +807,17 @@ static int xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
__func__, addr);
break;
}
+
+ /* Queue both free and occupied (to-be-purged) pages */
+ ++vram_mgr->n_queued_pages;
+ list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
+ } else {
+ /* Immediately offline */
+ return xe_ttm_vram_buddy_alloc(vram_mgr, addr, addr + size,
+ size, size, &nentry->blocks,
+ GPU_BUDDY_RANGE_ALLOCATION,
+ NULL, &nentry->used_visible_size);
}
- /* Queue both free and occupied (to-be-purged) pages */
- ++vram_mgr->n_queued_pages;
- list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
}
> > + if (pbo_to_put) {
> > + xe_bo_put(pbo_to_put);
> > + /* Hint System controller driver for reset with -EIO */
> > + return -EIO;
> > + }
> > +
> > + if (pbo) {
> > + /*
> > + * Purge BO containing address - reference held from above.
> > + * This does not necessarily free the blocks synchronously: if
> > + * the BO is not idle, ttm_bo_pipeline_gutting() hands the
> > + * resource to a ghost object and it is released only once the
> > + * move fences signal. The reservation below then fails and is
> > + * retried from xe_ttm_vram_mgr_del().
> > + */
> > + 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);
> > + }
> > +
> > + 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) {
> > + nentry->status = XE_PAGE_RESERVE_FAIL;
> > + drm_dbg(&xe->drm,
> > + "Page at addr:0x%llx still busy (%d), deferring reservation\n",
> > + addr, ret);
> > + return 0;
> > + }
>
> [Severity: Medium]
> Does this unconditionally attempt buddy allocation without checking if the
> retry path already succeeded?
>
> In xe_ttm_vram_reserve_page_at_addr(), if xe_ttm_vram_purge_page() frees the
> BO's VRAM resource synchronously, it invokes xe_ttm_vram_mgr_del() which
> triggers xe_ttm_vram_retry_queued_pages(). The retry logic will successfully
> allocate the buddy block.
>
> When the original thread re-acquires the lock here and blindly calls
> xe_ttm_vram_buddy_alloc(), it will fail with -ENOSPC because the block is
> already reserved. The page's status is then falsely marked as
> XE_PAGE_RESERVE_FAIL, leading to misleading internal state.
>
> > +
> > + 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)
> > +{
> > + struct xe_tile *tile;
> > + u8 id;
> > +
> > + for_each_tile(tile, xe, id) {
> > + struct xe_vram_region *vr = tile->mem.vram;
> > +
> > + if (!vr)
> > + continue;
>
> [Severity: High]
> Does this skip checking the kernel-dedicated VRAM region?
>
> In xe_ttm_vram_addr_to_region(), the address lookup loop only checks
> tile->mem.vram and neglects tile->mem.kernel_vram. If a hardware fault occurs
> within kernel_vram, the address mapping fails and returns
> ERR_PTR(-EOPNOTSUPP). This causes faults in kernel memory to be silently
> ignored instead of triggering a system reset.
>
tile->mem.kernel_vram = tile->mem.vram in the current code but for
completeness, this likely right too. I'd check the kernel_vram if
tile->mem.kernel_vram != tile->mem.vram.
Matt
> > +
> > + if (addr >= vr->dpa_base && addr < (vr->dpa_base + vr->usable_size))
> > + return vr;
> [ ... ]
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=9
^ permalink raw reply related [flat|nested] 38+ messages in thread* Re: [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault handler
2026-09-02 23:04 ` Matthew Brost
@ 2026-09-03 4:22 ` Matthew Brost
2026-09-03 7:57 ` Upadhyay, Tejas
0 siblings, 1 reply; 38+ messages in thread
From: Matthew Brost @ 2026-09-03 4:22 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Tejas Upadhyay, intel-xe
On Wed, Sep 02, 2026 at 04:04:09PM -0700, Matthew Brost wrote:
One mistake in a suggestion. Inline below.
> On Wed, Sep 02, 2026 at 04:25:40PM +0000, sashiko-bot@kernel.org wrote:
> > Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
> > - [High] Lockless read of `res->bo` in `xe_ttm_vram_block_owner_get` leads to a Use-After-Free when racing with a TTM ghost object transfer.
> > - [High] Race condition when offlining a free VRAM page allows the faulty page to be allocated and never purged.
> > - [High] Forcefully unpinning BOs in `xe_ttm_vram_purge_page` violates pin counting semantics and creates TOCTOU vulnerabilities.
> > - [High] `xe_ttm_vram_addr_to_region` ignores the `kernel_vram` region, causing hardware faults in critical kernel memory to be silently ignored.
> > - [Medium] A race condition between two-phase page reservation and synchronous BO eviction falsely marks successfully offlined pages as failed.
> > --
> >
> > commit 23a2bf9a5461265765230ffd0e7a9d24c27ca918
> > Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > Subject: drm/xe/vram: Add VRAM page offline fault handler
> >
> > This commit introduces a hardware VRAM page offline fault handler for the xe
> > driver. It adds functionality to purge the buffer object containing the faulty
> > address, ban the associated VM or exec queue, and reserve the hardware page in
> > the buddy allocator to prevent future use.
> >
> > > diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > > index d97739a84a2d1..0ab92bc3c6998 100644
> > > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > [ ... ]
> > > @@ -580,3 +618,295 @@ 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)
> > > +{
> > [ ... ]
> > > + 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 this forcefully break the pin counting contract by unpinning a BO on
> > behalf of an unknown owner?
> >
> > In xe_ttm_vram_purge_page(), this unconditionally unpins the BO if it is
> > pinned, stealing a pin reference belonging to another subsystem (such as the
> > display controller). When the true owner later unpins the BO, could this
> > trigger an underflow crash?
> >
> > > + ret = xe_ttm_bo_purge(&bo->ttm, &ctx);
> > > + xe_bo_unlock(bo);
> > > +
> > > +out:
> > [ ... ]
> > > +static struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block *block)
> > > +{
> > > + struct ttm_resource *res = block->private;
> > > + struct ttm_buffer_object *tbo;
> > > + struct xe_bo *bo;
> > > +
> > > + if (!res)
> > > + return NULL;
> > > +
> > > + /*
> > > + * res->bo is updated under bdev->lru_lock by ttm_resource_set_bo().
> > > + * Racing with a ghost transfer here is benign: we either see the old
> > > + * owner (whose purge is a no-op and the retry path recovers) or the
> > > + * ghost (rejected below).
> > > + *
> > > + * A ghost is a bare ttm_transfer_obj, not an xe_bo, so ttm_to_xe_bo()
> > > + * on one would be out of bounds. xe_bo_is_xe_bo() rejects it since
> > > + * only our own BOs carry xe_ttm_bo_destroy().
> > > + */
> > > + tbo = READ_ONCE(res->bo);
> > > + if (!tbo || !xe_bo_is_xe_bo(tbo))
> > > + return NULL;
> > > +
> > > + bo = ttm_to_xe_bo(tbo);
> >
> > [Severity: High]
> > Is it safe to read res->bo locklessly and pass it to xe_bo_is_xe_bo()?
> >
> > In xe_ttm_vram_block_owner_get(), tbo is read locklessly. A concurrent
> > accelerated move or pipelined gutting can transfer the resource to a TTM
> > ghost object under bdev->lru_lock. This drops the last reference to the
> > original BO, freeing it via kfree().
> >
> > If the thread is preempted and resumes after the original BO is freed,
> > passing the stale tbo pointer to xe_bo_is_xe_bo(tbo) will dereference
> > tbo->destroy on freed memory, causing a use-after-free regression.
> >
>
> This one is correct and this memory unsafe here.
>
> Luckily, this fix is easy...
>
> This one will need to be fixed, snippet below:
>
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index 6a954018012a..ff937ab3837a 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -733,7 +733,8 @@ static bool xe_ttm_vram_page_already_processed(struct xe_ttm_vram_mgr *mgr,
> * blocks will hit xe_ttm_vram_mgr_del() on their own and the pending
> * reservation is retried from there.
> */
> -static struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block *block)
> +static struct xe_bo *xe_ttm_vram_block_owner_get(struct xe_device *xe,
> + struct gpu_buddy_block *block)
> {
> struct ttm_resource *res = block->private;
> struct ttm_buffer_object *tbo;
> @@ -742,6 +743,8 @@ static struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block *block)
> if (!res)
> return NULL;
>
> + guard(spinlock)(&xe->ttm.lru_lock);
> +
> /*
> * res->bo is updated under bdev->lru_lock by ttm_resource_set_bo().
> * Racing with a ghost transfer here is benign: we either see the old
> @@ -788,7 +791,7 @@ static int xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
> nentry->addr = addr;
>
> if (block) {
> - pbo = xe_ttm_vram_block_owner_get(block);
> + pbo = xe_ttm_vram_block_owner_get(xe, block);
>
> /*
> * Critical kernel BO? Best-effort check without resv lock;
>
>
> > > +
> > > + /* The BO may already be in teardown with a zero refcount */
> > > + return xe_bo_get_unless_zero(bo) ? bo : NULL;
> > > +}
> > > +
> > > +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)
> > > +{
> > [ ... ]
> > > + if (block) {
> > > + pbo = xe_ttm_vram_block_owner_get(block);
> > > +
> > > + /*
> > > + * Critical kernel BO? Best-effort check without resv lock;
> > > + * worst case a concurrent pin causes reset path unnecessarily.
> > > + */
> > > + if (pbo && ((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 pin check create a time-of-check to time-of-use race condition?
> >
> > In xe_ttm_vram_reserve_page_at_addr(), xe_bo_is_pinned(pbo) is checked
> > without holding the appropriate locks. A user BO could be pinned right after
> > this check (e.g., for display scanout), and then forcefully unpinned and
> > purged.
> >
> > The display hardware could then continue scanning out the old physical
> > address, potentially leaking data of whatever new BO is allocated there.
> >
>
> We should probably file a Jira for this, as I agree this possible with
> the right race + NIC trying to pin the BO, but unsure how to handle one
> properly.
>
> > > + kfree(nentry);
> > > + pbo_to_put = pbo;
> > > + drm_err(&xe->drm,
> > > + "%s: addr: 0x%llx is critical kernel bo, requesting SBR\n",
> > > + __func__, addr);
> > > + break;
> > > + }
> > > + }
> > > + /* Queue both free and occupied (to-be-purged) pages */
> > > + ++vram_mgr->n_queued_pages;
> > > + list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
> > > + }
> > > +
> > > + /* Deferred put outside lock to avoid recursive deadlock */
> >
> > [Severity: High]
> > Can a concurrent allocation claim a faulty free page when the lock is dropped?
> >
> > In xe_ttm_vram_reserve_page_at_addr(), when a hardware fault occurs at a free
> > address, gpu_buddy_allocated_addr_to_block() returns NULL, meaning pbo is
> > NULL. The page is queued and vram_mgr->lock is dropped to prevent deadlocks.
> >
> > During this lockless window, a concurrent TTM allocation can claim this
> > exact free buddy block. When the fault handler later re-acquires the lock
> > and attempts xe_ttm_vram_buddy_alloc(), it will fail, returning 0 without
> > purging (since pbo was NULL). This leaves the newly allocated BO using a
> > faulty hardware page, which will cause persistent hardware errors.
> >
>
> This also looks right. So I think:
>
> @@ -804,10 +807,17 @@ static int xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
> __func__, addr);
> break;
> }
> +
> + /* Queue both free and occupied (to-be-purged) pages */
> + ++vram_mgr->n_queued_pages;
> + list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
> + } else {
> + /* Immediately offline */
> + return xe_ttm_vram_buddy_alloc(vram_mgr, addr, addr + size,
> + size, size, &nentry->blocks,
> + GPU_BUDDY_RANGE_ALLOCATION,
> + NULL, &nentry->used_visible_size);
I missed adjusting n_offlined_pages and adding nentry to offlined_pages here.
So I think check the return of xe_ttm_vram_buddy_alloc, then adjust
n_offlined_pages + add nentry to offlined_pages.
Matt
> }
> - /* Queue both free and occupied (to-be-purged) pages */
> - ++vram_mgr->n_queued_pages;
> - list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
> }
>
>
> > > + if (pbo_to_put) {
> > > + xe_bo_put(pbo_to_put);
> > > + /* Hint System controller driver for reset with -EIO */
> > > + return -EIO;
> > > + }
> > > +
> > > + if (pbo) {
> > > + /*
> > > + * Purge BO containing address - reference held from above.
> > > + * This does not necessarily free the blocks synchronously: if
> > > + * the BO is not idle, ttm_bo_pipeline_gutting() hands the
> > > + * resource to a ghost object and it is released only once the
> > > + * move fences signal. The reservation below then fails and is
> > > + * retried from xe_ttm_vram_mgr_del().
> > > + */
> > > + 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);
> > > + }
> > > +
> > > + 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) {
> > > + nentry->status = XE_PAGE_RESERVE_FAIL;
> > > + drm_dbg(&xe->drm,
> > > + "Page at addr:0x%llx still busy (%d), deferring reservation\n",
> > > + addr, ret);
> > > + return 0;
> > > + }
> >
> > [Severity: Medium]
> > Does this unconditionally attempt buddy allocation without checking if the
> > retry path already succeeded?
> >
> > In xe_ttm_vram_reserve_page_at_addr(), if xe_ttm_vram_purge_page() frees the
> > BO's VRAM resource synchronously, it invokes xe_ttm_vram_mgr_del() which
> > triggers xe_ttm_vram_retry_queued_pages(). The retry logic will successfully
> > allocate the buddy block.
> >
> > When the original thread re-acquires the lock here and blindly calls
> > xe_ttm_vram_buddy_alloc(), it will fail with -ENOSPC because the block is
> > already reserved. The page's status is then falsely marked as
> > XE_PAGE_RESERVE_FAIL, leading to misleading internal state.
> >
> > > +
> > > + 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)
> > > +{
> > > + struct xe_tile *tile;
> > > + u8 id;
> > > +
> > > + for_each_tile(tile, xe, id) {
> > > + struct xe_vram_region *vr = tile->mem.vram;
> > > +
> > > + if (!vr)
> > > + continue;
> >
> > [Severity: High]
> > Does this skip checking the kernel-dedicated VRAM region?
> >
> > In xe_ttm_vram_addr_to_region(), the address lookup loop only checks
> > tile->mem.vram and neglects tile->mem.kernel_vram. If a hardware fault occurs
> > within kernel_vram, the address mapping fails and returns
> > ERR_PTR(-EOPNOTSUPP). This causes faults in kernel memory to be silently
> > ignored instead of triggering a system reset.
> >
>
> tile->mem.kernel_vram = tile->mem.vram in the current code but for
> completeness, this likely right too. I'd check the kernel_vram if
> tile->mem.kernel_vram != tile->mem.vram.
>
> Matt
>
> > > +
> > > + if (addr >= vr->dpa_base && addr < (vr->dpa_base + vr->usable_size))
> > > + return vr;
> > [ ... ]
> >
> > --
> > Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=9
^ permalink raw reply [flat|nested] 38+ messages in thread* RE: [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault handler
2026-09-03 4:22 ` Matthew Brost
@ 2026-09-03 7:57 ` Upadhyay, Tejas
0 siblings, 0 replies; 38+ messages in thread
From: Upadhyay, Tejas @ 2026-09-03 7:57 UTC (permalink / raw)
To: Brost, Matthew, sashiko-reviews@lists.linux.dev
Cc: intel-xe@lists.freedesktop.org
> -----Original Message-----
> From: Brost, Matthew <matthew.brost@intel.com>
> Sent: 03 September 2026 09:52
> To: sashiko-reviews@lists.linux.dev
> Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> xe@lists.freedesktop.org
> Subject: Re: [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault
> handler
>
> On Wed, Sep 02, 2026 at 04:04:09PM -0700, Matthew Brost wrote:
>
> One mistake in a suggestion. Inline below.
>
> > On Wed, Sep 02, 2026 at 04:25:40PM +0000, sashiko-bot@kernel.org
> wrote:
> > > Thank you for your contribution! Sashiko AI review found 5 potential
> issue(s) to consider:
> > > - [High] Lockless read of `res->bo` in `xe_ttm_vram_block_owner_get` leads
> to a Use-After-Free when racing with a TTM ghost object transfer.
> > > - [High] Race condition when offlining a free VRAM page allows the faulty
> page to be allocated and never purged.
> > > - [High] Forcefully unpinning BOs in `xe_ttm_vram_purge_page` violates
> pin counting semantics and creates TOCTOU vulnerabilities.
> > > - [High] `xe_ttm_vram_addr_to_region` ignores the `kernel_vram` region,
> causing hardware faults in critical kernel memory to be silently ignored.
> > > - [Medium] A race condition between two-phase page reservation and
> synchronous BO eviction falsely marks successfully offlined pages as failed.
> > > --
> > >
> > > commit 23a2bf9a5461265765230ffd0e7a9d24c27ca918
> > > Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > > Subject: drm/xe/vram: Add VRAM page offline fault handler
> > >
> > > This commit introduces a hardware VRAM page offline fault handler
> > > for the xe driver. It adds functionality to purge the buffer object
> > > containing the faulty address, ban the associated VM or exec queue,
> > > and reserve the hardware page in the buddy allocator to prevent future
> use.
> > >
> > > > diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > > > b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > > > index d97739a84a2d1..0ab92bc3c6998 100644
> > > > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > > > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > > [ ... ]
> > > > @@ -580,3 +618,295 @@ 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) {
> > > [ ... ]
> > > > + 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 this forcefully break the pin counting contract by unpinning a
> > > BO on behalf of an unknown owner?
> > >
> > > In xe_ttm_vram_purge_page(), this unconditionally unpins the BO if
> > > it is pinned, stealing a pin reference belonging to another
> > > subsystem (such as the display controller). When the true owner
> > > later unpins the BO, could this trigger an underflow crash?
> > >
> > > > + ret = xe_ttm_bo_purge(&bo->ttm, &ctx);
> > > > + xe_bo_unlock(bo);
> > > > +
> > > > +out:
> > > [ ... ]
> > > > +static struct xe_bo *xe_ttm_vram_block_owner_get(struct
> > > > +gpu_buddy_block *block) {
> > > > + struct ttm_resource *res = block->private;
> > > > + struct ttm_buffer_object *tbo;
> > > > + struct xe_bo *bo;
> > > > +
> > > > + if (!res)
> > > > + return NULL;
> > > > +
> > > > + /*
> > > > + * res->bo is updated under bdev->lru_lock by ttm_resource_set_bo().
> > > > + * Racing with a ghost transfer here is benign: we either see the old
> > > > + * owner (whose purge is a no-op and the retry path recovers) or the
> > > > + * ghost (rejected below).
> > > > + *
> > > > + * A ghost is a bare ttm_transfer_obj, not an xe_bo, so ttm_to_xe_bo()
> > > > + * on one would be out of bounds. xe_bo_is_xe_bo() rejects it since
> > > > + * only our own BOs carry xe_ttm_bo_destroy().
> > > > + */
> > > > + tbo = READ_ONCE(res->bo);
> > > > + if (!tbo || !xe_bo_is_xe_bo(tbo))
> > > > + return NULL;
> > > > +
> > > > + bo = ttm_to_xe_bo(tbo);
> > >
> > > [Severity: High]
> > > Is it safe to read res->bo locklessly and pass it to xe_bo_is_xe_bo()?
> > >
> > > In xe_ttm_vram_block_owner_get(), tbo is read locklessly. A
> > > concurrent accelerated move or pipelined gutting can transfer the
> > > resource to a TTM ghost object under bdev->lru_lock. This drops the
> > > last reference to the original BO, freeing it via kfree().
> > >
> > > If the thread is preempted and resumes after the original BO is
> > > freed, passing the stale tbo pointer to xe_bo_is_xe_bo(tbo) will
> > > dereference
> > > tbo->destroy on freed memory, causing a use-after-free regression.
> > >
> >
> > This one is correct and this memory unsafe here.
> >
> > Luckily, this fix is easy...
> >
> > This one will need to be fixed, snippet below:
> >
> > diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > index 6a954018012a..ff937ab3837a 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > @@ -733,7 +733,8 @@ static bool
> xe_ttm_vram_page_already_processed(struct xe_ttm_vram_mgr *mgr,
> > * blocks will hit xe_ttm_vram_mgr_del() on their own and the pending
> > * reservation is retried from there.
> > */
> > -static struct xe_bo *xe_ttm_vram_block_owner_get(struct
> > gpu_buddy_block *block)
> > +static struct xe_bo *xe_ttm_vram_block_owner_get(struct xe_device *xe,
> > + struct
> > +gpu_buddy_block *block)
> > {
> > struct ttm_resource *res = block->private;
> > struct ttm_buffer_object *tbo; @@ -742,6 +743,8 @@ static
> > struct xe_bo *xe_ttm_vram_block_owner_get(struct gpu_buddy_block
> *block)
> > if (!res)
> > return NULL;
> >
> > + guard(spinlock)(&xe->ttm.lru_lock);
> > +
Sure
> > /*
> > * res->bo is updated under bdev->lru_lock by ttm_resource_set_bo().
> > * Racing with a ghost transfer here is benign: we either see
> > the old @@ -788,7 +791,7 @@ static int
> xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
> > nentry->addr = addr;
> >
> > if (block) {
> > - pbo = xe_ttm_vram_block_owner_get(block);
> > + pbo = xe_ttm_vram_block_owner_get(xe, block);
> >
> > /*
> > * Critical kernel BO? Best-effort check
> > without resv lock;
> >
> >
> > > > +
> > > > + /* The BO may already be in teardown with a zero refcount */
> > > > + return xe_bo_get_unless_zero(bo) ? bo : NULL; }
> > > > +
> > > > +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)
> > > > +{
> > > [ ... ]
> > > > + if (block) {
> > > > + pbo = xe_ttm_vram_block_owner_get(block);
> > > > +
> > > > + /*
> > > > + * Critical kernel BO? Best-effort check without resv
> lock;
> > > > + * worst case a concurrent pin causes reset path
> unnecessarily.
> > > > + */
> > > > + if (pbo && ((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 pin check create a time-of-check to time-of-use race
> condition?
> > >
> > > In xe_ttm_vram_reserve_page_at_addr(), xe_bo_is_pinned(pbo) is
> > > checked without holding the appropriate locks. A user BO could be
> > > pinned right after this check (e.g., for display scanout), and then
> > > forcefully unpinned and purged.
> > >
> > > The display hardware could then continue scanning out the old
> > > physical address, potentially leaking data of whatever new BO is allocated
> there.
> > >
> >
> > We should probably file a Jira for this, as I agree this possible with
> > the right race + NIC trying to pin the BO, but unsure how to handle
> > one properly.
Sure
> >
> > > > + kfree(nentry);
> > > > + pbo_to_put = pbo;
> > > > + drm_err(&xe->drm,
> > > > + "%s: addr: 0x%llx is critical kernel bo,
> requesting SBR\n",
> > > > + __func__, addr);
> > > > + break;
> > > > + }
> > > > + }
> > > > + /* Queue both free and occupied (to-be-purged) pages */
> > > > + ++vram_mgr->n_queued_pages;
> > > > + list_add_rcu(&nentry->queued_link, &vram_mgr-
> >queued_pages);
> > > > + }
> > > > +
> > > > + /* Deferred put outside lock to avoid recursive deadlock */
> > >
> > > [Severity: High]
> > > Can a concurrent allocation claim a faulty free page when the lock is
> dropped?
> > >
> > > In xe_ttm_vram_reserve_page_at_addr(), when a hardware fault occurs
> > > at a free address, gpu_buddy_allocated_addr_to_block() returns NULL,
> > > meaning pbo is NULL. The page is queued and vram_mgr->lock is dropped
> to prevent deadlocks.
> > >
> > > During this lockless window, a concurrent TTM allocation can claim
> > > this exact free buddy block. When the fault handler later
> > > re-acquires the lock and attempts xe_ttm_vram_buddy_alloc(), it will
> > > fail, returning 0 without purging (since pbo was NULL). This leaves
> > > the newly allocated BO using a faulty hardware page, which will cause
> persistent hardware errors.
> > >
> >
> > This also looks right. So I think:
> >
> > @@ -804,10 +807,17 @@ static int
> xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
> > __func__, addr);
> > break;
> > }
> > +
> > + /* Queue both free and occupied (to-be-purged) pages */
> > + ++vram_mgr->n_queued_pages;
> > + list_add_rcu(&nentry->queued_link, &vram_mgr-
> >queued_pages);
> > + } else {
> > + /* Immediately offline */
> > + return xe_ttm_vram_buddy_alloc(vram_mgr, addr, addr + size,
> > + size, size, &nentry->blocks,
> > + GPU_BUDDY_RANGE_ALLOCATION,
> > + NULL,
> > + &nentry->used_visible_size);
>
> I missed adjusting n_offlined_pages and adding nentry to offlined_pages here.
>
> So I think check the return of xe_ttm_vram_buddy_alloc, then adjust
> n_offlined_pages + add nentry to offlined_pages.
Sure
>
> Matt
>
> > }
> > - /* Queue both free and occupied (to-be-purged) pages */
> > - ++vram_mgr->n_queued_pages;
> > - list_add_rcu(&nentry->queued_link, &vram_mgr->queued_pages);
> > }
> >
> >
> > > > + if (pbo_to_put) {
> > > > + xe_bo_put(pbo_to_put);
> > > > + /* Hint System controller driver for reset with -EIO */
> > > > + return -EIO;
> > > > + }
> > > > +
> > > > + if (pbo) {
> > > > + /*
> > > > + * Purge BO containing address - reference held from above.
> > > > + * This does not necessarily free the blocks synchronously: if
> > > > + * the BO is not idle, ttm_bo_pipeline_gutting() hands the
> > > > + * resource to a ghost object and it is released only once the
> > > > + * move fences signal. The reservation below then fails and is
> > > > + * retried from xe_ttm_vram_mgr_del().
> > > > + */
> > > > + 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);
> > > > + }
> > > > +
> > > > + 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) {
> > > > + nentry->status = XE_PAGE_RESERVE_FAIL;
> > > > + drm_dbg(&xe->drm,
> > > > + "Page at addr:0x%llx still busy (%d), deferring
> reservation\n",
> > > > + addr, ret);
> > > > + return 0;
> > > > + }
> > >
> > > [Severity: Medium]
> > > Does this unconditionally attempt buddy allocation without checking
> > > if the retry path already succeeded?
> > >
> > > In xe_ttm_vram_reserve_page_at_addr(), if xe_ttm_vram_purge_page()
> > > frees the BO's VRAM resource synchronously, it invokes
> > > xe_ttm_vram_mgr_del() which triggers
> > > xe_ttm_vram_retry_queued_pages(). The retry logic will successfully
> allocate the buddy block.
> > >
> > > When the original thread re-acquires the lock here and blindly calls
> > > xe_ttm_vram_buddy_alloc(), it will fail with -ENOSPC because the
> > > block is already reserved. The page's status is then falsely marked
> > > as XE_PAGE_RESERVE_FAIL, leading to misleading internal state.
> > >
> > > > +
> > > > + 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) {
> > > > + struct xe_tile *tile;
> > > > + u8 id;
> > > > +
> > > > + for_each_tile(tile, xe, id) {
> > > > + struct xe_vram_region *vr = tile->mem.vram;
> > > > +
> > > > + if (!vr)
> > > > + continue;
> > >
> > > [Severity: High]
> > > Does this skip checking the kernel-dedicated VRAM region?
> > >
> > > In xe_ttm_vram_addr_to_region(), the address lookup loop only checks
> > > tile->mem.vram and neglects tile->mem.kernel_vram. If a hardware
> > > tile->fault occurs
> > > within kernel_vram, the address mapping fails and returns
> > > ERR_PTR(-EOPNOTSUPP). This causes faults in kernel memory to be
> > > silently ignored instead of triggering a system reset.
> > >
> >
> > tile->mem.kernel_vram = tile->mem.vram in the current code but for
> > completeness, this likely right too. I'd check the kernel_vram if
> > tile->mem.kernel_vram != tile->mem.vram.
We have no use of kernel_vram on drm-tip right now. First use may be in EXI, so as discussed let defer this change for later.
Tejas
> >
> > Matt
> >
> > > > +
> > > > + if (addr >= vr->dpa_base && addr < (vr->dpa_base + vr-
> >usable_size))
> > > > + return vr;
> > > [ ... ]
> > >
> > > --
> > > Sashiko AI review *
> > > https://sashiko.dev/#/patchset/20260902145343.465686-17-
> tejas.upadhy
> > > ay@intel.com?part=9
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH V20 10/15] drm/xe/configfs: Add disable_vram_page_offline attribute
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (8 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 09/15] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 16:35 ` sashiko-bot
2026-09-02 14:53 ` [PATCH V20 11/15] drm/xe/ras: Cache disable_vram_page_offline policy at init Tejas Upadhyay
` (8 subsequent siblings)
18 siblings, 1 reply; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Michal Wajdeczko
Add a new configfs attribute 'disable_vram_page_offline' to control
how bad VRAM pages are handled:
0, n, N, false - Do not disable (Offlining is active - default)
1, y, Y, true - Disable vram page offline (Logging only)
The attribute can only be set before binding to the device and defaults
to false (offlining enabled). This gives administrators control over
whether corrupted VRAM pages detected by hardware (e.g., ECC errors)
are actively offlined or only logged.
v2(Sashiko):
- keep default value in case configfs not present
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
drivers/gpu/drm/xe/xe_configfs.c | 72 +++++++++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_configfs.h | 2 +
2 files changed, 73 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
index 052cce962161..a9c72504c8a4 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
+ * └── disable_vram_page_offline
*
* After configuring the attributes as per next section, the device can be
* probed with::
@@ -157,6 +158,18 @@
*
* # echo 1 > /sys/kernel/config/xe/0000:03:00.0/enable_psmi
*
+ * This attribute can only be set on CRI before binding to the device.
+ *
+ * Disable VRAM page offline:
+ * ----------------------------
+ *
+ * 0, n, N, false - Do not disable (Offlining is active - default)
+ * 1, y, Y, true - Disable vram page offline (Logging only)
+ *
+ * Example to disable VRAM offline::
+ *
+ * # echo 1 > /sys/kernel/config/xe/0000:03:00.0/disable_vram_page_offline
+ *
* This attribute can only be set before binding to the device.
*
* Context restore BB
@@ -275,6 +288,7 @@ struct xe_config_group_device {
bool survivability_mode;
bool enable_psmi;
bool enable_multi_queue;
+ bool disable_vram_page_offline;
struct {
unsigned int max_vfs;
bool admin_only_pf;
@@ -295,6 +309,7 @@ static const struct xe_config_device device_defaults = {
.survivability_mode = false,
.enable_psmi = false,
.enable_multi_queue = true,
+ .disable_vram_page_offline = false,
.sriov = {
.max_vfs = XE_DEFAULT_MAX_VFS,
.admin_only_pf = XE_DEFAULT_ADMIN_ONLY_PF,
@@ -616,6 +631,33 @@ static ssize_t enable_multi_queue_store(struct config_item *item, const char *pa
return len;
}
+static ssize_t disable_vram_page_offline_show(struct config_item *item, char *page)
+{
+ struct xe_config_device *dev = to_xe_config_device(item);
+
+ return sprintf(page, "%s\n", str_yes_no(dev->disable_vram_page_offline));
+}
+
+static ssize_t disable_vram_page_offline_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.disable_vram_page_offline = 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(, disable_vram_page_offline);
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_disable_vram_page_offline,
&attr_engines_allowed,
&attr_gt_types_allowed,
&attr_survivability_mode,
@@ -895,6 +939,11 @@ static bool xe_config_device_is_visible(struct config_item *item,
return false;
}
+ if (attr == &attr_disable_vram_page_offline) {
+ if (!dev->desc->is_dgfx || dev->desc->platform != XE_CRESCENTISLAND)
+ return false;
+ }
+
return true;
}
@@ -1142,6 +1191,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", disable_vram_page_offline);
PRI_CUSTOM_ATTR("%d", survivability_mode);
PRI_CUSTOM_ATTR("%u", sriov.admin_only_pf);
@@ -1290,6 +1340,26 @@ bool xe_configfs_get_enable_multi_queue(struct pci_dev *pdev)
return ret;
}
+/**
+ * xe_configfs_get_disable_vram_page_offline - get configfs disable_vram_page_offline setting
+ * @pdev: pci device
+ *
+ * Return: disable_vram_page_offline setting in configfs
+ */
+bool xe_configfs_get_disable_vram_page_offline(struct pci_dev *pdev)
+{
+ struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
+ bool ret;
+
+ if (!dev)
+ return device_defaults.disable_vram_page_offline;
+
+ ret = dev->config.disable_vram_page_offline;
+ 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..42cd1a491d01 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_disable_vram_page_offline(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_disable_vram_page_offline(struct pci_dev *pdev) { return false; }
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] 38+ messages in thread* Re: [PATCH V20 10/15] drm/xe/configfs: Add disable_vram_page_offline attribute
2026-09-02 14:53 ` [PATCH V20 10/15] drm/xe/configfs: Add disable_vram_page_offline attribute Tejas Upadhyay
@ 2026-09-02 16:35 ` sashiko-bot
2026-09-02 17:56 ` Upadhyay, Tejas
0 siblings, 1 reply; 38+ messages in thread
From: sashiko-bot @ 2026-09-02 16:35 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: intel-xe
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] Misplaced documentation comment restricting the attribute to CRI.
--
commit 4299f8f46041fce362473361938b350fd32fe701
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
drm/xe/configfs: Add disable_vram_page_offline attribute
This commit adds a new configfs attribute disable_vram_page_offline
to control how bad VRAM pages are handled. It allows administrators to
disable active VRAM page offlining on Crescent Island (CRI) platforms,
falling back to logging only.
> diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
> index 052cce9621611..a9c72504c8a44 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.c
> +++ b/drivers/gpu/drm/xe/xe_configfs.c
[ ... ]
> @@ -157,6 +158,18 @@
> *
> * # echo 1 > /sys/kernel/config/xe/0000:03:00.0/enable_psmi
> *
> + * This attribute can only be set on CRI before binding to the device.
[Severity: Low]
Does this documentation string apply to enable_psmi or the newly added
disable_vram_page_offline attribute?
Because it is placed above the "Disable VRAM page offline:" heading, it
appears to document enable_psmi. However, since the code restricts
disable_vram_page_offline to XE_CRESCENTISLAND (CRI), it seems this
restriction text was intended for the new attribute instead.
Additionally, placing the new text here pushes the original
"This attribute can only be set before binding to the device." text
down into the disable_vram_page_offline section, which removes it from
the enable_psmi section where it previously belonged.
> + *
> + * Disable VRAM page offline:
> + * ----------------------------
> + *
> + * 0, n, N, false - Do not disable (Offlining is active - default)
> + * 1, y, Y, true - Disable vram page offline (Logging only)
> + *
> + * Example to disable VRAM offline::
> + *
> + * # echo 1 > /sys/kernel/config/xe/0000:03:00.0/disable_vram_page_offline
> + *
> * This attribute can only be set before binding to the device.
> *
> * Context restore BB
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=10
^ permalink raw reply [flat|nested] 38+ messages in thread
* RE: [PATCH V20 10/15] drm/xe/configfs: Add disable_vram_page_offline attribute
2026-09-02 16:35 ` sashiko-bot
@ 2026-09-02 17:56 ` Upadhyay, Tejas
0 siblings, 0 replies; 38+ messages in thread
From: Upadhyay, Tejas @ 2026-09-02 17:56 UTC (permalink / raw)
To: sashiko-reviews@lists.linux.dev; +Cc: intel-xe@lists.freedesktop.org
> -----Original Message-----
> From: sashiko-bot@kernel.org <sashiko-bot@kernel.org>
> Sent: 02 September 2026 22:05
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org
> Subject: Re: [PATCH V20 10/15] drm/xe/configfs: Add
> disable_vram_page_offline attribute
>
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s)
> to consider:
> - [Low] Misplaced documentation comment restricting the attribute to CRI.
> --
>
> commit 4299f8f46041fce362473361938b350fd32fe701
> Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
>
> drm/xe/configfs: Add disable_vram_page_offline attribute
>
> This commit adds a new configfs attribute disable_vram_page_offline to
> control how bad VRAM pages are handled. It allows administrators to disable
> active VRAM page offlining on Crescent Island (CRI) platforms, falling back to
> logging only.
>
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> > b/drivers/gpu/drm/xe/xe_configfs.c
> > index 052cce9621611..a9c72504c8a44 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.c
> > +++ b/drivers/gpu/drm/xe/xe_configfs.c
> [ ... ]
> > @@ -157,6 +158,18 @@
> > *
> > * # echo 1 > /sys/kernel/config/xe/0000:03:00.0/enable_psmi
> > *
> > + * This attribute can only be set on CRI before binding to the device.
>
> [Severity: Low]
> Does this documentation string apply to enable_psmi or the newly added
> disable_vram_page_offline attribute?
>
> Because it is placed above the "Disable VRAM page offline:" heading, it
> appears to document enable_psmi. However, since the code restricts
> disable_vram_page_offline to XE_CRESCENTISLAND (CRI), it seems this
> restriction text was intended for the new attribute instead.
>
> Additionally, placing the new text here pushes the original "This attribute can
> only be set before binding to the device." text down into the
> disable_vram_page_offline section, which removes it from the enable_psmi
> section where it previously belonged.
Nit, will not block. Will fix in follow up series if this is not blocked.
Tejas
>
> > + *
> > + * Disable VRAM page offline:
> > + * ----------------------------
> > + *
> > + * 0, n, N, false - Do not disable (Offlining is active - default)
> > + * 1, y, Y, true - Disable vram page offline (Logging only)
> > + *
> > + * Example to disable VRAM offline::
> > + *
> > + * # echo 1 >
> /sys/kernel/config/xe/0000:03:00.0/disable_vram_page_offline
> > + *
> > * This attribute can only be set before binding to the device.
> > *
> > * Context restore BB
>
> --
> Sashiko AI review ·
> https://sashiko.dev/#/patchset/20260902145343.465686-17-
> tejas.upadhyay@intel.com?part=10
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH V20 11/15] drm/xe/ras: Cache disable_vram_page_offline policy at init
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (9 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 10/15] drm/xe/configfs: Add disable_vram_page_offline attribute Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 14:53 ` [PATCH V20 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler Tejas Upadhyay
` (7 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Michal Wajdeczko
The configfs disable_vram_page_offline attribute can only be
set before device bind, so its value is immutable at runtime.
Cache it in struct xe_drm_ras during xe_ras_init() to avoid
repeated configfs lookups on every fault.
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
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 | 9 +++++++++
2 files changed, 12 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..0be218ba2db7 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];
+
+ /** @disable_vram_page_offline: cached configfs policy, immutable after init */
+ bool disable_vram_page_offline;
};
#endif
diff --git a/drivers/gpu/drm/xe/xe_ras.c b/drivers/gpu/drm/xe/xe_ras.c
index de4cb9ef7355..7a85735c57d5 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"
@@ -915,6 +916,14 @@ void xe_ras_init(struct xe_device *xe)
{
int ret;
+ /*
+ * TODO: Replace platform check with xe->info.has_disable_vram_page_offline
+ * once the feature flag is plumbed through device info.
+ */
+ if (xe->info.platform == XE_CRESCENTISLAND)
+ xe->ras.disable_vram_page_offline =
+ xe_configfs_get_disable_vram_page_offline(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] 38+ messages in thread* [PATCH V20 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (10 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 11/15] drm/xe/ras: Cache disable_vram_page_offline policy at init Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 16:48 ` sashiko-bot
2026-09-02 18:31 ` Michal Wajdeczko
2026-09-02 14:53 ` [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
` (6 subsequent siblings)
18 siblings, 2 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Michal Wajdeczko
Before reserving a page at a faulting address, check the cached
disable_vram_page_offline policy from xe->ras. If the policy is
enabled (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.
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
index 0ab92bc3c699..00569c5279a8 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -21,6 +21,7 @@
#include "xe_lrc.h"
#include "xe_mmio.h"
#include "xe_pm.h"
+#include "xe_printk.h"
#include "xe_res_cursor.h"
#include "xe_ttm_stolen_mgr.h"
#include "xe_ttm_vram_mgr.h"
@@ -906,6 +907,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.disable_vram_page_offline) {
+ xe_err(xe, "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] 38+ messages in thread* Re: [PATCH V20 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler
2026-09-02 14:53 ` [PATCH V20 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler Tejas Upadhyay
@ 2026-09-02 16:48 ` sashiko-bot
2026-09-02 17:57 ` Upadhyay, Tejas
2026-09-02 18:31 ` Michal Wajdeczko
1 sibling, 1 reply; 38+ messages in thread
From: sashiko-bot @ 2026-09-02 16:48 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] Unratelimited error logging in the VRAM address fault handler can cause dmesg flooding and DoS.
--
commit 5bfee849427fab2b54c95eec2934afe083fd4e87
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
drm/xe/vram: Check disable_vram_page_offline policy in fault handler
This commit introduces a check in the VRAM address fault handler to verify the
disable_vram_page_offline policy. If enabled, it logs the corrupted address
and returns -EOPNOTSUPP so that RAS can report it without attempting to offline
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 0ab92bc3c6998..00569c5279a83 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
[ ... ]
> @@ -906,6 +907,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.disable_vram_page_offline) {
> + xe_err(xe, "0x%llx is reported as corrupted address by HW\n",
> + addr);
[Severity: Medium]
Since this page is intentionally kept online and not offlined, can a corrupted
VRAM page accessed in a tight loop by a userspace application, or polled
continuously by the hardware, cause a log flood here?
Could this use a rate-limited logging function to prevent a potential local
Denial of Service (DoS) from continuous dmesg writes, especially on systems
with serial consoles?
> + 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/20260902145343.465686-17-tejas.upadhyay@intel.com?part=12
^ permalink raw reply [flat|nested] 38+ messages in thread* RE: [PATCH V20 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler
2026-09-02 16:48 ` sashiko-bot
@ 2026-09-02 17:57 ` Upadhyay, Tejas
0 siblings, 0 replies; 38+ messages in thread
From: Upadhyay, Tejas @ 2026-09-02 17:57 UTC (permalink / raw)
To: sashiko-reviews@lists.linux.dev; +Cc: intel-xe@lists.freedesktop.org
> -----Original Message-----
> From: sashiko-bot@kernel.org <sashiko-bot@kernel.org>
> Sent: 02 September 2026 22:18
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org
> Subject: Re: [PATCH V20 12/15] drm/xe/vram: Check
> disable_vram_page_offline policy in fault handler
>
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s)
> to consider:
> - [Medium] Unratelimited error logging in the VRAM address fault handler can
> cause dmesg flooding and DoS.
> --
>
> commit 5bfee849427fab2b54c95eec2934afe083fd4e87
> Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
>
> drm/xe/vram: Check disable_vram_page_offline policy in fault handler
>
> This commit introduces a check in the VRAM address fault handler to verify
> the disable_vram_page_offline policy. If enabled, it logs the corrupted address
> and returns -EOPNOTSUPP so that RAS can report it without attempting to
> offline 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 0ab92bc3c6998..00569c5279a83 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> [ ... ]
> > @@ -906,6 +907,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.disable_vram_page_offline) {
> > + xe_err(xe, "0x%llx is reported as corrupted address by HW\n",
> > + addr);
>
> [Severity: Medium]
> Since this page is intentionally kept online and not offlined, can a corrupted
> VRAM page accessed in a tight loop by a userspace application, or polled
> continuously by the hardware, cause a log flood here?
>
> Could this use a rate-limited logging function to prevent a potential local Denial
> of Service (DoS) from continuous dmesg writes, especially on systems with
> serial consoles?
Not expecting amount of errors, which can flood. So what we have looks ok.
Tejas
>
> > + 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/20260902145343.465686-17-
> tejas.upadhyay@intel.com?part=12
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH V20 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler
2026-09-02 14:53 ` [PATCH V20 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler Tejas Upadhyay
2026-09-02 16:48 ` sashiko-bot
@ 2026-09-02 18:31 ` Michal Wajdeczko
1 sibling, 0 replies; 38+ messages in thread
From: Michal Wajdeczko @ 2026-09-02 18:31 UTC (permalink / raw)
To: Tejas Upadhyay, intel-xe, Koujalagi, Mallesh, rodrigo.vivi
Cc: himal.prasad.ghimiray, Matthew Brost
On 9/2/2026 4:53 PM, Tejas Upadhyay wrote:
> Before reserving a page at a faulting address, check the cached
> disable_vram_page_offline policy from xe->ras. If the policy is
> enabled (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.
>
> Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
> drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index 0ab92bc3c699..00569c5279a8 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -21,6 +21,7 @@
> #include "xe_lrc.h"
> #include "xe_mmio.h"
> #include "xe_pm.h"
> +#include "xe_printk.h"
> #include "xe_res_cursor.h"
> #include "xe_ttm_stolen_mgr.h"
> #include "xe_ttm_vram_mgr.h"
> @@ -906,6 +907,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.disable_vram_page_offline) {
shouldn't this be checked by the caller?
here it looks like a layer violation
> + xe_err(xe, "0x%llx is reported as corrupted address by HW\n",
> + addr);
shouldn't we use xe_log() for this?
and also done by the caller?
> + 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] 38+ messages in thread
* [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (11 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 16:56 ` sashiko-bot
2026-09-02 18:36 ` Michal Wajdeczko
2026-09-02 14:53 ` [PATCH V20 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
` (5 subsequent siblings)
18 siblings, 2 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
Tejas Upadhyay, Michal Wajdeczko
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
v2(Sashikoi/Michal/Himal):
-Remove block iteration, use offline and queue list only
-Move platform check inside api
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
drivers/gpu/drm/xe/xe_debugfs.c | 3 ++
drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 59 ++++++++++++++++++++++
drivers/gpu/drm/xe/xe_ttm_vram_mgr.h | 2 +
drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h | 2 +
4 files changed, 66 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
index 28135f84e286..cb24e001b142 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,8 @@ void xe_debugfs_register(struct xe_device *xe)
if (man)
ttm_resource_manager_create_debugfs(man, root, "stolen_mm");
+ 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 00569c5279a8..d9da2454d968 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>
@@ -917,3 +918,61 @@ 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 xe_ttm_vram_mgr *mgr;
+ struct xe_tile *tile;
+ u8 id;
+
+ man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
+ if (man)
+ /* TODO Hook with RAS to show max_pages fetched from FW */
+ 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) {
+ u64 pfn;
+
+ pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
+ seq_printf(m, "0x%016llx : 0x%016lx : R\n", pfn, PAGE_SIZE);
+ }
+
+ list_for_each_entry_rcu(pos, &mgr->queued_pages, queued_link) {
+ u64 pfn;
+
+ pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
+ seq_printf(m, "0x%016llx : 0x%016lx : %c\n",
+ pfn, PAGE_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)
+{
+ /*
+ * TODO: Replace platform check with xe->info
+ * once the feature flag is plumbed through device info.
+ */
+ if (xe->info.platform != XE_CRESCENTISLAND)
+ return;
+ 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] 38+ messages in thread* Re: [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs
2026-09-02 14:53 ` [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
@ 2026-09-02 16:56 ` sashiko-bot
2026-09-02 18:00 ` Upadhyay, Tejas
2026-09-02 18:36 ` Michal Wajdeczko
1 sibling, 1 reply; 38+ messages in thread
From: sashiko-bot @ 2026-09-02 16:56 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: intel-xe
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Low] Debugfs output computes GPU VRAM page frame numbers and sizes using host CPU macros (PAGE_SHIFT and PAGE_SIZE), causing silent truncation and incorrect reporting on architectures with non-4K CPU pages.
- [Low] The VRAM max_pages limit is printed globally using only tile 0's manager, ignoring limits of other tiles on multi-tile devices.
--
commit c12841d073a619e5edeb8c8306adf6fd03042edd
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
drm/xe: Expose bad VRAM pages via debugfs
This commit adds a debugfs file to show offlined and queued VRAM pages
across all tiles, displaying 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
> index 00569c5279a83..d9da2454d968e 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
[ ... ]
> @@ -917,3 +918,61 @@ 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 xe_ttm_vram_mgr *mgr;
> + struct xe_tile *tile;
> + u8 id;
> +
> + man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
> + if (man)
> + /* TODO Hook with RAS to show max_pages fetched from FW */
> + seq_printf(m, "max_pages: %d\n",
> + to_xe_ttm_vram_mgr(man)->max_pages);
[Severity: Low]
Does this correctly represent the limit for multi-tile devices?
By querying only the manager for XE_PL_VRAM0, it seems the max_pages
value is printed as a global limit, which might ignore independent
offline queue limits configured on subsequent tiles.
> +
> + 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) {
> + u64 pfn;
> +
> + pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> + seq_printf(m, "0x%016llx : 0x%016lx : R\n", pfn, PAGE_SIZE);
[Severity: Low]
Can this cause incorrect PFN calculation and page size reporting on
architectures with a non-4K CPU page size?
Using the host CPU macros PAGE_SHIFT and PAGE_SIZE to compute GPU VRAM
addresses couples the hardware memory topology to host CPU page boundaries.
On a system with 64K CPU pages, shifting the 4K-aligned GPU address by 16
truncates the lower 4 bits of the GPU PFN, and reports 64K as the VRAM page
size instead of 4K.
> + }
> +
> + list_for_each_entry_rcu(pos, &mgr->queued_pages, queued_link) {
> + u64 pfn;
> +
> + pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> + seq_printf(m, "0x%016llx : 0x%016lx : %c\n",
> + pfn, PAGE_SIZE, pos->status ? 'F' : 'P');
[Severity: Low]
This has the same PAGE_SHIFT and PAGE_SIZE host CPU macro coupling as
above, which may truncate the PFN and report the wrong size on non-4K CPU
architectures.
> + }
> +
> + rcu_read_unlock();
> + }
> +
> + return 0;
> +}
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=13
^ permalink raw reply [flat|nested] 38+ messages in thread* RE: [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs
2026-09-02 16:56 ` sashiko-bot
@ 2026-09-02 18:00 ` Upadhyay, Tejas
2026-09-02 23:08 ` Matthew Brost
0 siblings, 1 reply; 38+ messages in thread
From: Upadhyay, Tejas @ 2026-09-02 18:00 UTC (permalink / raw)
To: sashiko-reviews@lists.linux.dev; +Cc: intel-xe@lists.freedesktop.org
> -----Original Message-----
> From: sashiko-bot@kernel.org <sashiko-bot@kernel.org>
> Sent: 02 September 2026 22:27
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org
> Subject: Re: [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs
>
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s)
> to consider:
> - [Low] Debugfs output computes GPU VRAM page frame numbers and sizes
> using host CPU macros (PAGE_SHIFT and PAGE_SIZE), causing silent truncation
> and incorrect reporting on architectures with non-4K CPU pages.
> - [Low] The VRAM max_pages limit is printed globally using only tile 0's
> manager, ignoring limits of other tiles on multi-tile devices.
> --
>
> commit c12841d073a619e5edeb8c8306adf6fd03042edd
> Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
>
> drm/xe: Expose bad VRAM pages via debugfs
>
> This commit adds a debugfs file to show offlined and queued VRAM pages
> across all tiles, displaying 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
> > index 00569c5279a83..d9da2454d968e 100644
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
>
> [ ... ]
>
> > @@ -917,3 +918,61 @@ 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 xe_ttm_vram_mgr *mgr;
> > + struct xe_tile *tile;
> > + u8 id;
> > +
> > + man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
> > + if (man)
> > + /* TODO Hook with RAS to show max_pages fetched from FW
> */
> > + seq_printf(m, "max_pages: %d\n",
> > + to_xe_ttm_vram_mgr(man)->max_pages);
>
> [Severity: Low]
> Does this correctly represent the limit for multi-tile devices?
>
> By querying only the manager for XE_PL_VRAM0, it seems the max_pages
> value is printed as a global limit, which might ignore independent offline queue
> limits configured on subsequent tiles.
This will come from RAS post integration with RAS and it will be same for all tile.
>
> > +
> > + 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) {
> > + u64 pfn;
> > +
> > + pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> > + seq_printf(m, "0x%016llx : 0x%016lx : R\n", pfn,
> PAGE_SIZE);
>
> [Severity: Low]
> Can this cause incorrect PFN calculation and page size reporting on
> architectures with a non-4K CPU page size?
>
> Using the host CPU macros PAGE_SHIFT and PAGE_SIZE to compute GPU
> VRAM addresses couples the hardware memory topology to host CPU page
> boundaries.
> On a system with 64K CPU pages, shifting the 4K-aligned GPU address by 16
> truncates the lower 4 bits of the GPU PFN, and reports 64K as the VRAM page
> size instead of 4K.
We have 4K aligned pages everywhere so for CRI it covers alright.
Tejas
>
> > + }
> > +
> > + list_for_each_entry_rcu(pos, &mgr->queued_pages,
> queued_link) {
> > + u64 pfn;
> > +
> > + pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> > + seq_printf(m, "0x%016llx : 0x%016lx : %c\n",
> > + pfn, PAGE_SIZE, pos->status ? 'F' : 'P');
>
> [Severity: Low]
> This has the same PAGE_SHIFT and PAGE_SIZE host CPU macro coupling as
> above, which may truncate the PFN and report the wrong size on non-4K CPU
> architectures.
>
> > + }
> > +
> > + rcu_read_unlock();
> > + }
> > +
> > + return 0;
> > +}
>
> [ ... ]
>
> --
> Sashiko AI review ·
> https://sashiko.dev/#/patchset/20260902145343.465686-17-
> tejas.upadhyay@intel.com?part=13
^ permalink raw reply [flat|nested] 38+ messages in thread* Re: [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs
2026-09-02 18:00 ` Upadhyay, Tejas
@ 2026-09-02 23:08 ` Matthew Brost
0 siblings, 0 replies; 38+ messages in thread
From: Matthew Brost @ 2026-09-02 23:08 UTC (permalink / raw)
To: Upadhyay, Tejas
Cc: sashiko-reviews@lists.linux.dev, intel-xe@lists.freedesktop.org
On Wed, Sep 02, 2026 at 06:00:03PM +0000, Upadhyay, Tejas wrote:
>
>
> > -----Original Message-----
> > From: sashiko-bot@kernel.org <sashiko-bot@kernel.org>
> > Sent: 02 September 2026 22:27
> > To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> > Cc: intel-xe@lists.freedesktop.org
> > Subject: Re: [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs
> >
> > Thank you for your contribution! Sashiko AI review found 2 potential issue(s)
> > to consider:
> > - [Low] Debugfs output computes GPU VRAM page frame numbers and sizes
> > using host CPU macros (PAGE_SHIFT and PAGE_SIZE), causing silent truncation
> > and incorrect reporting on architectures with non-4K CPU pages.
> > - [Low] The VRAM max_pages limit is printed globally using only tile 0's
> > manager, ignoring limits of other tiles on multi-tile devices.
> > --
> >
> > commit c12841d073a619e5edeb8c8306adf6fd03042edd
> > Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
> >
> > drm/xe: Expose bad VRAM pages via debugfs
> >
> > This commit adds a debugfs file to show offlined and queued VRAM pages
> > across all tiles, displaying 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
> > > index 00569c5279a83..d9da2454d968e 100644
> > > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> >
> > [ ... ]
> >
> > > @@ -917,3 +918,61 @@ 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 xe_ttm_vram_mgr *mgr;
> > > + struct xe_tile *tile;
> > > + u8 id;
> > > +
> > > + man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
> > > + if (man)
> > > + /* TODO Hook with RAS to show max_pages fetched from FW
> > */
> > > + seq_printf(m, "max_pages: %d\n",
> > > + to_xe_ttm_vram_mgr(man)->max_pages);
> >
> > [Severity: Low]
> > Does this correctly represent the limit for multi-tile devices?
> >
> > By querying only the manager for XE_PL_VRAM0, it seems the max_pages
> > value is printed as a global limit, which might ignore independent offline queue
> > limits configured on subsequent tiles.
>
> This will come from RAS post integration with RAS and it will be same for all tile.
>
> >
> > > +
> > > + 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) {
> > > + u64 pfn;
> > > +
> > > + pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> > > + seq_printf(m, "0x%016llx : 0x%016lx : R\n", pfn,
> > PAGE_SIZE);
> >
> > [Severity: Low]
> > Can this cause incorrect PFN calculation and page size reporting on
> > architectures with a non-4K CPU page size?
> >
> > Using the host CPU macros PAGE_SHIFT and PAGE_SIZE to compute GPU
> > VRAM addresses couples the hardware memory topology to host CPU page
> > boundaries.
> > On a system with 64K CPU pages, shifting the 4K-aligned GPU address by 16
> > truncates the lower 4 bits of the GPU PFN, and reports 64K as the VRAM page
> > size instead of 4K.
>
> We have 4K aligned pages everywhere so for CRI it covers alright.
>
I think you use SZ_4K in a bunch of places in this series where you
actually want PAGE_SIZE.
xe_ttm_vram_mgr_init uses PAGE_SIZE no SZ_4K, in practice these are
value but using PAGE_SIZE is correct for future proofing or possibly
allowing non-x86 CPUs to plug into a dGPU.
Matt
> Tejas
> >
> > > + }
> > > +
> > > + list_for_each_entry_rcu(pos, &mgr->queued_pages,
> > queued_link) {
> > > + u64 pfn;
> > > +
> > > + pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> > > + seq_printf(m, "0x%016llx : 0x%016lx : %c\n",
> > > + pfn, PAGE_SIZE, pos->status ? 'F' : 'P');
> >
> > [Severity: Low]
> > This has the same PAGE_SHIFT and PAGE_SIZE host CPU macro coupling as
> > above, which may truncate the PFN and report the wrong size on non-4K CPU
> > architectures.
> >
> > > + }
> > > +
> > > + rcu_read_unlock();
> > > + }
> > > +
> > > + return 0;
> > > +}
> >
> > [ ... ]
> >
> > --
> > Sashiko AI review ·
> > https://sashiko.dev/#/patchset/20260902145343.465686-17-
> > tejas.upadhyay@intel.com?part=13
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs
2026-09-02 14:53 ` [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
2026-09-02 16:56 ` sashiko-bot
@ 2026-09-02 18:36 ` Michal Wajdeczko
1 sibling, 0 replies; 38+ messages in thread
From: Michal Wajdeczko @ 2026-09-02 18:36 UTC (permalink / raw)
To: Tejas Upadhyay, intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost
On 9/2/2026 4:53 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
>
> v2(Sashikoi/Michal/Himal):
> -Remove block iteration, use offline and queue list only
> -Move platform check inside api
>
> Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
> drivers/gpu/drm/xe/xe_debugfs.c | 3 ++
> drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 59 ++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_ttm_vram_mgr.h | 2 +
> drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h | 2 +
> 4 files changed, 66 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
> index 28135f84e286..cb24e001b142 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,8 @@ void xe_debugfs_register(struct xe_device *xe)
> if (man)
> ttm_resource_manager_create_debugfs(man, root, "stolen_mm");
>
> + 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 00569c5279a8..d9da2454d968 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>
> @@ -917,3 +918,61 @@ 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 xe_ttm_vram_mgr *mgr;
> + struct xe_tile *tile;
> + u8 id;
> +
> + man = ttm_manager_type(&xe->ttm, XE_PL_VRAM0);
> + if (man)
> + /* TODO Hook with RAS to show max_pages fetched from FW */
> + 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) {
> + u64 pfn;
> +
> + pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> + seq_printf(m, "0x%016llx : 0x%016lx : R\n", pfn, PAGE_SIZE);
> + }
> +
> + list_for_each_entry_rcu(pos, &mgr->queued_pages, queued_link) {
> + u64 pfn;
> +
> + pfn = (pos->addr + vr->dpa_base) >> PAGE_SHIFT;
> + seq_printf(m, "0x%016llx : 0x%016lx : %c\n",
> + pfn, PAGE_SIZE, pos->status ? 'F' : 'P');
> + }
> +
> + rcu_read_unlock();
> + }
> +
> + return 0;
> +}
> +DEFINE_SHOW_ATTRIBUTE(vram_bad_pages);
> +
missing kernel-doc
> +void xe_ttm_vram_debugfs_init(struct xe_device *xe, struct dentry *root)
> +{
> + /*
> + * TODO: Replace platform check with xe->info
> + * once the feature flag is plumbed through device info.
> + */
> + if (xe->info.platform != XE_CRESCENTISLAND)
> + return;
> + 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);
nit: I would put this declaration closer to other init() functions
> 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] 38+ messages in thread
* [PATCH V20 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (12 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 13/15] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 17:10 ` sashiko-bot
2026-09-02 14:53 ` [PATCH V20 15/15] drm/xe: Add fault-inject based VRAM page offline injection Tejas Upadhyay
` (4 subsequent siblings)
18 siblings, 1 reply; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe
Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
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.
v5 (Sashiko/MattB):
- Take the write lock for the traversal to tag ban_reason
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 | 27 ++++++++++++++++++
include/uapi/drm/xe_drm.h | 18 +++++++++++-
5 files changed, 82 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 d9da2454d968..3c17f906a549 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>
@@ -623,6 +624,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;
@@ -637,7 +639,30 @@ 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) {
+ /*
+ * Must be the write lock: send_tlb_inval_ctx_ppgtt()
+ * mutates this list (list_move_tail() onto an on-stack
+ * head) while holding only the read lock, relying on
+ * tlb_inval->seqno_lock to keep itself the sole
+ * mutator. Traversing it under down_read() would let
+ * this walk follow entries onto that stack list.
+ */
+ down_write(&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_write(&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);
}
@@ -649,6 +674,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] 38+ messages in thread* Re: [PATCH V20 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
2026-09-02 14:53 ` [PATCH V20 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
@ 2026-09-02 17:10 ` sashiko-bot
2026-09-02 23:12 ` Matthew Brost
0 siblings, 1 reply; 38+ messages in thread
From: sashiko-bot @ 2026-09-02 17:10 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] Incomplete and inconsistent queue tagging for `PAGE_OFFLINE` ban reason due to mutually exclusive list iteration in `xe_ttm_vram_purge_page()`.
- [Medium] Missing read memory barrier (`smp_rmb`) in `guc_exec_queue_reset_status()` allows speculative loads to mask the `PAGE_OFFLINE` ban reason.
- [Medium] Multi-queue primary status check in `guc_exec_queue_reset_status()` unconditionally masks the `PAGE_OFFLINE` reason for secondary queues.
--
commit 461fac78c1238596fc6141993bb5f0e31fd92773
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
Subject: drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
This commit extends the queue ban property UAPI to return a bitmask of ban
reasons rather than a boolean. It introduces GPU_HANG and PAGE_OFFLINE
reasons, tracking these via a new ban_reason atomic variable in xe_exec_queue.
> --- a/drivers/gpu/drm/xe/xe_guc_submit.c
> +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
[ ... ]
> @@ -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;
> + }
[Severity: Medium]
When querying a secondary queue that was individually purged and killed
due to page offlining, won't this check unconditionally return the primary
queue's default status (GPU_HANG)? Because the primary queue wasn't explicitly
tagged by the purge, the secondary queue's PAGE_OFFLINE reason gets masked.
> +
> + 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;
[Severity: Medium]
Is a read memory barrier (smp_rmb) missing here?
In xe_ttm_vram_purge_page() located in drivers/gpu/drm/xe/xe_ttm_vram_mgr.c,
ban_reason is updated and then smp_wmb() is called before killing the VM
or queue. Concurrently, guc_exec_queue_reset_status() reads the state with
a relaxed load in exec_queue_killed_or_banned_or_wedged() and conditionally
reads ban_reason with an acquire load.
Without an smp_rmb() between the state load and the ban_reason load, the CPU
could speculatively load the old ban_reason (0) before observing the killed
state, resulting in userspace receiving a false GPU_HANG.
> + return reason;
> + }
> +
> + return 0;
> }
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
[ ... ]
> @@ -637,7 +639,30 @@ 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) {
> + /*
> + * Must be the write lock: send_tlb_inval_ctx_ppgtt()
> + * mutates this list (list_move_tail() onto an on-stack
> + * head) while holding only the read lock, relying on
> + * tlb_inval->seqno_lock to keep itself the sole
> + * mutator. Traversing it under down_read() would let
> + * this walk follow entries onto that stack list.
> + */
> + down_write(&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_write(&vm->exec_queues.lock);
> + } else {
> + list_for_each_entry(eq, &vm->preempt.exec_queues, lr.link)
> + atomic_or(q_flag, &eq->ban_reason);
> + }
[Severity: High]
Does this mutually exclusive check cause PAGE_OFFLINE to be missed for certain
queues?
The lists vm->exec_queues.list and vm->preempt.exec_queues contain disjoint sets
of queues. VM_BIND queues are explicitly excluded from vm->exec_queues.list, and
standard short-running queues are not in vm->preempt.exec_queues.
By iterating only one list based on the unrelated has_ctx_tlb_inval hardware
feature, the driver selectively tags only a subset of queues, leaving the
remaining offlined queues to falsely report a GPU_HANG.
> + smp_wmb(); /* Force all queue bits to be visible before killing the VM */
> xe_vm_kill(vm, true);
> up_write(&vm->lock);
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=14
^ permalink raw reply [flat|nested] 38+ messages in thread* Re: [PATCH V20 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
2026-09-02 17:10 ` sashiko-bot
@ 2026-09-02 23:12 ` Matthew Brost
0 siblings, 0 replies; 38+ messages in thread
From: Matthew Brost @ 2026-09-02 23:12 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Tejas Upadhyay, intel-xe
On Wed, Sep 02, 2026 at 05:10:59PM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
> - [High] Incomplete and inconsistent queue tagging for `PAGE_OFFLINE` ban reason due to mutually exclusive list iteration in `xe_ttm_vram_purge_page()`.
> - [Medium] Missing read memory barrier (`smp_rmb`) in `guc_exec_queue_reset_status()` allows speculative loads to mask the `PAGE_OFFLINE` ban reason.
> - [Medium] Multi-queue primary status check in `guc_exec_queue_reset_status()` unconditionally masks the `PAGE_OFFLINE` reason for secondary queues.
> --
>
> commit 461fac78c1238596fc6141993bb5f0e31fd92773
> Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
> Subject: drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
>
> This commit extends the queue ban property UAPI to return a bitmask of ban
> reasons rather than a boolean. It introduces GPU_HANG and PAGE_OFFLINE
> reasons, tracking these via a new ban_reason atomic variable in xe_exec_queue.
>
> > --- a/drivers/gpu/drm/xe/xe_guc_submit.c
> > +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
> [ ... ]
> > @@ -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;
> > + }
>
> [Severity: Medium]
> When querying a secondary queue that was individually purged and killed
> due to page offlining, won't this check unconditionally return the primary
> queue's default status (GPU_HANG)? Because the primary queue wasn't explicitly
> tagged by the purge, the secondary queue's PAGE_OFFLINE reason gets masked.
>
> > +
> > + 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;
>
> [Severity: Medium]
> Is a read memory barrier (smp_rmb) missing here?
>
> In xe_ttm_vram_purge_page() located in drivers/gpu/drm/xe/xe_ttm_vram_mgr.c,
> ban_reason is updated and then smp_wmb() is called before killing the VM
> or queue. Concurrently, guc_exec_queue_reset_status() reads the state with
> a relaxed load in exec_queue_killed_or_banned_or_wedged() and conditionally
> reads ban_reason with an acquire load.
>
> Without an smp_rmb() between the state load and the ban_reason load, the CPU
> could speculatively load the old ban_reason (0) before observing the killed
> state, resulting in userspace receiving a false GPU_HANG.
>
> > + return reason;
> > + }
> > +
> > + return 0;
> > }
>
> > --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> > +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> [ ... ]
> > @@ -637,7 +639,30 @@ 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) {
> > + /*
> > + * Must be the write lock: send_tlb_inval_ctx_ppgtt()
> > + * mutates this list (list_move_tail() onto an on-stack
> > + * head) while holding only the read lock, relying on
> > + * tlb_inval->seqno_lock to keep itself the sole
> > + * mutator. Traversing it under down_read() would let
> > + * this walk follow entries onto that stack list.
> > + */
> > + down_write(&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_write(&vm->exec_queues.lock);
> > + } else {
> > + list_for_each_entry(eq, &vm->preempt.exec_queues, lr.link)
> > + atomic_or(q_flag, &eq->ban_reason);
> > + }
>
> [Severity: High]
> Does this mutually exclusive check cause PAGE_OFFLINE to be missed for certain
> queues?
>
> The lists vm->exec_queues.list and vm->preempt.exec_queues contain disjoint sets
> of queues. VM_BIND queues are explicitly excluded from vm->exec_queues.list, and
> standard short-running queues are not in vm->preempt.exec_queues.
>
> By iterating only one list based on the unrelated has_ctx_tlb_inval hardware
> feature, the driver selectively tags only a subset of queues, leaving the
> remaining offlined queues to falsely report a GPU_HANG.
>
This is right - we should probably just use exec_queues.list. I have
various code floating around which use exec_queues.list regardless if
info.has_ctx_tlb_inval is enabled. We should probably extract that into
a standalone patch and then fixup this code. Another thing we mostly
likely want to do is kill all exec queues too.
Both can be done in a follow up. Can we get a Jira filed for this?
Matt
> > + smp_wmb(); /* Force all queue bits to be visible before killing the VM */
> > xe_vm_kill(vm, true);
> > up_write(&vm->lock);
> > }
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260902145343.465686-17-tejas.upadhyay@intel.com?part=14
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH V20 15/15] drm/xe: Add fault-inject based VRAM page offline injection
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (13 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
@ 2026-09-02 14:53 ` Tejas Upadhyay
2026-09-02 17:02 ` ✗ CI.checkpatch: warning for Add memory page offlining support (rev24) Patchwork
` (3 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Tejas Upadhyay @ 2026-09-02 14:53 UTC (permalink / raw)
To: intel-xe; +Cc: himal.prasad.ghimiray, rodrigo.vivi, Matthew Brost,
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)
v6(Himal):
- Add warning to rebind driver post test run
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
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
drivers/gpu/drm/xe/xe_debugfs.c | 48 +++++++++++++++++++++++
drivers/gpu/drm/xe/xe_debugfs.h | 2 +
drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 58 ++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_ttm_vram_mgr.h | 1 +
4 files changed, 109 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
index cb24e001b142..80f62634fae5 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,40 @@ 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;
+
+ xe_warn(xe, "Page offlining test interface accessed. Notice: Offlined or reserved memory pages cannot be reclaimed dynamically. A driver rebind (unbind and bind loop) is required post-test to clean up.\n");
+ 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 +139,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 3c17f906a549..6a954018012a 100644
--- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
@@ -946,6 +946,64 @@ 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.
+ *
+ * Note: Executing this test will permanently retire the allocated
+ * memory tracking pages. The driver must be rebinded (unbind and bind)
+ * post-test execution to reclaim the reserved space, as these pages
+ * cannot be freed or reclaimed dynamically while the current instance
+ * remains active.
+ *
+ * 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] 38+ messages in thread* ✗ CI.checkpatch: warning for Add memory page offlining support (rev24)
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (14 preceding siblings ...)
2026-09-02 14:53 ` [PATCH V20 15/15] drm/xe: Add fault-inject based VRAM page offline injection Tejas Upadhyay
@ 2026-09-02 17:02 ` Patchwork
2026-09-02 17:04 ` ✓ CI.KUnit: success " Patchwork
` (2 subsequent siblings)
18 siblings, 0 replies; 38+ messages in thread
From: Patchwork @ 2026-09-02 17:02 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: intel-xe
== Series Details ==
Series: Add memory page offlining support (rev24)
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
d875049d2b299159a272bd5151994970cdcd1e31
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit ee8bd1bfff88c1a26b8f98014bbd82c47ecb2375
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
Date: Wed Sep 2 20:23:58 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)
v6(Himal):
- Add warning to rebind driver post test run
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
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
+ /mt/dim checkpatch 1ddb465787c65331f609fbe02998ce1643b041c7 drm-intel
dff3e0e16c13 drm/xe: Link VRAM object with gpu buddy
cd41da48d7b0 drm/xe: Link LRC BO and its execution queue with safe lifetime rules
-:7: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#7:
Introduce an execution queue back-pointer (`q`) within `struct xe_bo`, primarily
-:45: WARNING:BAD_SIGN_OFF: Non-standard signature: Co-authored-by:
#45:
Co-authored-by: Copilot
-:45: ERROR:BAD_SIGN_OFF: Unrecognized email address: 'Copilot'
#45:
Co-authored-by: Copilot
total: 1 errors, 2 warnings, 0 checks, 100 lines checked
6cefc976e143 drm/xe: Export xe_ttm_bo_purge()
f6c1071d5cee drm/xe: Handle NULL resource and allow purging of VRAM pages
182cce6f4c1f drm/xe/bo: Make xe_bo_is_user() public
a8d067c4d6e0 drm/xe: Guard teardown paths against purged BOs
8f351bbcecbf drm/xe/vram: Extract buddy allocation and free helpers
5bd9540dc81e drm/xe/vram: Add page offline data structures and lifecycle
8be2e05c08eb drm/xe/vram: Add VRAM page offline fault handler
-:49: WARNING:BAD_SIGN_OFF: Non-standard signature: Co-authored-by:
#49:
Co-authored-by: Copilot
-:49: ERROR:BAD_SIGN_OFF: Unrecognized email address: 'Copilot'
#49:
Co-authored-by: Copilot
total: 1 errors, 1 warnings, 0 checks, 362 lines checked
7aad507c44de drm/xe/configfs: Add disable_vram_page_offline attribute
45d735196c5d drm/xe/ras: Cache disable_vram_page_offline policy at init
5beddc6e63e3 drm/xe/vram: Check disable_vram_page_offline policy in fault handler
d19a8863a078 drm/xe: Expose bad VRAM pages via debugfs
2379b91471c9 drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
ee8bd1bfff88 drm/xe: Add fault-inject based VRAM page offline injection
^ permalink raw reply [flat|nested] 38+ messages in thread* ✓ CI.KUnit: success for Add memory page offlining support (rev24)
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (15 preceding siblings ...)
2026-09-02 17:02 ` ✗ CI.checkpatch: warning for Add memory page offlining support (rev24) Patchwork
@ 2026-09-02 17:04 ` Patchwork
2026-09-02 17:42 ` ✓ Xe.CI.BAT: " Patchwork
2026-09-03 6:57 ` ✓ Xe.CI.FULL: " Patchwork
18 siblings, 0 replies; 38+ messages in thread
From: Patchwork @ 2026-09-02 17:04 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: intel-xe
== Series Details ==
Series: Add memory page offlining support (rev24)
URL : https://patchwork.freedesktop.org/series/161473/
State : success
== Summary ==
+ trap cleanup EXIT
+ kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig')
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig
[17:02:43] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:02:48] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[17:03:08] Starting KUnit Kernel (1/1)...
[17:03:08] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:03:08] ============= refcount_interrupt (4 subtests) ==============
[17:03:08] [PASSED] test_single_irq_change
[17:03:08] [PASSED] test_nested_irq_change
[17:03:08] [PASSED] test_multiple_irq_change
[17:03:08] [PASSED] test_irq_save
[17:03:08] =============== [PASSED] refcount_interrupt ================
[17:03:08] ================= gpu_buddy (14 subtests) ==================
[17:03:08] [PASSED] gpu_test_buddy_alloc_limit
[17:03:08] [PASSED] gpu_test_buddy_alloc_optimistic
[17:03:08] [PASSED] gpu_test_buddy_alloc_pessimistic
[17:03:08] [PASSED] gpu_test_buddy_alloc_pathological
[17:03:08] [PASSED] gpu_test_buddy_alloc_contiguous
[17:03:08] [PASSED] gpu_test_buddy_alloc_clear
[17:03:08] [PASSED] gpu_test_buddy_alloc_range
[17:03:08] [PASSED] gpu_test_buddy_alloc_range_bias
[17:03:09] [PASSED] gpu_test_buddy_fragmentation_performance
[17:03:10] [PASSED] gpu_test_buddy_dirty_tracker_performance
[17:03:10] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[17:03:10] [PASSED] gpu_test_buddy_offset_aligned_allocation
[17:03:10] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[17:03:10] [PASSED] gpu_test_buddy_addr_to_block
[17:03:10] ==================== [PASSED] gpu_buddy ====================
[17:03:10] ============================================================
[17:03:10] Testing complete. Ran 18 tests: passed: 18
[17:03:10] Elapsed time: 26.773s total, 4.351s configuring, 20.504s building, 1.886s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[17:03:10] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:03:12] 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
[17:03:46] Starting KUnit Kernel (1/1)...
[17:03:46] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:03:46] ============= refcount_interrupt (4 subtests) ==============
[17:03:46] [PASSED] test_single_irq_change
[17:03:46] [PASSED] test_nested_irq_change
[17:03:46] [PASSED] test_multiple_irq_change
[17:03:46] [PASSED] test_irq_save
[17:03:46] =============== [PASSED] refcount_interrupt ================
[17:03:46] ================== guc_buf (11 subtests) ===================
[17:03:46] [PASSED] test_smallest
[17:03:46] [PASSED] test_largest
[17:03:46] [PASSED] test_granular
[17:03:46] [PASSED] test_unique
[17:03:46] [PASSED] test_overlap
[17:03:46] [PASSED] test_reusable
[17:03:46] [PASSED] test_too_big
[17:03:46] [PASSED] test_flush
[17:03:46] [PASSED] test_lookup
[17:03:46] [PASSED] test_data
[17:03:46] [PASSED] test_class
[17:03:46] ===================== [PASSED] guc_buf =====================
[17:03:46] =================== guc_dbm (7 subtests) ===================
[17:03:46] [PASSED] test_empty
[17:03:46] [PASSED] test_default
[17:03:46] ======================== test_size ========================
[17:03:46] [PASSED] 4
[17:03:46] [PASSED] 8
[17:03:46] [PASSED] 32
[17:03:46] [PASSED] 256
[17:03:46] ==================== [PASSED] test_size ====================
[17:03:46] ======================= test_reuse ========================
[17:03:46] [PASSED] 4
[17:03:46] [PASSED] 8
[17:03:46] [PASSED] 32
[17:03:46] [PASSED] 256
[17:03:46] =================== [PASSED] test_reuse ====================
[17:03:46] =================== test_range_overlap ====================
[17:03:46] [PASSED] 4
[17:03:46] [PASSED] 8
[17:03:46] [PASSED] 32
[17:03:46] [PASSED] 256
[17:03:46] =============== [PASSED] test_range_overlap ================
[17:03:46] =================== test_range_compact ====================
[17:03:46] [PASSED] 4
[17:03:46] [PASSED] 8
[17:03:46] [PASSED] 32
[17:03:46] [PASSED] 256
[17:03:46] =============== [PASSED] test_range_compact ================
[17:03:46] ==================== test_range_spare =====================
[17:03:46] [PASSED] 4
[17:03:46] [PASSED] 8
[17:03:46] [PASSED] 32
[17:03:46] [PASSED] 256
[17:03:46] ================ [PASSED] test_range_spare =================
[17:03:46] ===================== [PASSED] guc_dbm =====================
[17:03:46] =================== guc_idm (6 subtests) ===================
[17:03:46] [PASSED] bad_init
[17:03:46] [PASSED] no_init
[17:03:46] [PASSED] init_fini
[17:03:46] [PASSED] check_used
[17:03:46] [PASSED] check_quota
[17:03:46] [PASSED] check_all
[17:03:46] ===================== [PASSED] guc_idm =====================
[17:03:46] =============== guc_klv_helpers (9 subtests) ===============
[17:03:46] [PASSED] test_count
[17:03:46] [PASSED] test_encode_u32
[17:03:46] [PASSED] test_encode_u64
[17:03:46] [PASSED] test_encode_string
[17:03:46] [PASSED] test_encode_object_raw
[17:03:46] [PASSED] test_encode_object_klv
[17:03:46] [PASSED] test_encode_object_nested
[17:03:46] [PASSED] test_encode_object_basic
[17:03:46] [PASSED] test_print
[17:03:46] ================= [PASSED] guc_klv_helpers =================
[17:03:46] =================== xe_log (4 subtests) ====================
[17:03:46] [PASSED] demo_cper
[17:03:46] [PASSED] demo_dmesg
[17:03:46] ======================= test_dmesg ========================
[17:03:46] [PASSED] test_fatal
[17:03:46] [PASSED] test_fatal_tile
[17:03:46] [PASSED] test_fatal_gt
[17:03:46] [PASSED] test_fatal_comp
[17:03:46] [PASSED] test_fatal_comp_tile
[17:03:46] [PASSED] test_fatal_comp_gt
[17:03:46] [PASSED] test_fatal_all
[17:03:46] [PASSED] test_recoverable
[17:03:46] [PASSED] test_recoverable_tile
[17:03:46] [PASSED] test_recoverable_gt
[17:03:46] [PASSED] test_recoverable_comp
[17:03:46] [PASSED] test_recoverable_comp_tile
[17:03:46] [PASSED] test_recoverable_comp_gt
[17:03:46] [PASSED] test_recoverable_all
[17:03:46] [PASSED] test_info
[17:03:46] [PASSED] test_info_tile
[17:03:46] [PASSED] test_info_gt
[17:03:46] [PASSED] test_info_err
[17:03:46] [PASSED] test_info_comp
[17:03:46] [PASSED] test_info_comp_tile
[17:03:46] [PASSED] test_info_comp_gt
[17:03:46] [PASSED] test_info_all
[17:03:46] [PASSED] test_hw_fatal
[17:03:46] [PASSED] test_hw_recoverable
[17:03:46] [PASSED] test_hw_corrected
[17:03:46] [PASSED] test_hw_informational
[17:03:46] =================== [PASSED] test_dmesg ====================
[17:03:46] ====================== test_invalid =======================
[17:03:46] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[17:03:46] ================== [SKIPPED] test_invalid ==================
[17:03:46] ===================== [PASSED] xe_log ======================
[17:03:46] ================== no_relay (3 subtests) ===================
[17:03:46] [PASSED] xe_drops_guc2pf_if_not_ready
[17:03:46] [PASSED] xe_drops_guc2vf_if_not_ready
[17:03:46] [PASSED] xe_rejects_send_if_not_ready
[17:03:46] ==================== [PASSED] no_relay =====================
[17:03:46] ================== pf_relay (14 subtests) ==================
[17:03:46] [PASSED] pf_rejects_guc2pf_too_short
[17:03:46] [PASSED] pf_rejects_guc2pf_too_long
[17:03:46] [PASSED] pf_rejects_guc2pf_no_payload
[17:03:46] [PASSED] pf_fails_no_payload
[17:03:46] [PASSED] pf_fails_bad_origin
[17:03:46] [PASSED] pf_fails_bad_type
[17:03:46] [PASSED] pf_txn_reports_error
[17:03:46] [PASSED] pf_txn_sends_pf2guc
[17:03:46] [PASSED] pf_sends_pf2guc
[17:03:46] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[17:03:46] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[17:03:46] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[17:03:46] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[17:03:46] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[17:03:46] ==================== [PASSED] pf_relay =====================
[17:03:46] ================== vf_relay (3 subtests) ===================
[17:03:46] [PASSED] vf_rejects_guc2vf_too_short
[17:03:46] [PASSED] vf_rejects_guc2vf_too_long
[17:03:46] [PASSED] vf_rejects_guc2vf_no_payload
[17:03:46] ==================== [PASSED] vf_relay =====================
[17:03:46] ================ pf_gt_config (9 subtests) =================
[17:03:46] [PASSED] fair_contexts_1vf
[17:03:46] [PASSED] fair_doorbells_1vf
[17:03:46] [PASSED] fair_ggtt_1vf
[17:03:46] ====================== fair_vram_1vf ======================
[17:03:46] [PASSED] 3.50 GiB
[17:03:46] [PASSED] 11.5 GiB
[17:03:46] [PASSED] 15.5 GiB
[17:03:46] [PASSED] 31.5 GiB
[17:03:46] [PASSED] 63.5 GiB
[17:03:46] [PASSED] 1.91 GiB
[17:03:46] ================== [PASSED] fair_vram_1vf ==================
[17:03:46] ================ fair_vram_1vf_admin_only =================
[17:03:46] [PASSED] 3.50 GiB
[17:03:46] [PASSED] 11.5 GiB
[17:03:46] [PASSED] 15.5 GiB
[17:03:46] [PASSED] 31.5 GiB
[17:03:46] [PASSED] 63.5 GiB
[17:03:46] [PASSED] 1.91 GiB
[17:03:46] ============ [PASSED] fair_vram_1vf_admin_only =============
[17:03:46] ====================== fair_contexts ======================
[17:03:46] [PASSED] 1 VF
[17:03:46] [PASSED] 2 VFs
[17:03:46] [PASSED] 3 VFs
[17:03:46] [PASSED] 4 VFs
[17:03:46] [PASSED] 5 VFs
[17:03:46] [PASSED] 6 VFs
[17:03:46] [PASSED] 7 VFs
[17:03:46] [PASSED] 8 VFs
[17:03:46] [PASSED] 9 VFs
[17:03:46] [PASSED] 10 VFs
[17:03:46] [PASSED] 11 VFs
[17:03:46] [PASSED] 12 VFs
[17:03:46] [PASSED] 13 VFs
[17:03:46] [PASSED] 14 VFs
[17:03:46] [PASSED] 15 VFs
[17:03:46] [PASSED] 16 VFs
[17:03:46] [PASSED] 17 VFs
[17:03:46] [PASSED] 18 VFs
[17:03:46] [PASSED] 19 VFs
[17:03:46] [PASSED] 20 VFs
[17:03:46] [PASSED] 21 VFs
[17:03:46] [PASSED] 22 VFs
[17:03:46] [PASSED] 23 VFs
[17:03:46] [PASSED] 24 VFs
[17:03:46] [PASSED] 25 VFs
[17:03:46] [PASSED] 26 VFs
[17:03:46] [PASSED] 27 VFs
[17:03:46] [PASSED] 28 VFs
[17:03:46] [PASSED] 29 VFs
[17:03:46] [PASSED] 30 VFs
[17:03:46] [PASSED] 31 VFs
[17:03:46] [PASSED] 32 VFs
[17:03:46] [PASSED] 33 VFs
[17:03:46] [PASSED] 34 VFs
[17:03:46] [PASSED] 35 VFs
[17:03:47] [PASSED] 36 VFs
[17:03:47] [PASSED] 37 VFs
[17:03:47] [PASSED] 38 VFs
[17:03:47] [PASSED] 39 VFs
[17:03:47] [PASSED] 40 VFs
[17:03:47] [PASSED] 41 VFs
[17:03:47] [PASSED] 42 VFs
[17:03:47] [PASSED] 43 VFs
[17:03:47] [PASSED] 44 VFs
[17:03:47] [PASSED] 45 VFs
[17:03:47] [PASSED] 46 VFs
[17:03:47] [PASSED] 47 VFs
[17:03:47] [PASSED] 48 VFs
[17:03:47] [PASSED] 49 VFs
[17:03:47] [PASSED] 50 VFs
[17:03:47] [PASSED] 51 VFs
[17:03:47] [PASSED] 52 VFs
[17:03:47] [PASSED] 53 VFs
[17:03:47] [PASSED] 54 VFs
[17:03:47] [PASSED] 55 VFs
[17:03:47] [PASSED] 56 VFs
[17:03:47] [PASSED] 57 VFs
[17:03:47] [PASSED] 58 VFs
[17:03:47] [PASSED] 59 VFs
[17:03:47] [PASSED] 60 VFs
[17:03:47] [PASSED] 61 VFs
[17:03:47] [PASSED] 62 VFs
[17:03:47] [PASSED] 63 VFs
[17:03:47] ================== [PASSED] fair_contexts ==================
[17:03:47] ===================== fair_doorbells ======================
[17:03:47] [PASSED] 1 VF
[17:03:47] [PASSED] 2 VFs
[17:03:47] [PASSED] 3 VFs
[17:03:47] [PASSED] 4 VFs
[17:03:47] [PASSED] 5 VFs
[17:03:47] [PASSED] 6 VFs
[17:03:47] [PASSED] 7 VFs
[17:03:47] [PASSED] 8 VFs
[17:03:47] [PASSED] 9 VFs
[17:03:47] [PASSED] 10 VFs
[17:03:47] [PASSED] 11 VFs
[17:03:47] [PASSED] 12 VFs
[17:03:47] [PASSED] 13 VFs
[17:03:47] [PASSED] 14 VFs
[17:03:47] [PASSED] 15 VFs
[17:03:47] [PASSED] 16 VFs
[17:03:47] [PASSED] 17 VFs
[17:03:47] [PASSED] 18 VFs
[17:03:47] [PASSED] 19 VFs
[17:03:47] [PASSED] 20 VFs
[17:03:47] [PASSED] 21 VFs
[17:03:47] [PASSED] 22 VFs
[17:03:47] [PASSED] 23 VFs
[17:03:47] [PASSED] 24 VFs
[17:03:47] [PASSED] 25 VFs
[17:03:47] [PASSED] 26 VFs
[17:03:47] [PASSED] 27 VFs
[17:03:47] [PASSED] 28 VFs
[17:03:47] [PASSED] 29 VFs
[17:03:47] [PASSED] 30 VFs
[17:03:47] [PASSED] 31 VFs
[17:03:47] [PASSED] 32 VFs
[17:03:47] [PASSED] 33 VFs
[17:03:47] [PASSED] 34 VFs
[17:03:47] [PASSED] 35 VFs
[17:03:47] [PASSED] 36 VFs
[17:03:47] [PASSED] 37 VFs
[17:03:47] [PASSED] 38 VFs
[17:03:47] [PASSED] 39 VFs
[17:03:47] [PASSED] 40 VFs
[17:03:47] [PASSED] 41 VFs
[17:03:47] [PASSED] 42 VFs
[17:03:47] [PASSED] 43 VFs
[17:03:47] [PASSED] 44 VFs
[17:03:47] [PASSED] 45 VFs
[17:03:47] [PASSED] 46 VFs
[17:03:47] [PASSED] 47 VFs
[17:03:47] [PASSED] 48 VFs
[17:03:47] [PASSED] 49 VFs
[17:03:47] [PASSED] 50 VFs
[17:03:47] [PASSED] 51 VFs
[17:03:47] [PASSED] 52 VFs
[17:03:47] [PASSED] 53 VFs
[17:03:47] [PASSED] 54 VFs
[17:03:47] [PASSED] 55 VFs
[17:03:47] [PASSED] 56 VFs
[17:03:47] [PASSED] 57 VFs
[17:03:47] [PASSED] 58 VFs
[17:03:47] [PASSED] 59 VFs
[17:03:47] [PASSED] 60 VFs
[17:03:47] [PASSED] 61 VFs
[17:03:47] [PASSED] 62 VFs
[17:03:47] [PASSED] 63 VFs
[17:03:47] ================= [PASSED] fair_doorbells ==================
[17:03:47] ======================== fair_ggtt ========================
[17:03:47] [PASSED] 1 VF
[17:03:47] [PASSED] 2 VFs
[17:03:47] [PASSED] 3 VFs
[17:03:47] [PASSED] 4 VFs
[17:03:47] [PASSED] 5 VFs
[17:03:47] [PASSED] 6 VFs
[17:03:47] [PASSED] 7 VFs
[17:03:47] [PASSED] 8 VFs
[17:03:47] [PASSED] 9 VFs
[17:03:47] [PASSED] 10 VFs
[17:03:47] [PASSED] 11 VFs
[17:03:47] [PASSED] 12 VFs
[17:03:47] [PASSED] 13 VFs
[17:03:47] [PASSED] 14 VFs
[17:03:47] [PASSED] 15 VFs
[17:03:47] [PASSED] 16 VFs
[17:03:47] [PASSED] 17 VFs
[17:03:47] [PASSED] 18 VFs
[17:03:47] [PASSED] 19 VFs
[17:03:47] [PASSED] 20 VFs
[17:03:47] [PASSED] 21 VFs
[17:03:47] [PASSED] 22 VFs
[17:03:47] [PASSED] 23 VFs
[17:03:47] [PASSED] 24 VFs
[17:03:47] [PASSED] 25 VFs
[17:03:47] [PASSED] 26 VFs
[17:03:47] [PASSED] 27 VFs
[17:03:47] [PASSED] 28 VFs
[17:03:47] [PASSED] 29 VFs
[17:03:47] [PASSED] 30 VFs
[17:03:47] [PASSED] 31 VFs
[17:03:47] [PASSED] 32 VFs
[17:03:47] [PASSED] 33 VFs
[17:03:47] [PASSED] 34 VFs
[17:03:47] [PASSED] 35 VFs
[17:03:47] [PASSED] 36 VFs
[17:03:47] [PASSED] 37 VFs
[17:03:47] [PASSED] 38 VFs
[17:03:47] [PASSED] 39 VFs
[17:03:47] [PASSED] 40 VFs
[17:03:47] [PASSED] 41 VFs
[17:03:47] [PASSED] 42 VFs
[17:03:47] [PASSED] 43 VFs
[17:03:47] [PASSED] 44 VFs
[17:03:47] [PASSED] 45 VFs
[17:03:47] [PASSED] 46 VFs
[17:03:47] [PASSED] 47 VFs
[17:03:47] [PASSED] 48 VFs
[17:03:47] [PASSED] 49 VFs
[17:03:47] [PASSED] 50 VFs
[17:03:47] [PASSED] 51 VFs
[17:03:47] [PASSED] 52 VFs
[17:03:47] [PASSED] 53 VFs
[17:03:47] [PASSED] 54 VFs
[17:03:47] [PASSED] 55 VFs
[17:03:47] [PASSED] 56 VFs
[17:03:47] [PASSED] 57 VFs
[17:03:47] [PASSED] 58 VFs
[17:03:47] [PASSED] 59 VFs
[17:03:47] [PASSED] 60 VFs
[17:03:47] [PASSED] 61 VFs
[17:03:47] [PASSED] 62 VFs
[17:03:47] [PASSED] 63 VFs
[17:03:47] ==================== [PASSED] fair_ggtt ====================
[17:03:47] ======================== fair_vram ========================
[17:03:47] [PASSED] 1 VF
[17:03:47] [PASSED] 2 VFs
[17:03:47] [PASSED] 3 VFs
[17:03:47] [PASSED] 4 VFs
[17:03:47] [PASSED] 5 VFs
[17:03:47] [PASSED] 6 VFs
[17:03:47] [PASSED] 7 VFs
[17:03:47] [PASSED] 8 VFs
[17:03:47] [PASSED] 9 VFs
[17:03:47] [PASSED] 10 VFs
[17:03:47] [PASSED] 11 VFs
[17:03:47] [PASSED] 12 VFs
[17:03:47] [PASSED] 13 VFs
[17:03:47] [PASSED] 14 VFs
[17:03:47] [PASSED] 15 VFs
[17:03:47] [PASSED] 16 VFs
[17:03:47] [PASSED] 17 VFs
[17:03:47] [PASSED] 18 VFs
[17:03:47] [PASSED] 19 VFs
[17:03:47] [PASSED] 20 VFs
[17:03:47] [PASSED] 21 VFs
[17:03:47] [PASSED] 22 VFs
[17:03:47] [PASSED] 23 VFs
[17:03:47] [PASSED] 24 VFs
[17:03:47] [PASSED] 25 VFs
[17:03:47] [PASSED] 26 VFs
[17:03:47] [PASSED] 27 VFs
[17:03:47] [PASSED] 28 VFs
[17:03:47] [PASSED] 29 VFs
[17:03:47] [PASSED] 30 VFs
[17:03:47] [PASSED] 31 VFs
[17:03:47] [PASSED] 32 VFs
[17:03:47] [PASSED] 33 VFs
[17:03:47] [PASSED] 34 VFs
[17:03:47] [PASSED] 35 VFs
[17:03:47] [PASSED] 36 VFs
[17:03:47] [PASSED] 37 VFs
[17:03:47] [PASSED] 38 VFs
[17:03:47] [PASSED] 39 VFs
[17:03:47] [PASSED] 40 VFs
[17:03:47] [PASSED] 41 VFs
[17:03:47] [PASSED] 42 VFs
[17:03:47] [PASSED] 43 VFs
[17:03:47] [PASSED] 44 VFs
[17:03:47] [PASSED] 45 VFs
[17:03:47] [PASSED] 46 VFs
[17:03:47] [PASSED] 47 VFs
[17:03:47] [PASSED] 48 VFs
[17:03:47] [PASSED] 49 VFs
[17:03:47] [PASSED] 50 VFs
[17:03:47] [PASSED] 51 VFs
[17:03:47] [PASSED] 52 VFs
[17:03:47] [PASSED] 53 VFs
[17:03:47] [PASSED] 54 VFs
[17:03:47] [PASSED] 55 VFs
[17:03:47] [PASSED] 56 VFs
[17:03:47] [PASSED] 57 VFs
[17:03:47] [PASSED] 58 VFs
[17:03:47] [PASSED] 59 VFs
[17:03:47] [PASSED] 60 VFs
[17:03:47] [PASSED] 61 VFs
[17:03:47] [PASSED] 62 VFs
[17:03:47] [PASSED] 63 VFs
[17:03:47] ==================== [PASSED] fair_vram ====================
[17:03:47] ================== [PASSED] pf_gt_config ===================
[17:03:47] ===================== lmtt (1 subtest) =====================
[17:03:47] ======================== test_ops =========================
[17:03:47] [PASSED] 2-level
[17:03:47] [PASSED] multi-level
[17:03:47] ==================== [PASSED] test_ops =====================
[17:03:47] ====================== [PASSED] lmtt =======================
[17:03:47] ================= sriov_packet (1 subtest) =================
[17:03:47] [PASSED] test_descriptor_init
[17:03:47] ================== [PASSED] sriov_packet ===================
[17:03:47] ================= pf_service (11 subtests) =================
[17:03:47] [PASSED] pf_negotiate_any
[17:03:47] [PASSED] pf_negotiate_base_match
[17:03:47] [PASSED] pf_negotiate_base_newer
[17:03:47] [PASSED] pf_negotiate_base_next
[17:03:47] [SKIPPED] pf_negotiate_base_older (no older minor)
[17:03:47] [PASSED] pf_negotiate_base_prev
[17:03:47] [PASSED] pf_negotiate_latest_match
[17:03:47] [PASSED] pf_negotiate_latest_newer
[17:03:47] [PASSED] pf_negotiate_latest_next
[17:03:47] [SKIPPED] pf_negotiate_latest_older (no older minor)
[17:03:47] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[17:03:47] =================== [PASSED] pf_service ====================
[17:03:47] ================= xe_guc_g2g (2 subtests) ==================
[17:03:47] ============== xe_live_guc_g2g_kunit_default ==============
[17:03:47] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[17:03:47] ============== xe_live_guc_g2g_kunit_allmem ===============
[17:03:47] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[17:03:47] =================== [SKIPPED] xe_guc_g2g ===================
[17:03:47] =================== xe_mocs (2 subtests) ===================
[17:03:47] ================ xe_live_mocs_kernel_kunit ================
[17:03:47] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[17:03:47] ================ xe_live_mocs_reset_kunit =================
[17:03:47] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[17:03:47] ==================== [SKIPPED] xe_mocs =====================
[17:03:47] ================= xe_migrate (2 subtests) ==================
[17:03:47] ================= xe_migrate_sanity_kunit =================
[17:03:47] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[17:03:47] ================== xe_validate_ccs_kunit ==================
[17:03:47] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[17:03:47] =================== [SKIPPED] xe_migrate ===================
[17:03:47] ================== xe_dma_buf (1 subtest) ==================
[17:03:47] ==================== xe_dma_buf_kunit =====================
[17:03:47] ================ [SKIPPED] xe_dma_buf_kunit ================
[17:03:47] =================== [SKIPPED] xe_dma_buf ===================
[17:03:47] ================= xe_bo_shrink (1 subtest) =================
[17:03:47] =================== xe_bo_shrink_kunit ====================
[17:03:47] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[17:03:47] ================== [SKIPPED] xe_bo_shrink ==================
[17:03:47] ==================== xe_bo (2 subtests) ====================
[17:03:47] ================== xe_ccs_migrate_kunit ===================
[17:03:47] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[17:03:47] ==================== xe_bo_evict_kunit ====================
[17:03:47] =============== [SKIPPED] xe_bo_evict_kunit ================
[17:03:47] ===================== [SKIPPED] xe_bo ======================
[17:03:47] =================== xe_any (9 subtests) ====================
[17:03:47] [PASSED] test_to_xe
[17:03:47] [PASSED] test_to_dev
[17:03:47] [PASSED] test_to_pdev
[17:03:47] [PASSED] test_to_drm
[17:03:47] [PASSED] test_if_pdev
[17:03:47] [PASSED] test_if_xe
[17:03:47] [PASSED] test_if_tile
[17:03:47] [PASSED] test_if_gt
[17:03:47] [PASSED] test_to_id
[17:03:47] ===================== [PASSED] xe_any ======================
[17:03:47] ==================== args (13 subtests) ====================
[17:03:47] [PASSED] count_args_test
[17:03:47] [PASSED] call_args_example
[17:03:47] [PASSED] call_args_test
[17:03:47] [PASSED] drop_first_arg_example
[17:03:47] [PASSED] drop_first_arg_test
[17:03:47] [PASSED] first_arg_example
[17:03:47] [PASSED] first_arg_test
[17:03:47] [PASSED] last_arg_example
[17:03:47] [PASSED] last_arg_test
[17:03:47] [PASSED] pick_arg_example
[17:03:47] [PASSED] if_args_example
[17:03:47] [PASSED] if_args_test
[17:03:47] [PASSED] sep_comma_example
[17:03:47] ====================== [PASSED] args =======================
[17:03:47] =================== xe_pci (3 subtests) ====================
[17:03:47] ==================== check_graphics_ip ====================
[17:03:47] [PASSED] 12.00 Xe_LP
[17:03:47] [PASSED] 12.10 Xe_LP+
[17:03:47] [PASSED] 12.55 Xe_HPG
[17:03:47] [PASSED] 12.60 Xe_HPC
[17:03:47] [PASSED] 12.70 Xe_LPG
[17:03:47] [PASSED] 12.71 Xe_LPG
[17:03:47] [PASSED] 12.74 Xe_LPG+
[17:03:47] [PASSED] 20.01 Xe2_HPG
[17:03:47] [PASSED] 20.02 Xe2_HPG
[17:03:47] [PASSED] 20.04 Xe2_LPG
[17:03:47] [PASSED] 30.00 Xe3_LPG
[17:03:47] [PASSED] 30.01 Xe3_LPG
[17:03:47] [PASSED] 30.03 Xe3_LPG
[17:03:47] [PASSED] 30.04 Xe3_LPG
[17:03:47] [PASSED] 30.05 Xe3_LPG
[17:03:47] [PASSED] 35.10 Xe3p_LPG
[17:03:47] [PASSED] 35.11 Xe3p_XPC
[17:03:47] ================ [PASSED] check_graphics_ip ================
[17:03:47] ===================== check_media_ip ======================
[17:03:47] [PASSED] 12.00 Xe_M
[17:03:47] [PASSED] 12.55 Xe_HPM
[17:03:47] [PASSED] 13.00 Xe_LPM+
[17:03:47] [PASSED] 13.01 Xe2_HPM
[17:03:47] [PASSED] 20.00 Xe2_LPM
[17:03:47] [PASSED] 30.00 Xe3_LPM
[17:03:47] [PASSED] 30.02 Xe3_LPM
[17:03:47] [PASSED] 35.00 Xe3p_LPM
[17:03:47] [PASSED] 35.03 Xe3p_HPM
[17:03:47] ================= [PASSED] check_media_ip ==================
[17:03:47] =================== check_platform_desc ===================
[17:03:47] [PASSED] 0x9A60 (TIGERLAKE)
[17:03:47] [PASSED] 0x9A68 (TIGERLAKE)
[17:03:47] [PASSED] 0x9A70 (TIGERLAKE)
[17:03:47] [PASSED] 0x9A40 (TIGERLAKE)
[17:03:47] [PASSED] 0x9A49 (TIGERLAKE)
[17:03:47] [PASSED] 0x9A59 (TIGERLAKE)
[17:03:47] [PASSED] 0x9A78 (TIGERLAKE)
[17:03:47] [PASSED] 0x9AC0 (TIGERLAKE)
[17:03:47] [PASSED] 0x9AC9 (TIGERLAKE)
[17:03:47] [PASSED] 0x9AD9 (TIGERLAKE)
[17:03:47] [PASSED] 0x9AF8 (TIGERLAKE)
[17:03:47] [PASSED] 0x4C80 (ROCKETLAKE)
[17:03:47] [PASSED] 0x4C8A (ROCKETLAKE)
[17:03:47] [PASSED] 0x4C8B (ROCKETLAKE)
[17:03:47] [PASSED] 0x4C8C (ROCKETLAKE)
[17:03:47] [PASSED] 0x4C90 (ROCKETLAKE)
[17:03:47] [PASSED] 0x4C9A (ROCKETLAKE)
[17:03:47] [PASSED] 0x4680 (ALDERLAKE_S)
[17:03:47] [PASSED] 0x4682 (ALDERLAKE_S)
[17:03:47] [PASSED] 0x4688 (ALDERLAKE_S)
[17:03:47] [PASSED] 0x468A (ALDERLAKE_S)
[17:03:47] [PASSED] 0x468B (ALDERLAKE_S)
[17:03:47] [PASSED] 0x4690 (ALDERLAKE_S)
[17:03:47] [PASSED] 0x4692 (ALDERLAKE_S)
[17:03:47] [PASSED] 0x4693 (ALDERLAKE_S)
[17:03:47] [PASSED] 0x46A0 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46A1 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46A2 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46A3 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46A6 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46A8 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46AA (ALDERLAKE_P)
[17:03:47] [PASSED] 0x462A (ALDERLAKE_P)
[17:03:47] [PASSED] 0x4626 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x4628 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46B0 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46B1 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46B2 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46B3 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46C0 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46C1 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46C2 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46C3 (ALDERLAKE_P)
[17:03:47] [PASSED] 0x46D0 (ALDERLAKE_N)
[17:03:47] [PASSED] 0x46D1 (ALDERLAKE_N)
[17:03:47] [PASSED] 0x46D2 (ALDERLAKE_N)
[17:03:47] [PASSED] 0x46D3 (ALDERLAKE_N)
[17:03:47] [PASSED] 0x46D4 (ALDERLAKE_N)
[17:03:47] [PASSED] 0xA721 (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA7A1 (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA7A9 (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA7AC (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA7AD (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA720 (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA7A0 (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA7A8 (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA7AA (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA7AB (ALDERLAKE_P)
[17:03:47] [PASSED] 0xA780 (ALDERLAKE_S)
[17:03:47] [PASSED] 0xA781 (ALDERLAKE_S)
[17:03:47] [PASSED] 0xA782 (ALDERLAKE_S)
[17:03:47] [PASSED] 0xA783 (ALDERLAKE_S)
[17:03:47] [PASSED] 0xA788 (ALDERLAKE_S)
[17:03:47] [PASSED] 0xA789 (ALDERLAKE_S)
[17:03:47] [PASSED] 0xA78A (ALDERLAKE_S)
[17:03:47] [PASSED] 0xA78B (ALDERLAKE_S)
[17:03:47] [PASSED] 0x4905 (DG1)
[17:03:47] [PASSED] 0x4906 (DG1)
[17:03:47] [PASSED] 0x4907 (DG1)
[17:03:47] [PASSED] 0x4908 (DG1)
[17:03:47] [PASSED] 0x4909 (DG1)
[17:03:47] [PASSED] 0x56C0 (DG2)
[17:03:47] [PASSED] 0x56C2 (DG2)
[17:03:47] [PASSED] 0x56C1 (DG2)
[17:03:47] [PASSED] 0x7D51 (METEORLAKE)
[17:03:47] [PASSED] 0x7DD1 (METEORLAKE)
[17:03:47] [PASSED] 0x7D41 (METEORLAKE)
[17:03:47] [PASSED] 0x7D67 (METEORLAKE)
[17:03:47] [PASSED] 0xB640 (METEORLAKE)
[17:03:47] [PASSED] 0x56A0 (DG2)
[17:03:47] [PASSED] 0x56A1 (DG2)
[17:03:47] [PASSED] 0x56A2 (DG2)
[17:03:47] [PASSED] 0x56BE (DG2)
[17:03:47] [PASSED] 0x56BF (DG2)
[17:03:47] [PASSED] 0x5690 (DG2)
[17:03:47] [PASSED] 0x5691 (DG2)
[17:03:47] [PASSED] 0x5692 (DG2)
[17:03:47] [PASSED] 0x56A5 (DG2)
[17:03:47] [PASSED] 0x56A6 (DG2)
[17:03:47] [PASSED] 0x56B0 (DG2)
[17:03:47] [PASSED] 0x56B1 (DG2)
[17:03:47] [PASSED] 0x56BA (DG2)
[17:03:47] [PASSED] 0x56BB (DG2)
[17:03:47] [PASSED] 0x56BC (DG2)
[17:03:47] [PASSED] 0x56BD (DG2)
[17:03:47] [PASSED] 0x5693 (DG2)
[17:03:47] [PASSED] 0x5694 (DG2)
[17:03:47] [PASSED] 0x5695 (DG2)
[17:03:47] [PASSED] 0x56A3 (DG2)
[17:03:47] [PASSED] 0x56A4 (DG2)
[17:03:47] [PASSED] 0x56B2 (DG2)
[17:03:47] [PASSED] 0x56B3 (DG2)
[17:03:47] [PASSED] 0x5696 (DG2)
[17:03:47] [PASSED] 0x5697 (DG2)
[17:03:47] [PASSED] 0xB69 (PVC)
[17:03:47] [PASSED] 0xB6E (PVC)
[17:03:47] [PASSED] 0xBD4 (PVC)
[17:03:47] [PASSED] 0xBD5 (PVC)
[17:03:47] [PASSED] 0xBD6 (PVC)
[17:03:47] [PASSED] 0xBD7 (PVC)
[17:03:47] [PASSED] 0xBD8 (PVC)
[17:03:47] [PASSED] 0xBD9 (PVC)
[17:03:47] [PASSED] 0xBDA (PVC)
[17:03:47] [PASSED] 0xBDB (PVC)
[17:03:47] [PASSED] 0xBE0 (PVC)
[17:03:47] [PASSED] 0xBE1 (PVC)
[17:03:47] [PASSED] 0xBE5 (PVC)
[17:03:47] [PASSED] 0x7D40 (METEORLAKE)
[17:03:47] [PASSED] 0x7D45 (METEORLAKE)
[17:03:47] [PASSED] 0x7D55 (METEORLAKE)
[17:03:47] [PASSED] 0x7D60 (METEORLAKE)
[17:03:47] [PASSED] 0x7DD5 (METEORLAKE)
[17:03:47] [PASSED] 0x6420 (LUNARLAKE)
[17:03:47] [PASSED] 0x64A0 (LUNARLAKE)
[17:03:47] [PASSED] 0x64B0 (LUNARLAKE)
[17:03:47] [PASSED] 0xE202 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE209 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE20B (BATTLEMAGE)
[17:03:47] [PASSED] 0xE20C (BATTLEMAGE)
[17:03:47] [PASSED] 0xE20D (BATTLEMAGE)
[17:03:47] [PASSED] 0xE210 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE211 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE212 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE216 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE220 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE221 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE222 (BATTLEMAGE)
[17:03:47] [PASSED] 0xE223 (BATTLEMAGE)
[17:03:47] [PASSED] 0xB080 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB081 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB082 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB083 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB084 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB085 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB086 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB087 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB08F (PANTHERLAKE)
[17:03:47] [PASSED] 0xB090 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB0A0 (PANTHERLAKE)
[17:03:47] [PASSED] 0xB0B0 (PANTHERLAKE)
[17:03:47] [PASSED] 0xFD80 (PANTHERLAKE)
[17:03:47] [PASSED] 0xFD81 (PANTHERLAKE)
[17:03:47] [PASSED] 0xD740 (NOVALAKE_S)
[17:03:47] [PASSED] 0xD741 (NOVALAKE_S)
[17:03:47] [PASSED] 0xD742 (NOVALAKE_S)
[17:03:47] [PASSED] 0xD743 (NOVALAKE_S)
[17:03:47] [PASSED] 0xD745 (NOVALAKE_S)
[17:03:47] [PASSED] 0xD74A (NOVALAKE_S)
[17:03:47] [PASSED] 0xD74B (NOVALAKE_S)
[17:03:47] [PASSED] 0x674C (CRESCENTISLAND)
[17:03:47] [PASSED] 0x674D (CRESCENTISLAND)
[17:03:47] [PASSED] 0x674E (CRESCENTISLAND)
[17:03:47] [PASSED] 0x674F (CRESCENTISLAND)
[17:03:47] [PASSED] 0x6750 (CRESCENTISLAND)
[17:03:47] [PASSED] 0xD750 (NOVALAKE_P)
[17:03:47] [PASSED] 0xD751 (NOVALAKE_P)
[17:03:47] [PASSED] 0xD752 (NOVALAKE_P)
[17:03:47] [PASSED] 0xD753 (NOVALAKE_P)
[17:03:47] [PASSED] 0xD754 (NOVALAKE_P)
[17:03:47] [PASSED] 0xD755 (NOVALAKE_P)
[17:03:47] [PASSED] 0xD756 (NOVALAKE_P)
[17:03:47] [PASSED] 0xD757 (NOVALAKE_P)
[17:03:47] [PASSED] 0xD75F (NOVALAKE_P)
[17:03:47] =============== [PASSED] check_platform_desc ===============
[17:03:47] ===================== [PASSED] xe_pci ======================
[17:03:47] ============= xe_rtp_tables_test (5 subtests) ==============
[17:03:47] ================== xe_rtp_table_gt_test ===================
[17:03:47] [PASSED] gt_was/14011060649
[17:03:47] [PASSED] gt_was/14011059788
[17:03:47] [PASSED] gt_was/14015795083
[17:03:47] [PASSED] gt_was/16021867713
[17:03:47] [PASSED] gt_was/14019449301
[17:03:47] [PASSED] gt_was/16028005424
[17:03:47] [PASSED] gt_was/14026578760
[17:03:47] [PASSED] gt_was/1409420604
[17:03:47] [PASSED] gt_was/1408615072
[17:03:47] [PASSED] gt_was/22010523718
[17:03:47] [PASSED] gt_was/14011006942
[17:03:47] [PASSED] gt_was/14014830051
[17:03:47] [PASSED] gt_was/18018781329
[17:03:47] [PASSED] gt_was/1509235366
[17:03:47] [PASSED] gt_was/18018781329
[17:03:47] [PASSED] gt_was/16016694945
[17:03:47] [PASSED] gt_was/14018575942
[17:03:47] [PASSED] gt_was/22016670082
[17:03:47] [PASSED] gt_was/22016670082
[17:03:47] [PASSED] gt_was/14017421178
[17:03:47] [PASSED] gt_was/16025250150
[17:03:47] [PASSED] gt_was/14021871409
[17:03:47] [PASSED] gt_was/16021865536
[17:03:47] [PASSED] gt_was/14021486841
[17:03:47] [PASSED] gt_was/14025160223
[17:03:47] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[17:03:47] [PASSED] gt_was/14025635424
[17:03:47] [PASSED] gt_was/16028005424
[17:03:47] ============== [PASSED] xe_rtp_table_gt_test ===============
[17:03:47] ================== xe_rtp_table_gt_test ===================
[17:03:47] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[17:03:47] [PASSED] gt_tunings/Tuning: 32B Access Enable
[17:03:47] [PASSED] gt_tunings/Tuning: L3 cache
[17:03:47] [PASSED] gt_tunings/Tuning: L3 cache - media
[17:03:47] [PASSED] gt_tunings/Tuning: Compression Overfetch
[17:03:47] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[17:03:47] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[17:03:47] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[17:03:47] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[17:03:47] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[17:03:47] [PASSED] gt_tunings/Tuning: Stateless compression control
[17:03:47] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[17:03:47] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[17:03:47] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[17:03:47] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[17:03:47] ============== [PASSED] xe_rtp_table_gt_test ===============
[17:03:47] ================== xe_rtp_table_oob_test ==================
[17:03:47] [PASSED] oob_was/1607983814
[17:03:47] [PASSED] oob_was/16010904313
[17:03:47] [PASSED] oob_was/18022495364
[17:03:47] [PASSED] oob_was/22012773006
[17:03:47] [PASSED] oob_was/14014475959
[17:03:47] [PASSED] oob_was/22011391025
[17:03:47] [PASSED] oob_was/22012727170
[17:03:47] [PASSED] oob_was/22012727685
[17:03:47] [PASSED] oob_was/22016596838
[17:03:47] [PASSED] oob_was/18020744125
[17:03:47] [PASSED] oob_was/1409600907
[17:03:47] [PASSED] oob_was/22014953428
[17:03:47] [PASSED] oob_was/16017236439
[17:03:47] [PASSED] oob_was/14019821291
[17:03:47] [PASSED] oob_was/14015076503
[17:03:47] [PASSED] oob_was/14018913170
[17:03:47] [PASSED] oob_was/14018094691
[17:03:47] [PASSED] oob_was/18024947630
[17:03:47] [PASSED] oob_was/16022287689
[17:03:47] [PASSED] oob_was/13011645652
[17:03:47] [PASSED] oob_was/14022293748
[17:03:47] [PASSED] oob_was/22019794406
[17:03:47] [PASSED] oob_was/22019338487
[17:03:47] [PASSED] oob_was/16023588340
[17:03:47] [PASSED] oob_was/14019789679
[17:03:47] [PASSED] oob_was/14022866841
[17:03:47] [PASSED] oob_was/16021333562
[17:03:47] [PASSED] oob_was/14016712196
[17:03:47] [PASSED] oob_was/14015568240
[17:03:47] [PASSED] oob_was/18013179988
[17:03:47] [PASSED] oob_was/1508761755
[17:03:47] [PASSED] oob_was/16023105232
[17:03:47] [PASSED] oob_was/16026508708
[17:03:47] [PASSED] oob_was/14020001231
[17:03:47] [PASSED] oob_was/16023683509
[17:03:47] [PASSED] oob_was/14025515070
[17:03:47] [PASSED] oob_was/15015404425_disable
[17:03:47] [PASSED] oob_was/16026007364
[17:03:47] [PASSED] oob_was/14020316580
[17:03:47] [PASSED] oob_was/14025883347
[17:03:47] [PASSED] oob_was/16029380221
[17:03:47] [PASSED] oob_was/22022079272
[17:03:47] [PASSED] oob_was/16029897822
[17:03:47] [PASSED] oob_was/14027054324
[17:03:47] ============== [PASSED] xe_rtp_table_oob_test ==============
[17:03:47] ================ xe_rtp_table_dev_oob_test ================
[17:03:47] [PASSED] device_oob_was/22010954014
[17:03:47] [PASSED] device_oob_was/15015404425
[17:03:47] [PASSED] device_oob_was/22019338487_display
[17:03:47] [PASSED] device_oob_was/14022085890
[17:03:47] [PASSED] device_oob_was/14026539277
[17:03:47] [PASSED] device_oob_was/14026633728
[17:03:47] [PASSED] device_oob_was/14026746987
[17:03:47] [PASSED] device_oob_was/14026779378
[17:03:47] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[17:03:47] ========== xe_rtp_table_missing_upper_bound_test ==========
[17:03:47] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[17:03:47] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[17:03:47] [PASSED] register_whitelist/1806527549
[17:03:47] [PASSED] register_whitelist/allow_read_ctx_timestamp
[17:03:47] [PASSED] register_whitelist/allow_read_queue_timestamp
[17:03:47] [PASSED] register_whitelist/16014440446
[17:03:47] [PASSED] register_whitelist/16017236439
[17:03:47] [PASSED] register_whitelist/16020183090
[17:03:47] [PASSED] register_whitelist/14024997852
[17:03:47] [PASSED] register_whitelist/14024997852
[17:03:47] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[17:03:47] =============== [PASSED] xe_rtp_tables_test ================
[17:03:47] =================== xe_rtp (3 subtests) ====================
[17:03:47] =================== xe_rtp_rules_tests ====================
[17:03:47] [PASSED] no
[17:03:47] [PASSED] yes
[17:03:47] [PASSED] no-and-no
[17:03:47] [PASSED] no-and-yes
[17:03:47] [PASSED] yes-and-no
[17:03:47] [PASSED] yes-and-yes
[17:03:47] [PASSED] no-or-no
[17:03:47] [PASSED] no-or-yes
[17:03:47] [PASSED] yes-or-no
[17:03:47] [PASSED] yes-or-yes
[17:03:47] [PASSED] no-yes-or-yes-no
[17:03:47] [PASSED] no-yes-or-yes-yes
[17:03:47] [PASSED] yes-yes-or-no-yes
[17:03:47] [PASSED] yes-yes-or-yes-yes
[17:03:47] [PASSED] no-no-or-yes-or-no
[17:03:47] [PASSED] or
[17:03:47] [PASSED] or-yes
[17:03:47] [PASSED] or-no
[17:03:47] [PASSED] yes-or
[17:03:47] [PASSED] no-or
[17:03:47] [PASSED] no-or-or-yes
[17:03:47] [PASSED] yes-or-or-no
[17:03:47] [PASSED] no-or-or-no
[17:03:47] [PASSED] missing-context-engine-class
[17:03:47] [PASSED] missing-context-engine-class-or-yes
[17:03:47] [PASSED] missing-context-engine-class-or-or-yes
[17:03:47] =============== [PASSED] xe_rtp_rules_tests ================
[17:03:47] =============== xe_rtp_process_to_sr_tests ================
[17:03:47] [PASSED] coalesce-same-reg
[17:03:47] [PASSED] coalesce-same-reg-literal-and-func
[17:03:47] [PASSED] no-match-no-add
[17:03:47] [PASSED] two-regs-two-entries
[17:03:47] [PASSED] clr-one-set-other
[17:03:47] [PASSED] set-field
[17:03:47] [PASSED] conflict-duplicate
[17:03:47] [PASSED] conflict-not-disjoint
[17:03:47] [PASSED] conflict-not-disjoint-literal-and-func
[17:03:47] [PASSED] conflict-reg-type
[17:03:47] [PASSED] bad-mcr-reg-forced-to-regular
[17:03:47] [PASSED] bad-regular-reg-forced-to-mcr
[17:03:47] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[17:03:47] ================== xe_rtp_process_tests ===================
[17:03:47] [PASSED] active1
[17:03:47] [PASSED] active2
[17:03:47] [PASSED] active-inactive
[17:03:47] [PASSED] inactive-active
[17:03:47] [PASSED] inactive-active-inactive
[17:03:47] [PASSED] inactive-inactive-inactive
[17:03:47] ============== [PASSED] xe_rtp_process_tests ===============
[17:03:47] ===================== [PASSED] xe_rtp ======================
[17:03:47] ==================== xe_wa (1 subtest) =====================
[17:03:47] ======================== xe_wa_gt =========================
[17:03:47] [PASSED] TIGERLAKE B0
[17:03:47] [PASSED] DG1 A0
[17:03:47] [PASSED] DG1 B0
[17:03:47] [PASSED] ALDERLAKE_S A0
[17:03:47] [PASSED] ALDERLAKE_S B0
[17:03:47] [PASSED] ALDERLAKE_S C0
[17:03:47] [PASSED] ALDERLAKE_S D0
[17:03:47] [PASSED] ALDERLAKE_P A0
[17:03:47] [PASSED] ALDERLAKE_P B0
[17:03:47] [PASSED] ALDERLAKE_P C0
[17:03:47] [PASSED] ALDERLAKE_S RPLS D0
[17:03:47] [PASSED] ALDERLAKE_P RPLU E0
[17:03:47] [PASSED] DG2 G10 C0
[17:03:47] [PASSED] DG2 G11 B1
[17:03:47] [PASSED] DG2 G12 A1
[17:03:47] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[17:03:47] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[17:03:47] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[17:03:47] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[17:03:47] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[17:03:47] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[17:03:47] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[17:03:47] ==================== [PASSED] xe_wa_gt =====================
[17:03:47] ====================== [PASSED] xe_wa ======================
[17:03:47] ============================================================
[17:03:47] Testing complete. Ran 793 tests: passed: 765, skipped: 28
[17:03:47] Elapsed time: 36.735s total, 1.806s configuring, 34.213s building, 0.696s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[17:03:47] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:03:49] 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
[17:04:14] Starting KUnit Kernel (1/1)...
[17:04:14] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:04:14] ============= refcount_interrupt (4 subtests) ==============
[17:04:14] [PASSED] test_single_irq_change
[17:04:14] [PASSED] test_nested_irq_change
[17:04:14] [PASSED] test_multiple_irq_change
[17:04:14] [PASSED] test_irq_save
[17:04:14] =============== [PASSED] refcount_interrupt ================
[17:04:14] ============ drm_test_pick_cmdline (2 subtests) ============
[17:04:14] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[17:04:14] =============== drm_test_pick_cmdline_named ===============
[17:04:14] [PASSED] NTSC
[17:04:14] [PASSED] NTSC-J
[17:04:14] [PASSED] PAL
[17:04:14] [PASSED] PAL-M
[17:04:14] =========== [PASSED] drm_test_pick_cmdline_named ===========
[17:04:14] ============== [PASSED] drm_test_pick_cmdline ==============
[17:04:14] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[17:04:14] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[17:04:14] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[17:04:14] =========== drm_validate_clone_mode (2 subtests) ===========
[17:04:14] ============== drm_test_check_in_clone_mode ===============
[17:04:14] [PASSED] in_clone_mode
[17:04:14] [PASSED] not_in_clone_mode
[17:04:14] ========== [PASSED] drm_test_check_in_clone_mode ===========
[17:04:14] =============== drm_test_check_valid_clones ===============
[17:04:14] [PASSED] not_in_clone_mode
[17:04:14] [PASSED] valid_clone
[17:04:14] [PASSED] invalid_clone
[17:04:14] =========== [PASSED] drm_test_check_valid_clones ===========
[17:04:14] ============= [PASSED] drm_validate_clone_mode =============
[17:04:14] ============= drm_validate_modeset (1 subtest) =============
[17:04:14] [PASSED] drm_test_check_connector_changed_modeset
[17:04:14] ============== [PASSED] drm_validate_modeset ===============
[17:04:14] ====== drm_test_bridge_get_current_state (1 subtest) =======
[17:04:14] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[17:04:14] ======== [PASSED] drm_test_bridge_get_current_state ========
[17:04:14] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[17:04:14] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[17:04:14] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[17:04:14] [PASSED] drm_test_drm_bridge_helper_hdmi_output_bus_fmts
[17:04:14] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[17:04:14] ============== drm_bridge_alloc (2 subtests) ===============
[17:04:14] [PASSED] drm_test_drm_bridge_alloc_basic
[17:04:14] [PASSED] drm_test_drm_bridge_alloc_get_put
[17:04:14] ================ [PASSED] drm_bridge_alloc =================
[17:04:14] ============= drm_bridge_bus_fmt (5 subtests) ==============
[17:04:14] [PASSED] drm_test_bridge_rgb_yuv_rgb
[17:04:14] [PASSED] drm_test_bridge_must_convert_to_yuv444
[17:04:14] [PASSED] drm_test_bridge_hdmi_auto_rgb
[17:04:14] [PASSED] drm_test_bridge_auto_first
[17:04:14] [PASSED] drm_test_bridge_rgb_yuv_no_path
[17:04:14] =============== [PASSED] drm_bridge_bus_fmt ================
[17:04:14] ============= drm_cmdline_parser (40 subtests) =============
[17:04:14] [PASSED] drm_test_cmdline_force_d_only
[17:04:14] [PASSED] drm_test_cmdline_force_D_only_dvi
[17:04:14] [PASSED] drm_test_cmdline_force_D_only_hdmi
[17:04:14] [PASSED] drm_test_cmdline_force_D_only_not_digital
[17:04:14] [PASSED] drm_test_cmdline_force_e_only
[17:04:14] [PASSED] drm_test_cmdline_res
[17:04:14] [PASSED] drm_test_cmdline_res_vesa
[17:04:14] [PASSED] drm_test_cmdline_res_vesa_rblank
[17:04:14] [PASSED] drm_test_cmdline_res_rblank
[17:04:14] [PASSED] drm_test_cmdline_res_bpp
[17:04:14] [PASSED] drm_test_cmdline_res_refresh
[17:04:14] [PASSED] drm_test_cmdline_res_bpp_refresh
[17:04:14] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[17:04:14] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[17:04:14] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[17:04:14] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[17:04:14] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[17:04:14] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[17:04:14] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[17:04:14] [PASSED] drm_test_cmdline_res_margins_force_on
[17:04:14] [PASSED] drm_test_cmdline_res_vesa_margins
[17:04:14] [PASSED] drm_test_cmdline_name
[17:04:14] [PASSED] drm_test_cmdline_name_bpp
[17:04:14] [PASSED] drm_test_cmdline_name_option
[17:04:14] [PASSED] drm_test_cmdline_name_bpp_option
[17:04:14] [PASSED] drm_test_cmdline_rotate_0
[17:04:14] [PASSED] drm_test_cmdline_rotate_90
[17:04:14] [PASSED] drm_test_cmdline_rotate_180
[17:04:14] [PASSED] drm_test_cmdline_rotate_270
[17:04:14] [PASSED] drm_test_cmdline_hmirror
[17:04:14] [PASSED] drm_test_cmdline_vmirror
[17:04:14] [PASSED] drm_test_cmdline_margin_options
[17:04:14] [PASSED] drm_test_cmdline_multiple_options
[17:04:14] [PASSED] drm_test_cmdline_bpp_extra_and_option
[17:04:14] [PASSED] drm_test_cmdline_extra_and_option
[17:04:14] [PASSED] drm_test_cmdline_freestanding_options
[17:04:14] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[17:04:14] [PASSED] drm_test_cmdline_panel_orientation
[17:04:14] ================ drm_test_cmdline_invalid =================
[17:04:14] [PASSED] margin_only
[17:04:14] [PASSED] interlace_only
[17:04:14] [PASSED] res_missing_x
[17:04:14] [PASSED] res_missing_y
[17:04:14] [PASSED] res_bad_y
[17:04:14] [PASSED] res_missing_y_bpp
[17:04:14] [PASSED] res_bad_bpp
[17:04:14] [PASSED] res_bad_refresh
[17:04:14] [PASSED] res_bpp_refresh_force_on_off
[17:04:14] [PASSED] res_invalid_mode
[17:04:14] [PASSED] res_bpp_wrong_place_mode
[17:04:14] [PASSED] name_bpp_refresh
[17:04:14] [PASSED] name_refresh
[17:04:14] [PASSED] name_refresh_wrong_mode
[17:04:14] [PASSED] name_refresh_invalid_mode
[17:04:14] [PASSED] rotate_multiple
[17:04:14] [PASSED] rotate_invalid_val
[17:04:14] [PASSED] rotate_truncated
[17:04:14] [PASSED] invalid_option
[17:04:14] [PASSED] invalid_tv_option
[17:04:14] [PASSED] truncated_tv_option
[17:04:14] ============ [PASSED] drm_test_cmdline_invalid =============
[17:04:14] =============== drm_test_cmdline_tv_options ===============
[17:04:14] [PASSED] NTSC
[17:04:14] [PASSED] NTSC_443
[17:04:14] [PASSED] NTSC_J
[17:04:14] [PASSED] PAL
[17:04:14] [PASSED] PAL_M
[17:04:14] [PASSED] PAL_N
[17:04:14] [PASSED] SECAM
[17:04:14] [PASSED] MONO_525
[17:04:14] [PASSED] MONO_625
[17:04:14] =========== [PASSED] drm_test_cmdline_tv_options ===========
[17:04:14] =============== [PASSED] drm_cmdline_parser ================
[17:04:14] ========== drmm_connector_hdmi_init (20 subtests) ==========
[17:04:14] [PASSED] drm_test_connector_hdmi_init_valid
[17:04:14] [PASSED] drm_test_connector_hdmi_init_bpc_8
[17:04:14] [PASSED] drm_test_connector_hdmi_init_bpc_10
[17:04:14] [PASSED] drm_test_connector_hdmi_init_bpc_12
[17:04:14] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[17:04:14] [PASSED] drm_test_connector_hdmi_init_bpc_null
[17:04:14] [PASSED] drm_test_connector_hdmi_init_formats_empty
[17:04:14] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[17:04:14] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[17:04:14] [PASSED] supported_formats=0x9 yuv420_allowed=1
[17:04:14] [PASSED] supported_formats=0x9 yuv420_allowed=0
[17:04:14] [PASSED] supported_formats=0x5 yuv420_allowed=1
[17:04:14] [PASSED] supported_formats=0x5 yuv420_allowed=0
[17:04:14] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[17:04:14] [PASSED] drm_test_connector_hdmi_init_null_ddc
[17:04:14] [PASSED] drm_test_connector_hdmi_init_null_product
[17:04:14] [PASSED] drm_test_connector_hdmi_init_null_vendor
[17:04:14] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[17:04:14] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[17:04:14] [PASSED] drm_test_connector_hdmi_init_product_valid
[17:04:14] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[17:04:14] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[17:04:14] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[17:04:14] ========= drm_test_connector_hdmi_init_type_valid =========
[17:04:14] [PASSED] HDMI-A
[17:04:14] [PASSED] HDMI-B
[17:04:14] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[17:04:14] ======== drm_test_connector_hdmi_init_type_invalid ========
[17:04:14] [PASSED] Unknown
[17:04:14] [PASSED] VGA
[17:04:14] [PASSED] DVI-I
[17:04:14] [PASSED] DVI-D
[17:04:14] [PASSED] DVI-A
[17:04:14] [PASSED] Composite
[17:04:14] [PASSED] SVIDEO
[17:04:14] [PASSED] LVDS
[17:04:14] [PASSED] Component
[17:04:14] [PASSED] DIN
[17:04:14] [PASSED] DP
[17:04:14] [PASSED] TV
[17:04:14] [PASSED] eDP
[17:04:14] [PASSED] Virtual
[17:04:14] [PASSED] DSI
[17:04:14] [PASSED] DPI
[17:04:14] [PASSED] Writeback
[17:04:14] [PASSED] SPI
[17:04:14] [PASSED] USB
[17:04:14] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[17:04:14] ============ [PASSED] drmm_connector_hdmi_init =============
[17:04:14] ============= drmm_connector_init (3 subtests) =============
[17:04:14] [PASSED] drm_test_drmm_connector_init
[17:04:14] [PASSED] drm_test_drmm_connector_init_null_ddc
[17:04:14] ========= drm_test_drmm_connector_init_type_valid =========
[17:04:14] [PASSED] Unknown
[17:04:14] [PASSED] VGA
[17:04:14] [PASSED] DVI-I
[17:04:14] [PASSED] DVI-D
[17:04:14] [PASSED] DVI-A
[17:04:14] [PASSED] Composite
[17:04:14] [PASSED] SVIDEO
[17:04:14] [PASSED] LVDS
[17:04:14] [PASSED] Component
[17:04:14] [PASSED] DIN
[17:04:14] [PASSED] DP
[17:04:14] [PASSED] HDMI-A
[17:04:14] [PASSED] HDMI-B
[17:04:14] [PASSED] TV
[17:04:14] [PASSED] eDP
[17:04:14] [PASSED] Virtual
[17:04:14] [PASSED] DSI
[17:04:14] [PASSED] DPI
[17:04:14] [PASSED] Writeback
[17:04:14] [PASSED] SPI
[17:04:14] [PASSED] USB
[17:04:14] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[17:04:14] =============== [PASSED] drmm_connector_init ===============
[17:04:14] ========= drm_connector_dynamic_init (6 subtests) ==========
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_init
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_init_properties
[17:04:14] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[17:04:14] [PASSED] Unknown
[17:04:14] [PASSED] VGA
[17:04:14] [PASSED] DVI-I
[17:04:14] [PASSED] DVI-D
[17:04:14] [PASSED] DVI-A
[17:04:14] [PASSED] Composite
[17:04:14] [PASSED] SVIDEO
[17:04:14] [PASSED] LVDS
[17:04:14] [PASSED] Component
[17:04:14] [PASSED] DIN
[17:04:14] [PASSED] DP
[17:04:14] [PASSED] HDMI-A
[17:04:14] [PASSED] HDMI-B
[17:04:14] [PASSED] TV
[17:04:14] [PASSED] eDP
[17:04:14] [PASSED] Virtual
[17:04:14] [PASSED] DSI
[17:04:14] [PASSED] DPI
[17:04:14] [PASSED] Writeback
[17:04:14] [PASSED] SPI
[17:04:14] [PASSED] USB
[17:04:14] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[17:04:14] ======== drm_test_drm_connector_dynamic_init_name =========
[17:04:14] [PASSED] Unknown
[17:04:14] [PASSED] VGA
[17:04:14] [PASSED] DVI-I
[17:04:14] [PASSED] DVI-D
[17:04:14] [PASSED] DVI-A
[17:04:14] [PASSED] Composite
[17:04:14] [PASSED] SVIDEO
[17:04:14] [PASSED] LVDS
[17:04:14] [PASSED] Component
[17:04:14] [PASSED] DIN
[17:04:14] [PASSED] DP
[17:04:14] [PASSED] HDMI-A
[17:04:14] [PASSED] HDMI-B
[17:04:14] [PASSED] TV
[17:04:14] [PASSED] eDP
[17:04:14] [PASSED] Virtual
[17:04:14] [PASSED] DSI
[17:04:14] [PASSED] DPI
[17:04:14] [PASSED] Writeback
[17:04:14] [PASSED] SPI
[17:04:14] [PASSED] USB
[17:04:14] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[17:04:14] =========== [PASSED] drm_connector_dynamic_init ============
[17:04:14] ==== drm_connector_dynamic_register_early (4 subtests) =====
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[17:04:14] ====== [PASSED] drm_connector_dynamic_register_early =======
[17:04:14] ======= drm_connector_dynamic_register (7 subtests) ========
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[17:04:14] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[17:04:14] ========= [PASSED] drm_connector_dynamic_register ==========
[17:04:14] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[17:04:14] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[17:04:14] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[17:04:14] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[17:04:14] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[17:04:14] ========== drm_test_get_tv_mode_from_name_valid ===========
[17:04:14] [PASSED] NTSC
[17:04:14] [PASSED] NTSC-443
[17:04:14] [PASSED] NTSC-J
[17:04:14] [PASSED] PAL
[17:04:14] [PASSED] PAL-M
[17:04:14] [PASSED] PAL-N
[17:04:14] [PASSED] SECAM
[17:04:14] [PASSED] Mono
[17:04:14] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[17:04:14] [PASSED] drm_test_get_tv_mode_from_name_truncated
[17:04:14] ============ [PASSED] drm_get_tv_mode_from_name ============
[17:04:14] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[17:04:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[17:04:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[17:04:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[17:04:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[17:04:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[17:04:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[17:04:14] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[17:04:14] [PASSED] VIC 96
[17:04:14] [PASSED] VIC 97
[17:04:14] [PASSED] VIC 101
[17:04:14] [PASSED] VIC 102
[17:04:14] [PASSED] VIC 106
[17:04:14] [PASSED] VIC 107
[17:04:14] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[17:04:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[17:04:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[17:04:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[17:04:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[17:04:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[17:04:14] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[17:04:14] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[17:04:14] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[17:04:14] [PASSED] Automatic
[17:04:14] [PASSED] Full
[17:04:14] [PASSED] Limited 16:235
[17:04:14] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[17:04:14] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[17:04:14] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[17:04:14] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[17:04:14] === drm_test_drm_hdmi_connector_get_output_format_name ====
[17:04:14] [PASSED] RGB
[17:04:14] [PASSED] YUV 4:2:0
[17:04:14] [PASSED] YUV 4:2:2
[17:04:14] [PASSED] YUV 4:4:4
[17:04:14] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[17:04:14] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[17:04:14] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[17:04:14] ============= drm_damage_helper (21 subtests) ==============
[17:04:14] [PASSED] drm_test_damage_iter_no_damage
[17:04:14] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[17:04:14] [PASSED] drm_test_damage_iter_no_damage_src_moved
[17:04:14] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[17:04:14] [PASSED] drm_test_damage_iter_no_damage_not_visible
[17:04:14] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[17:04:14] [PASSED] drm_test_damage_iter_no_damage_no_fb
[17:04:14] [PASSED] drm_test_damage_iter_simple_damage
[17:04:14] [PASSED] drm_test_damage_iter_single_damage
[17:04:14] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[17:04:14] [PASSED] drm_test_damage_iter_single_damage_outside_src
[17:04:14] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[17:04:14] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[17:04:14] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[17:04:14] [PASSED] drm_test_damage_iter_single_damage_src_moved
[17:04:14] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[17:04:14] [PASSED] drm_test_damage_iter_damage
[17:04:14] [PASSED] drm_test_damage_iter_damage_one_intersect
[17:04:14] [PASSED] drm_test_damage_iter_damage_one_outside
[17:04:14] [PASSED] drm_test_damage_iter_damage_src_moved
[17:04:14] [PASSED] drm_test_damage_iter_damage_not_visible
[17:04:14] ================ [PASSED] drm_damage_helper ================
[17:04:14] ============== drm_dp_mst_helper (3 subtests) ==============
[17:04:14] ============== drm_test_dp_mst_calc_pbn_mode ==============
[17:04:14] [PASSED] Clock 154000 BPP 30 DSC disabled
[17:04:14] [PASSED] Clock 234000 BPP 30 DSC disabled
[17:04:14] [PASSED] Clock 297000 BPP 24 DSC disabled
[17:04:14] [PASSED] Clock 332880 BPP 24 DSC enabled
[17:04:14] [PASSED] Clock 324540 BPP 24 DSC enabled
[17:04:14] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[17:04:14] ============== drm_test_dp_mst_calc_pbn_div ===============
[17:04:14] [PASSED] Link rate 2000000 lane count 4
[17:04:14] [PASSED] Link rate 2000000 lane count 2
[17:04:14] [PASSED] Link rate 2000000 lane count 1
[17:04:14] [PASSED] Link rate 1350000 lane count 4
[17:04:14] [PASSED] Link rate 1350000 lane count 2
[17:04:14] [PASSED] Link rate 1350000 lane count 1
[17:04:14] [PASSED] Link rate 1000000 lane count 4
[17:04:14] [PASSED] Link rate 1000000 lane count 2
[17:04:14] [PASSED] Link rate 1000000 lane count 1
[17:04:14] [PASSED] Link rate 810000 lane count 4
[17:04:14] [PASSED] Link rate 810000 lane count 2
[17:04:14] [PASSED] Link rate 810000 lane count 1
[17:04:14] [PASSED] Link rate 540000 lane count 4
[17:04:14] [PASSED] Link rate 540000 lane count 2
[17:04:14] [PASSED] Link rate 540000 lane count 1
[17:04:14] [PASSED] Link rate 270000 lane count 4
[17:04:14] [PASSED] Link rate 270000 lane count 2
[17:04:14] [PASSED] Link rate 270000 lane count 1
[17:04:14] [PASSED] Link rate 162000 lane count 4
[17:04:14] [PASSED] Link rate 162000 lane count 2
[17:04:14] [PASSED] Link rate 162000 lane count 1
[17:04:14] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[17:04:14] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[17:04:14] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[17:04:14] [PASSED] DP_POWER_UP_PHY with port number
[17:04:14] [PASSED] DP_POWER_DOWN_PHY with port number
[17:04:14] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[17:04:14] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[17:04:14] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[17:04:14] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[17:04:14] [PASSED] DP_QUERY_PAYLOAD with port number
[17:04:14] [PASSED] DP_QUERY_PAYLOAD with VCPI
[17:04:14] [PASSED] DP_REMOTE_DPCD_READ with port number
[17:04:14] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[17:04:14] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[17:04:14] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[17:04:14] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[17:04:14] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[17:04:14] [PASSED] DP_REMOTE_I2C_READ with port number
[17:04:14] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[17:04:14] [PASSED] DP_REMOTE_I2C_READ with transactions array
[17:04:14] [PASSED] DP_REMOTE_I2C_WRITE with port number
[17:04:14] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[17:04:14] [PASSED] DP_REMOTE_I2C_WRITE with data array
[17:04:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[17:04:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[17:04:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[17:04:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[17:04:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[17:04:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[17:04:14] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[17:04:14] ================ [PASSED] drm_dp_mst_helper ================
[17:04:14] ================== drm_exec (7 subtests) ===================
[17:04:14] [PASSED] sanitycheck
[17:04:14] [PASSED] test_lock
[17:04:14] [PASSED] test_lock_unlock
[17:04:14] [PASSED] test_duplicates
[17:04:14] [PASSED] test_prepare
[17:04:14] [PASSED] test_prepare_array
[17:04:14] [PASSED] test_multiple_loops
[17:04:14] ==================== [PASSED] drm_exec =====================
[17:04:14] =========== drm_format_helper_test (17 subtests) ===========
[17:04:14] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[17:04:14] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[17:04:14] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[17:04:14] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[17:04:14] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[17:04:14] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[17:04:14] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[17:04:14] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[17:04:14] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[17:04:14] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[17:04:14] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[17:04:14] ============== drm_test_fb_xrgb8888_to_mono ===============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[17:04:14] ==================== drm_test_fb_swab =====================
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ================ [PASSED] drm_test_fb_swab =================
[17:04:14] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[17:04:14] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[17:04:14] [PASSED] single_pixel_source_buffer
[17:04:14] [PASSED] single_pixel_clip_rectangle
[17:04:14] [PASSED] well_known_colors
[17:04:14] [PASSED] destination_pitch
[17:04:14] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[17:04:14] ================= drm_test_fb_clip_offset =================
[17:04:14] [PASSED] pass through
[17:04:14] [PASSED] horizontal offset
[17:04:14] [PASSED] vertical offset
[17:04:14] [PASSED] horizontal and vertical offset
[17:04:14] [PASSED] horizontal offset (custom pitch)
[17:04:14] [PASSED] vertical offset (custom pitch)
[17:04:14] [PASSED] horizontal and vertical offset (custom pitch)
[17:04:14] ============= [PASSED] drm_test_fb_clip_offset =============
[17:04:14] =================== drm_test_fb_memcpy ====================
[17:04:14] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[17:04:14] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[17:04:14] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[17:04:14] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[17:04:14] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[17:04:14] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[17:04:14] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[17:04:14] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[17:04:14] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[17:04:14] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[17:04:14] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[17:04:14] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[17:04:14] =============== [PASSED] drm_test_fb_memcpy ================
[17:04:14] ============= [PASSED] drm_format_helper_test ==============
[17:04:14] ================= drm_format (18 subtests) =================
[17:04:14] [PASSED] drm_test_format_block_width_invalid
[17:04:14] [PASSED] drm_test_format_block_width_one_plane
[17:04:14] [PASSED] drm_test_format_block_width_two_plane
[17:04:14] [PASSED] drm_test_format_block_width_three_plane
[17:04:14] [PASSED] drm_test_format_block_width_tiled
[17:04:14] [PASSED] drm_test_format_block_height_invalid
[17:04:14] [PASSED] drm_test_format_block_height_one_plane
[17:04:14] [PASSED] drm_test_format_block_height_two_plane
[17:04:14] [PASSED] drm_test_format_block_height_three_plane
[17:04:14] [PASSED] drm_test_format_block_height_tiled
[17:04:14] [PASSED] drm_test_format_min_pitch_invalid
[17:04:14] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[17:04:14] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[17:04:14] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[17:04:14] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[17:04:14] [PASSED] drm_test_format_min_pitch_two_plane
[17:04:14] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[17:04:14] [PASSED] drm_test_format_min_pitch_tiled
[17:04:14] =================== [PASSED] drm_format ====================
[17:04:14] ============== drm_framebuffer (10 subtests) ===============
[17:04:14] ========== drm_test_framebuffer_check_src_coords ==========
[17:04:14] [PASSED] Success: source fits into fb
[17:04:14] [PASSED] Fail: overflowing fb with x-axis coordinate
[17:04:14] [PASSED] Fail: overflowing fb with y-axis coordinate
[17:04:14] [PASSED] Fail: overflowing fb with source width
[17:04:14] [PASSED] Fail: overflowing fb with source height
[17:04:14] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[17:04:14] [PASSED] drm_test_framebuffer_cleanup
[17:04:14] =============== drm_test_framebuffer_create ===============
[17:04:14] [PASSED] ABGR8888 normal sizes
[17:04:14] [PASSED] ABGR8888 max sizes
[17:04:14] [PASSED] ABGR8888 pitch greater than min required
[17:04:14] [PASSED] ABGR8888 pitch less than min required
[17:04:14] [PASSED] ABGR8888 Invalid width
[17:04:14] [PASSED] ABGR8888 Invalid buffer handle
[17:04:14] [PASSED] No pixel format
[17:04:14] [PASSED] ABGR8888 Width 0
[17:04:14] [PASSED] ABGR8888 Height 0
[17:04:14] [PASSED] ABGR8888 Out of bound height * pitch combination
[17:04:14] [PASSED] ABGR8888 Large buffer offset
[17:04:14] [PASSED] ABGR8888 Buffer offset for inexistent plane
[17:04:14] [PASSED] ABGR8888 Invalid flag
[17:04:14] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[17:04:14] [PASSED] ABGR8888 Valid buffer modifier
[17:04:14] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[17:04:14] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[17:04:14] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[17:04:14] [PASSED] NV12 Normal sizes
[17:04:14] [PASSED] NV12 Max sizes
[17:04:14] [PASSED] NV12 Invalid pitch
[17:04:14] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[17:04:14] [PASSED] NV12 different modifier per-plane
[17:04:14] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[17:04:14] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[17:04:14] [PASSED] NV12 Modifier for inexistent plane
[17:04:14] [PASSED] NV12 Handle for inexistent plane
[17:04:14] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[17:04:14] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[17:04:14] [PASSED] YVU420 Normal sizes
[17:04:14] [PASSED] YVU420 Max sizes
[17:04:14] [PASSED] YVU420 Invalid pitch
[17:04:14] [PASSED] YVU420 Different pitches
[17:04:14] [PASSED] YVU420 Different buffer offsets/pitches
[17:04:14] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[17:04:14] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[17:04:14] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[17:04:14] [PASSED] YVU420 Valid modifier
[17:04:14] [PASSED] YVU420 Different modifiers per plane
[17:04:14] [PASSED] YVU420 Modifier for inexistent plane
[17:04:14] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[17:04:14] [PASSED] X0L2 Normal sizes
[17:04:14] [PASSED] X0L2 Max sizes
[17:04:14] [PASSED] X0L2 Invalid pitch
[17:04:14] [PASSED] X0L2 Pitch greater than minimum required
[17:04:14] [PASSED] X0L2 Handle for inexistent plane
[17:04:14] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[17:04:14] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[17:04:14] [PASSED] X0L2 Valid modifier
[17:04:14] [PASSED] X0L2 Modifier for inexistent plane
[17:04:14] =========== [PASSED] drm_test_framebuffer_create ===========
[17:04:14] [PASSED] drm_test_framebuffer_free
[17:04:14] [PASSED] drm_test_framebuffer_init
[17:04:14] [PASSED] drm_test_framebuffer_init_bad_format
[17:04:14] [PASSED] drm_test_framebuffer_init_dev_mismatch
[17:04:14] [PASSED] drm_test_framebuffer_lookup
[17:04:14] [PASSED] drm_test_framebuffer_lookup_inexistent
[17:04:14] [PASSED] drm_test_framebuffer_modifiers_not_supported
[17:04:14] ================= [PASSED] drm_framebuffer =================
[17:04:14] ================ drm_gem_shmem (8 subtests) ================
[17:04:14] [PASSED] drm_gem_shmem_test_obj_create
[17:04:14] [PASSED] drm_gem_shmem_test_obj_create_private
[17:04:14] [PASSED] drm_gem_shmem_test_pin_pages
[17:04:14] [PASSED] drm_gem_shmem_test_vmap
[17:04:14] [PASSED] drm_gem_shmem_test_get_sg_table
[17:04:14] [PASSED] drm_gem_shmem_test_get_pages_sgt
[17:04:14] [PASSED] drm_gem_shmem_test_madvise
[17:04:14] [PASSED] drm_gem_shmem_test_purge
[17:04:14] ================== [PASSED] drm_gem_shmem ==================
[17:04:14] === drm_atomic_helper_connector_hdmi_check (29 subtests) ===
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[17:04:14] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[17:04:14] [PASSED] Automatic
[17:04:14] [PASSED] Full
[17:04:14] [PASSED] Limited 16:235
[17:04:14] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[17:04:14] [PASSED] drm_test_check_disable_connector
[17:04:14] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[17:04:14] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[17:04:14] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[17:04:14] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[17:04:14] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[17:04:14] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[17:04:14] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[17:04:14] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[17:04:14] [PASSED] drm_test_check_output_bpc_dvi
[17:04:14] [PASSED] drm_test_check_output_bpc_format_vic_1
[17:04:14] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[17:04:14] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[17:04:14] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[17:04:14] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[17:04:14] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[17:04:14] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[17:04:14] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[17:04:14] ============ drm_test_check_hdmi_color_format =============
[17:04:14] [PASSED] AUTO -> RGB
[17:04:14] [PASSED] YCBCR422 -> YUV422
[17:04:14] [PASSED] YCBCR420 -> YUV420
[17:04:14] [PASSED] YCBCR444 -> YUV444
[17:04:14] [PASSED] RGB -> RGB
[17:04:14] ======== [PASSED] drm_test_check_hdmi_color_format =========
[17:04:14] ======== drm_test_check_hdmi_color_format_420_only ========
[17:04:14] [PASSED] RGB should fail
[17:04:14] [PASSED] YUV444 should fail
[17:04:14] [PASSED] YUV422 should fail
[17:04:14] [PASSED] YUV420 should work
[17:04:14] ==== [PASSED] drm_test_check_hdmi_color_format_420_only ====
[17:04:14] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[17:04:14] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[17:04:14] [PASSED] drm_test_check_broadcast_rgb_value
[17:04:14] [PASSED] drm_test_check_bpc_8_value
[17:04:14] [PASSED] drm_test_check_bpc_10_value
[17:04:14] [PASSED] drm_test_check_bpc_12_value
[17:04:14] [PASSED] drm_test_check_format_value
[17:04:14] [PASSED] drm_test_check_tmds_char_value
[17:04:14] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[17:04:14] = drm_atomic_helper_connector_hdmi_mode_valid (7 subtests) =
[17:04:14] [PASSED] drm_test_check_mode_valid
[17:04:14] [PASSED] drm_test_check_mode_valid_reject
[17:04:14] [PASSED] drm_test_check_mode_valid_reject_rate
[17:04:14] [PASSED] drm_test_check_mode_valid_reject_max_clock
[17:04:14] [PASSED] drm_test_check_mode_valid_yuv420_only_max_clock
[17:04:14] [PASSED] drm_test_check_mode_valid_reject_yuv420_only_connector
[17:04:14] [PASSED] drm_test_check_mode_valid_accept_yuv420_also_connector_rgb
[17:04:14] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[17:04:14] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[17:04:14] [PASSED] drm_test_check_infoframes
[17:04:14] [PASSED] drm_test_check_reject_avi_infoframe
[17:04:14] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[17:04:14] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[17:04:14] [PASSED] drm_test_check_reject_audio_infoframe
[17:04:14] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[17:04:14] ================= drm_managed (2 subtests) =================
[17:04:14] [PASSED] drm_test_managed_release_action
[17:04:14] [PASSED] drm_test_managed_run_action
[17:04:14] =================== [PASSED] drm_managed ===================
[17:04:14] =================== drm_mm (6 subtests) ====================
[17:04:14] [PASSED] drm_test_mm_init
[17:04:14] [PASSED] drm_test_mm_debug
[17:04:14] [PASSED] drm_test_mm_align32
[17:04:14] [PASSED] drm_test_mm_align64
[17:04:14] [PASSED] drm_test_mm_lowest
[17:04:14] [PASSED] drm_test_mm_highest
[17:04:14] ===================== [PASSED] drm_mm ======================
[17:04:14] ============= drm_modes_analog_tv (5 subtests) =============
[17:04:14] [PASSED] drm_test_modes_analog_tv_mono_576i
[17:04:14] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[17:04:14] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[17:04:14] [PASSED] drm_test_modes_analog_tv_pal_576i
[17:04:14] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[17:04:14] =============== [PASSED] drm_modes_analog_tv ===============
[17:04:14] ============== drm_plane_helper (2 subtests) ===============
[17:04:14] =============== drm_test_check_plane_state ================
[17:04:14] [PASSED] clipping_simple
[17:04:14] [PASSED] clipping_rotate_reflect
[17:04:14] [PASSED] positioning_simple
[17:04:14] [PASSED] upscaling
[17:04:14] [PASSED] downscaling
[17:04:14] [PASSED] rounding1
[17:04:14] [PASSED] rounding2
[17:04:14] [PASSED] rounding3
[17:04:14] [PASSED] rounding4
[17:04:14] =========== [PASSED] drm_test_check_plane_state ============
[17:04:14] =========== drm_test_check_invalid_plane_state ============
[17:04:14] [PASSED] positioning_invalid
[17:04:14] [PASSED] upscaling_invalid
[17:04:14] [PASSED] downscaling_invalid
[17:04:14] ======= [PASSED] drm_test_check_invalid_plane_state ========
[17:04:14] ================ [PASSED] drm_plane_helper =================
[17:04:14] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[17:04:14] ====== drm_test_connector_helper_tv_get_modes_check =======
[17:04:14] [PASSED] None
[17:04:14] [PASSED] PAL
[17:04:14] [PASSED] NTSC
[17:04:14] [PASSED] Both, NTSC Default
[17:04:14] [PASSED] Both, PAL Default
[17:04:14] [PASSED] Both, NTSC Default, with PAL on command-line
[17:04:14] [PASSED] Both, PAL Default, with NTSC on command-line
[17:04:14] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[17:04:14] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[17:04:14] ================== drm_rect (9 subtests) ===================
[17:04:14] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[17:04:14] [PASSED] drm_test_rect_clip_scaled_not_clipped
[17:04:14] [PASSED] drm_test_rect_clip_scaled_clipped
[17:04:14] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[17:04:14] ================= drm_test_rect_intersect =================
[17:04:14] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[17:04:14] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[17:04:14] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[17:04:14] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[17:04:14] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[17:04:14] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[17:04:14] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[17:04:14] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[17:04:14] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[17:04:14] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[17:04:14] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[17:04:14] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[17:04:14] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[17:04:14] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[17:04:14] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[17:04:14] ============= [PASSED] drm_test_rect_intersect =============
[17:04:14] ================ drm_test_rect_calc_hscale ================
[17:04:14] [PASSED] normal use
[17:04:14] [PASSED] out of max range
[17:04:14] [PASSED] out of min range
[17:04:14] [PASSED] zero dst
[17:04:14] [PASSED] negative src
[17:04:14] [PASSED] negative dst
[17:04:14] ============ [PASSED] drm_test_rect_calc_hscale ============
[17:04:14] ================ drm_test_rect_calc_vscale ================
[17:04:14] [PASSED] normal use
[17:04:14] [PASSED] out of max range
[17:04:14] [PASSED] out of min range
[17:04:14] [PASSED] zero dst
[17:04:14] [PASSED] negative src
[17:04:14] [PASSED] negative dst
[17:04:14] ============ [PASSED] drm_test_rect_calc_vscale ============
[17:04:14] ================== drm_test_rect_rotate ===================
[17:04:14] [PASSED] reflect-x
[17:04:14] [PASSED] reflect-y
[17:04:14] [PASSED] rotate-0
[17:04:14] [PASSED] rotate-90
[17:04:14] [PASSED] rotate-180
[17:04:14] [PASSED] rotate-270
[17:04:14] ============== [PASSED] drm_test_rect_rotate ===============
[17:04:14] ================ drm_test_rect_rotate_inv =================
[17:04:14] [PASSED] reflect-x
[17:04:14] [PASSED] reflect-y
[17:04:14] [PASSED] rotate-0
[17:04:14] [PASSED] rotate-90
[17:04:14] [PASSED] rotate-180
[17:04:14] [PASSED] rotate-270
[17:04:14] ============ [PASSED] drm_test_rect_rotate_inv =============
[17:04:14] ==================== [PASSED] drm_rect =====================
[17:04:14] ============ drm_sysfb_modeset_test (1 subtest) ============
[17:04:14] ============ drm_test_sysfb_build_fourcc_list =============
[17:04:14] [PASSED] no native formats
[17:04:14] [PASSED] XRGB8888 as native format
[17:04:14] [PASSED] remove duplicates
[17:04:14] [PASSED] convert alpha formats
[17:04:14] [PASSED] random formats
[17:04:14] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[17:04:14] ============= [PASSED] drm_sysfb_modeset_test ==============
[17:04:14] ================== drm_fixp (2 subtests) ===================
[17:04:14] [PASSED] drm_test_int2fixp
[17:04:14] [PASSED] drm_test_sm2fixp
[17:04:14] ==================== [PASSED] drm_fixp =====================
[17:04:14] ============================================================
[17:04:14] Testing complete. Ran 641 tests: passed: 641
[17:04:14] Elapsed time: 27.462s total, 1.830s configuring, 25.417s building, 0.183s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[17:04:15] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:04:16] 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
[17:04:26] Starting KUnit Kernel (1/1)...
[17:04:26] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:04:27] ============= refcount_interrupt (4 subtests) ==============
[17:04:27] [PASSED] test_single_irq_change
[17:04:27] [PASSED] test_nested_irq_change
[17:04:27] [PASSED] test_multiple_irq_change
[17:04:27] [PASSED] test_irq_save
[17:04:27] =============== [PASSED] refcount_interrupt ================
[17:04:27] ================= ttm_device (5 subtests) ==================
[17:04:27] [PASSED] ttm_device_init_basic
[17:04:27] [PASSED] ttm_device_init_multiple
[17:04:27] [PASSED] ttm_device_fini_basic
[17:04:27] [PASSED] ttm_device_init_no_vma_man
[17:04:27] ================== ttm_device_init_pools ==================
[17:04:27] [PASSED] No DMA allocations, no DMA32 required
[17:04:27] [PASSED] DMA allocations, DMA32 required
[17:04:27] [PASSED] No DMA allocations, DMA32 required
[17:04:27] [PASSED] DMA allocations, no DMA32 required
[17:04:27] ============== [PASSED] ttm_device_init_pools ==============
[17:04:27] =================== [PASSED] ttm_device ====================
[17:04:27] ================== ttm_pool (8 subtests) ===================
[17:04:27] ================== ttm_pool_alloc_basic ===================
[17:04:27] [PASSED] One page
[17:04:27] [PASSED] More than one page
[17:04:27] [PASSED] Above the allocation limit
[17:04:27] [PASSED] One page, with coherent DMA mappings enabled
[17:04:27] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[17:04:27] ============== [PASSED] ttm_pool_alloc_basic ===============
[17:04:27] ============== ttm_pool_alloc_basic_dma_addr ==============
[17:04:27] [PASSED] One page
[17:04:27] [PASSED] More than one page
[17:04:27] [PASSED] Above the allocation limit
[17:04:27] [PASSED] One page, with coherent DMA mappings enabled
[17:04:27] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[17:04:27] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[17:04:27] [PASSED] ttm_pool_alloc_order_caching_match
[17:04:27] [PASSED] ttm_pool_alloc_caching_mismatch
[17:04:27] [PASSED] ttm_pool_alloc_order_mismatch
[17:04:27] [PASSED] ttm_pool_free_dma_alloc
[17:04:27] [PASSED] ttm_pool_free_no_dma_alloc
[17:04:27] [PASSED] ttm_pool_fini_basic
[17:04:27] ==================== [PASSED] ttm_pool =====================
[17:04:27] ================ ttm_resource (8 subtests) =================
[17:04:27] ================= ttm_resource_init_basic =================
[17:04:27] [PASSED] Init resource in TTM_PL_SYSTEM
[17:04:27] [PASSED] Init resource in TTM_PL_VRAM
[17:04:27] [PASSED] Init resource in a private placement
[17:04:27] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[17:04:27] ============= [PASSED] ttm_resource_init_basic =============
[17:04:27] [PASSED] ttm_resource_init_pinned
[17:04:27] [PASSED] ttm_resource_fini_basic
[17:04:27] [PASSED] ttm_resource_manager_init_basic
[17:04:27] [PASSED] ttm_resource_manager_usage_basic
[17:04:27] [PASSED] ttm_resource_manager_set_used_basic
[17:04:27] [PASSED] ttm_sys_man_alloc_basic
[17:04:27] [PASSED] ttm_sys_man_free_basic
[17:04:27] ================== [PASSED] ttm_resource ===================
[17:04:27] =================== ttm_tt (15 subtests) ===================
[17:04:27] ==================== ttm_tt_init_basic ====================
[17:04:27] [PASSED] Page-aligned size
[17:04:27] [PASSED] Extra pages requested
[17:04:27] ================ [PASSED] ttm_tt_init_basic ================
[17:04:27] [PASSED] ttm_tt_init_misaligned
[17:04:27] [PASSED] ttm_tt_fini_basic
[17:04:27] [PASSED] ttm_tt_fini_sg
[17:04:27] [PASSED] ttm_tt_fini_shmem
[17:04:27] [PASSED] ttm_tt_create_basic
[17:04:27] [PASSED] ttm_tt_create_invalid_bo_type
[17:04:27] [PASSED] ttm_tt_create_ttm_exists
[17:04:27] [PASSED] ttm_tt_create_failed
[17:04:27] [PASSED] ttm_tt_destroy_basic
[17:04:27] [PASSED] ttm_tt_populate_null_ttm
[17:04:27] [PASSED] ttm_tt_populate_populated_ttm
[17:04:27] [PASSED] ttm_tt_unpopulate_basic
[17:04:27] [PASSED] ttm_tt_unpopulate_empty_ttm
[17:04:27] [PASSED] ttm_tt_swapin_basic
[17:04:27] ===================== [PASSED] ttm_tt ======================
[17:04:27] =================== ttm_bo (14 subtests) ===================
[17:04:27] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[17:04:27] [PASSED] Cannot be interrupted and sleeps
[17:04:27] [PASSED] Cannot be interrupted, locks straight away
[17:04:27] [PASSED] Can be interrupted, sleeps
[17:04:27] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[17:04:27] [PASSED] ttm_bo_reserve_locked_no_sleep
[17:04:27] [PASSED] ttm_bo_reserve_no_wait_ticket
[17:04:27] [PASSED] ttm_bo_reserve_double_resv
[17:04:27] [PASSED] ttm_bo_reserve_interrupted
[17:04:27] [PASSED] ttm_bo_reserve_deadlock
[17:04:27] [PASSED] ttm_bo_unreserve_basic
[17:04:27] [PASSED] ttm_bo_unreserve_pinned
[17:04:27] [PASSED] ttm_bo_unreserve_bulk
[17:04:27] [PASSED] ttm_bo_fini_basic
[17:04:27] [PASSED] ttm_bo_fini_shared_resv
[17:04:27] [PASSED] ttm_bo_pin_basic
[17:04:27] [PASSED] ttm_bo_pin_unpin_resource
[17:04:27] [PASSED] ttm_bo_multiple_pin_one_unpin
[17:04:27] ===================== [PASSED] ttm_bo ======================
[17:04:27] ============== ttm_bo_validate (22 subtests) ===============
[17:04:27] ============== ttm_bo_init_reserved_sys_man ===============
[17:04:27] [PASSED] Buffer object for userspace
[17:04:27] [PASSED] Kernel buffer object
[17:04:27] [PASSED] Shared buffer object
[17:04:27] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[17:04:27] ============== ttm_bo_init_reserved_mock_man ==============
[17:04:27] [PASSED] Buffer object for userspace
[17:04:27] [PASSED] Kernel buffer object
[17:04:27] [PASSED] Shared buffer object
[17:04:27] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[17:04:27] [PASSED] ttm_bo_init_reserved_resv
[17:04:27] ================== ttm_bo_validate_basic ==================
[17:04:27] [PASSED] Buffer object for userspace
[17:04:27] [PASSED] Kernel buffer object
[17:04:27] [PASSED] Shared buffer object
[17:04:27] ============== [PASSED] ttm_bo_validate_basic ==============
[17:04:27] [PASSED] ttm_bo_validate_invalid_placement
[17:04:27] ============= ttm_bo_validate_same_placement ==============
[17:04:27] [PASSED] System manager
[17:04:27] [PASSED] VRAM manager
[17:04:27] ========= [PASSED] ttm_bo_validate_same_placement ==========
[17:04:27] [PASSED] ttm_bo_validate_failed_alloc
[17:04:27] [PASSED] ttm_bo_validate_pinned
[17:04:27] [PASSED] ttm_bo_validate_busy_placement
[17:04:27] ================ ttm_bo_validate_multihop =================
[17:04:27] [PASSED] Buffer object for userspace
[17:04:27] [PASSED] Kernel buffer object
[17:04:27] [PASSED] Shared buffer object
[17:04:27] ============ [PASSED] ttm_bo_validate_multihop =============
[17:04:27] ========== ttm_bo_validate_no_placement_signaled ==========
[17:04:27] [PASSED] Buffer object in system domain, no page vector
[17:04:27] [PASSED] Buffer object in system domain with an existing page vector
[17:04:27] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[17:04:27] ======== ttm_bo_validate_no_placement_not_signaled ========
[17:04:27] [PASSED] Buffer object for userspace
[17:04:27] [PASSED] Kernel buffer object
[17:04:27] [PASSED] Shared buffer object
[17:04:27] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[17:04:27] [PASSED] ttm_bo_validate_move_fence_signaled
[17:04:27] ========= ttm_bo_validate_move_fence_not_signaled =========
[17:04:27] [PASSED] Waits for GPU
[17:04:27] [PASSED] Tries to lock straight away
[17:04:27] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[17:04:27] [PASSED] ttm_bo_validate_swapout
[17:04:27] [PASSED] ttm_bo_validate_happy_evict
[17:04:27] [PASSED] ttm_bo_validate_all_pinned_evict
[17:04:27] [PASSED] ttm_bo_validate_allowed_only_evict
[17:04:27] [PASSED] ttm_bo_validate_deleted_evict
[17:04:27] [PASSED] ttm_bo_validate_busy_domain_evict
[17:04:27] [PASSED] ttm_bo_validate_evict_gutting
[17:04:27] [PASSED] ttm_bo_validate_recrusive_evict
[17:04:27] ================= [PASSED] ttm_bo_validate =================
[17:04:27] ============================================================
[17:04:27] Testing complete. Ran 106 tests: passed: 106
[17:04:27] Elapsed time: 12.162s total, 1.834s configuring, 10.063s building, 0.215s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[17:04:27] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:04:29] 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
[17:04:37] Starting KUnit Kernel (1/1)...
[17:04:37] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:04:37] ============= refcount_interrupt (4 subtests) ==============
[17:04:37] [PASSED] test_single_irq_change
[17:04:37] [PASSED] test_nested_irq_change
[17:04:37] [PASSED] test_multiple_irq_change
[17:04:37] [PASSED] test_irq_save
[17:04:37] =============== [PASSED] refcount_interrupt ================
[17:04:37] =============== dma-buf-fence (12 subtests) ================
[17:04:37] [PASSED] test_sanitycheck
[17:04:37] [PASSED] test_signaling
[17:04:37] [PASSED] test_add_callback
[17:04:37] [PASSED] test_late_add_callback
[17:04:37] [PASSED] test_rm_callback
[17:04:37] [PASSED] test_late_rm_callback
[17:04:37] [PASSED] test_status
[17:04:37] [PASSED] test_error
[17:04:37] [PASSED] test_wait
[17:04:37] [PASSED] test_wait_timeout
[17:04:37] [PASSED] test_stub
[17:04:37] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[17:04:37] ================== [PASSED] dma-buf-fence ==================
[17:04:37] ============ dma-buf-fence-chain (11 subtests) =============
[17:04:37] [PASSED] test_sanitycheck
[17:04:37] [PASSED] test_find_seqno
[17:04:37] [PASSED] test_find_signaled
[17:04:37] [PASSED] test_find_out_of_order
[17:04:42] [PASSED] test_find_gap
[17:04:42] [PASSED] test_find_race
[17:04:42] [PASSED] test_signal_forward
[17:04:43] [PASSED] test_signal_backward
[17:04:43] [PASSED] test_wait_forward
[17:04:43] [PASSED] test_wait_backward
[17:04:43] [PASSED] test_wait_random
[17:04:43] =============== [PASSED] dma-buf-fence-chain ===============
[17:04:43] ============ dma-buf-fence-unwrap (10 subtests) ============
[17:04:43] [PASSED] test_sanitycheck
[17:04:43] [PASSED] test_unwrap_array
[17:04:43] [PASSED] test_unwrap_chain
[17:04:43] [PASSED] test_unwrap_chain_array
[17:04:43] [PASSED] test_unwrap_merge
[17:04:43] [PASSED] test_unwrap_merge_duplicate
[17:04:43] [PASSED] test_unwrap_merge_seqno
[17:04:43] [PASSED] test_unwrap_merge_order
[17:04:43] [PASSED] test_unwrap_merge_complex
[17:04:43] [PASSED] test_unwrap_merge_complex_seqno
[17:04:43] ============== [PASSED] dma-buf-fence-unwrap ===============
[17:04:43] ================ dma-buf-resv (5 subtests) =================
[17:04:43] [PASSED] test_sanitycheck
[17:04:43] ===================== test_signaling ======================
[17:04:43] [PASSED] kernel
[17:04:43] [PASSED] write
[17:04:43] [PASSED] read
[17:04:43] [PASSED] bookkeep
[17:04:43] ================= [PASSED] test_signaling ==================
[17:04:43] ====================== test_for_each ======================
[17:04:43] [PASSED] kernel
[17:04:43] [PASSED] write
[17:04:43] [PASSED] read
[17:04:43] [PASSED] bookkeep
[17:04:43] ================== [PASSED] test_for_each ==================
[17:04:43] ================= test_for_each_unlocked ==================
[17:04:43] [PASSED] kernel
[17:04:43] [PASSED] write
[17:04:43] [PASSED] read
[17:04:43] [PASSED] bookkeep
[17:04:43] ============= [PASSED] test_for_each_unlocked ==============
[17:04:43] ===================== test_get_fences =====================
[17:04:43] [PASSED] kernel
[17:04:43] [PASSED] write
[17:04:43] [PASSED] read
[17:04:43] [PASSED] bookkeep
[17:04:43] ================= [PASSED] test_get_fences =================
[17:04:43] ================== [PASSED] dma-buf-resv ===================
[17:04:43] ============================================================
[17:04:43] Testing complete. Ran 54 tests: passed: 53, skipped: 1
[17:04:43] Elapsed time: 15.675s total, 1.767s configuring, 8.636s building, 5.260s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 38+ messages in thread* ✓ Xe.CI.BAT: success for Add memory page offlining support (rev24)
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (16 preceding siblings ...)
2026-09-02 17:04 ` ✓ CI.KUnit: success " Patchwork
@ 2026-09-02 17:42 ` Patchwork
2026-09-03 6:57 ` ✓ Xe.CI.FULL: " Patchwork
18 siblings, 0 replies; 38+ messages in thread
From: Patchwork @ 2026-09-02 17:42 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 2115 bytes --]
== Series Details ==
Series: Add memory page offlining support (rev24)
URL : https://patchwork.freedesktop.org/series/161473/
State : success
== Summary ==
CI Bug Log - changes from xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7_BAT -> xe-pw-161473v24_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (12 -> 12)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in xe-pw-161473v24_BAT that come from known issues:
### IGT changes ###
#### Possible fixes ####
* igt@xe_waitfence@engine:
- bat-ptl-2: [FAIL][1] -> [PASS][2]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/bat-ptl-2/igt@xe_waitfence@engine.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/bat-ptl-2/igt@xe_waitfence@engine.html
- bat-wcl-1: [FAIL][3] ([Intel XE#9103]) -> [PASS][4]
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/bat-wcl-1/igt@xe_waitfence@engine.html
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/bat-wcl-1/igt@xe_waitfence@engine.html
* igt@xe_waitfence@reltime:
- bat-wcl-1: [FAIL][5] -> [PASS][6]
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/bat-wcl-1/igt@xe_waitfence@reltime.html
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/bat-wcl-1/igt@xe_waitfence@reltime.html
[Intel XE#9103]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9103
Build changes
-------------
* Linux: xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7 -> xe-pw-161473v24
IGT_9080: 65c1a091179475c3f0cd925799b49f58720bcf43 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7: 9a6566667a8b712e9b28a1469c282187a6d043c7
xe-pw-161473v24: 161473v24
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/index.html
[-- Attachment #2: Type: text/html, Size: 2730 bytes --]
^ permalink raw reply [flat|nested] 38+ messages in thread* ✓ Xe.CI.FULL: success for Add memory page offlining support (rev24)
2026-09-02 14:53 [PATCH V20 00/15] Add memory page offlining support Tejas Upadhyay
` (17 preceding siblings ...)
2026-09-02 17:42 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-09-03 6:57 ` Patchwork
18 siblings, 0 replies; 38+ messages in thread
From: Patchwork @ 2026-09-03 6:57 UTC (permalink / raw)
To: Upadhyay, Tejas; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 22245 bytes --]
== Series Details ==
Series: Add memory page offlining support (rev24)
URL : https://patchwork.freedesktop.org/series/161473/
State : success
== Summary ==
CI Bug Log - changes from xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7_FULL -> xe-pw-161473v24_FULL
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (2 -> 2)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in xe-pw-161473v24_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels:
- shard-bmg: NOTRUN -> [SKIP][1] ([Intel XE#2370])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels.html
* igt@kms_big_fb@linear-max-hw-stride-64bpp-rotate-0-hflip:
- shard-bmg: NOTRUN -> [SKIP][2] ([Intel XE#7059] / [Intel XE#7085])
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_big_fb@linear-max-hw-stride-64bpp-rotate-0-hflip.html
* igt@kms_big_fb@x-tiled-32bpp-rotate-270:
- shard-bmg: NOTRUN -> [SKIP][3] ([Intel XE#2327])
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_big_fb@x-tiled-32bpp-rotate-270.html
* igt@kms_big_fb@y-tiled-addfb:
- shard-bmg: NOTRUN -> [SKIP][4] ([Intel XE#2328] / [Intel XE#7367])
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_big_fb@y-tiled-addfb.html
* igt@kms_big_fb@yf-tiled-16bpp-rotate-180:
- shard-bmg: NOTRUN -> [SKIP][5] ([Intel XE#1124]) +3 other tests skip
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_big_fb@yf-tiled-16bpp-rotate-180.html
* igt@kms_bw@connected-linear-tiling-3-displays-target-2560x1440p:
- shard-bmg: NOTRUN -> [SKIP][6] ([Intel XE#7679])
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_bw@connected-linear-tiling-3-displays-target-2560x1440p.html
* igt@kms_bw@linear-tiling-1-displays-target-3840x2160p:
- shard-bmg: NOTRUN -> [SKIP][7] ([Intel XE#367])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_bw@linear-tiling-1-displays-target-3840x2160p.html
* igt@kms_ccs@bad-pixel-format-4-tiled-dg2-mc-ccs:
- shard-bmg: NOTRUN -> [SKIP][8] ([Intel XE#2887]) +4 other tests skip
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_ccs@bad-pixel-format-4-tiled-dg2-mc-ccs.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
- shard-bmg: NOTRUN -> [INCOMPLETE][9] ([Intel XE#7084] / [Intel XE#8150]) +1 other test incomplete
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
* igt@kms_chamelium_audio@dp-audio-after-suspend:
- shard-bmg: NOTRUN -> [SKIP][10] ([Intel XE#2252]) +4 other tests skip
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_chamelium_audio@dp-audio-after-suspend.html
* igt@kms_content_protection@dp-mst-lic-type-1:
- shard-bmg: NOTRUN -> [SKIP][11] ([Intel XE#2390] / [Intel XE#6974])
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_content_protection@dp-mst-lic-type-1.html
* igt@kms_cursor_crc@cursor-random-256x85:
- shard-bmg: NOTRUN -> [SKIP][12] ([Intel XE#2320]) +2 other tests skip
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_cursor_crc@cursor-random-256x85.html
* igt@kms_cursor_legacy@flip-vs-cursor-legacy:
- shard-bmg: [PASS][13] -> [FAIL][14] ([Intel XE#7809])
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-bmg-3/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
* igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
- shard-bmg: NOTRUN -> [SKIP][15] ([Intel XE#2286] / [Intel XE#6035])
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html
* igt@kms_dsc@dsc-with-bpc-formats-ultrajoiner:
- shard-bmg: NOTRUN -> [SKIP][16] ([Intel XE#8265]) +1 other test skip
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_dsc@dsc-with-bpc-formats-ultrajoiner.html
* igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1:
- shard-lnl: [PASS][17] -> [FAIL][18] ([Intel XE#301] / [Intel XE#3149])
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html
* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling:
- shard-bmg: NOTRUN -> [SKIP][19] ([Intel XE#7178] / [Intel XE#7349])
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling.html
* igt@kms_frontbuffer_tracking@drrs-abgr161616f-draw-render:
- shard-bmg: NOTRUN -> [SKIP][20] ([Intel XE#7061] / [Intel XE#7356]) +1 other test skip
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-abgr161616f-draw-render.html
* igt@kms_frontbuffer_tracking@drrs-rgb565-draw-render:
- shard-bmg: NOTRUN -> [SKIP][21] ([Intel XE#2311]) +21 other tests skip
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-rgb565-draw-render.html
* igt@kms_frontbuffer_tracking@drrshdr-abgr161616f-draw-blt:
- shard-bmg: NOTRUN -> [SKIP][22] ([Intel XE#7061])
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_frontbuffer_tracking@drrshdr-abgr161616f-draw-blt.html
* igt@kms_frontbuffer_tracking@fbc-rgb565-draw-render:
- shard-bmg: NOTRUN -> [SKIP][23] ([Intel XE#4141]) +7 other tests skip
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-render.html
* igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-primscrn-cur-indfb-draw-render:
- shard-bmg: NOTRUN -> [SKIP][24] ([Intel XE#2313]) +26 other tests skip
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-primscrn-cur-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@plane-fbc-rte:
- shard-bmg: NOTRUN -> [SKIP][25] ([Intel XE#2350] / [Intel XE#7503])
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_frontbuffer_tracking@plane-fbc-rte.html
* igt@kms_joiner@invalid-modeset-ultra-joiner:
- shard-bmg: NOTRUN -> [SKIP][26] ([Intel XE#6911] / [Intel XE#7378])
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_joiner@invalid-modeset-ultra-joiner.html
* igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area-big-fb:
- shard-bmg: NOTRUN -> [SKIP][27] ([Intel XE#1489]) +2 other tests skip
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area-big-fb.html
* igt@kms_psr@fbc-pr-sprite-blt:
- shard-bmg: NOTRUN -> [SKIP][28] ([Intel XE#2234] / [Intel XE#2850]) +5 other tests skip
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_psr@fbc-pr-sprite-blt.html
* igt@kms_rotation_crc@primary-y-tiled-reflect-x-0:
- shard-bmg: NOTRUN -> [SKIP][29] ([Intel XE#2330] / [Intel XE#5813])
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_rotation_crc@primary-y-tiled-reflect-x-0.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
- shard-bmg: NOTRUN -> [SKIP][30] ([Intel XE#3904] / [Intel XE#7342])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html
* igt@kms_scaling_modes@scaling-mode-full-aspect:
- shard-bmg: NOTRUN -> [SKIP][31] ([Intel XE#2413])
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_scaling_modes@scaling-mode-full-aspect.html
* igt@kms_sharpness_filter@invalid-filter-with-scaling-mode:
- shard-bmg: NOTRUN -> [SKIP][32] ([Intel XE#6503]) +1 other test skip
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_sharpness_filter@invalid-filter-with-scaling-mode.html
* igt@kms_vrr@lobf-dc3co:
- shard-bmg: NOTRUN -> [SKIP][33] ([Intel XE#8397])
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@kms_vrr@lobf-dc3co.html
* igt@xe_compute@eu-busy-10s:
- shard-bmg: NOTRUN -> [SKIP][34] ([Intel XE#6599]) +1 other test skip
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_compute@eu-busy-10s.html
* igt@xe_evict@evict-cm-threads-small-multi-queue:
- shard-bmg: NOTRUN -> [SKIP][35] ([Intel XE#8370])
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_evict@evict-cm-threads-small-multi-queue.html
* igt@xe_exec_basic@multigpu-once-bindexecqueue-rebind:
- shard-bmg: NOTRUN -> [SKIP][36] ([Intel XE#2322] / [Intel XE#7372]) +1 other test skip
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_exec_basic@multigpu-once-bindexecqueue-rebind.html
* igt@xe_exec_fault_mode@twice-multi-queue-userptr-rebind-prefetch:
- shard-bmg: NOTRUN -> [SKIP][37] ([Intel XE#8374]) +1 other test skip
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_exec_fault_mode@twice-multi-queue-userptr-rebind-prefetch.html
* igt@xe_exec_multi_queue@few-execs-preempt-mode-priority:
- shard-bmg: NOTRUN -> [SKIP][38] ([Intel XE#8364]) +11 other tests skip
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_exec_multi_queue@few-execs-preempt-mode-priority.html
* igt@xe_exec_reset@multi-queue-cat-error-on-secondary:
- shard-bmg: NOTRUN -> [SKIP][39] ([Intel XE#8369]) +2 other tests skip
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@xe_exec_reset@multi-queue-cat-error-on-secondary.html
* igt@xe_exec_threads@threads-multi-queue-mixed-shared-vm-userptr-invalidate-race:
- shard-bmg: NOTRUN -> [SKIP][40] ([Intel XE#8378]) +3 other tests skip
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_exec_threads@threads-multi-queue-mixed-shared-vm-userptr-invalidate-race.html
* igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit:
- shard-bmg: NOTRUN -> [SKIP][41] ([Intel XE#2229])
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html
* igt@xe_mmap@small-bar:
- shard-bmg: NOTRUN -> [SKIP][42] ([Intel XE#586] / [Intel XE#7323] / [Intel XE#7384])
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@xe_mmap@small-bar.html
* igt@xe_multigpu_svm@mgpu-xgpu-access-prefetch:
- shard-bmg: NOTRUN -> [SKIP][43] ([Intel XE#6964])
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_multigpu_svm@mgpu-xgpu-access-prefetch.html
* igt@xe_page_reclaim@prl-invalidate-full:
- shard-bmg: NOTRUN -> [SKIP][44] ([Intel XE#7793])
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_page_reclaim@prl-invalidate-full.html
* igt@xe_pm@s2idle-d3cold-basic-exec:
- shard-bmg: NOTRUN -> [SKIP][45] ([Intel XE#2284] / [Intel XE#7370])
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_pm@s2idle-d3cold-basic-exec.html
* igt@xe_pxp@pxp-stale-bo-exec-post-rpm:
- shard-bmg: NOTRUN -> [SKIP][46] ([Intel XE#4733] / [Intel XE#7417])
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-3/igt@xe_pxp@pxp-stale-bo-exec-post-rpm.html
* igt@xe_wedged@basic-wedged:
- shard-bmg: NOTRUN -> [DMESG-WARN][47] ([Intel XE#8963])
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@xe_wedged@basic-wedged.html
#### Possible fixes ####
* igt@kms_hdr@invalid-hdr:
- shard-bmg: [SKIP][48] ([Intel XE#1503]) -> [PASS][49]
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-bmg-9/igt@kms_hdr@invalid-hdr.html
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-7/igt@kms_hdr@invalid-hdr.html
* igt@kms_pm_rpm@system-suspend-idle:
- shard-bmg: [ABORT][50] ([Intel XE#9093]) -> [PASS][51]
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-bmg-6/igt@kms_pm_rpm@system-suspend-idle.html
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-4/igt@kms_pm_rpm@system-suspend-idle.html
* igt@kms_setmode@basic:
- shard-bmg: [FAIL][52] ([Intel XE#8618]) -> [PASS][53] +4 other tests pass
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-bmg-9/igt@kms_setmode@basic.html
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-10/igt@kms_setmode@basic.html
* igt@kms_setmode@basic@pipe-a-dp-2:
- shard-bmg: [FAIL][54] -> [PASS][55] +1 other test pass
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-bmg-9/igt@kms_setmode@basic@pipe-a-dp-2.html
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-10/igt@kms_setmode@basic@pipe-a-dp-2.html
* igt@xe_pmu@engine-activity-accuracy-50:
- shard-bmg: [FAIL][56] ([Intel XE#8555]) -> [PASS][57] +1 other test pass
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-bmg-4/igt@xe_pmu@engine-activity-accuracy-50.html
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-2/igt@xe_pmu@engine-activity-accuracy-50.html
#### Warnings ####
* igt@kms_flip@flip-vs-expired-vblank-interruptible:
- shard-lnl: [FAIL][58] ([Intel XE#301]) -> [FAIL][59] ([Intel XE#301] / [Intel XE#3149])
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
* igt@kms_hdr@brightness-with-hdr:
- shard-bmg: [SKIP][60] ([Intel XE#3544]) -> [SKIP][61] ([Intel XE#3374] / [Intel XE#3544])
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-bmg-3/igt@kms_hdr@brightness-with-hdr.html
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-2/igt@kms_hdr@brightness-with-hdr.html
* igt@kms_tiled_display@basic-test-pattern:
- shard-bmg: [SKIP][62] ([Intel XE#2426] / [Intel XE#5848]) -> [FAIL][63] ([Intel XE#1729] / [Intel XE#7424])
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7/shard-bmg-8/igt@kms_tiled_display@basic-test-pattern.html
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/shard-bmg-10/igt@kms_tiled_display@basic-test-pattern.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#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
[Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
[Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
[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#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
[Intel XE#2286]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2286
[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#2328]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2328
[Intel XE#2330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2330
[Intel XE#2350]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2350
[Intel XE#2370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2370
[Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
[Intel XE#2413]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2413
[Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
[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#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
[Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
[Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
[Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
[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#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
[Intel XE#586]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/586
[Intel XE#6035]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6035
[Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
[Intel XE#6599]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6599
[Intel XE#6911]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6911
[Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
[Intel XE#6974]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6974
[Intel XE#7059]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7059
[Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
[Intel XE#7084]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7084
[Intel XE#7085]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7085
[Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
[Intel XE#7323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7323
[Intel XE#7342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7342
[Intel XE#7349]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7349
[Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
[Intel XE#7367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7367
[Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
[Intel XE#7372]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7372
[Intel XE#7378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7378
[Intel XE#7384]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7384
[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#7503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7503
[Intel XE#7679]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7679
[Intel XE#7793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7793
[Intel XE#7809]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7809
[Intel XE#8150]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8150
[Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
[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#8370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8370
[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#8397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8397
[Intel XE#8555]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8555
[Intel XE#8618]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8618
[Intel XE#8963]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8963
[Intel XE#9093]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9093
Build changes
-------------
* Linux: xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7 -> xe-pw-161473v24
IGT_9080: 65c1a091179475c3f0cd925799b49f58720bcf43 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-5676-9a6566667a8b712e9b28a1469c282187a6d043c7: 9a6566667a8b712e9b28a1469c282187a6d043c7
xe-pw-161473v24: 161473v24
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161473v24/index.html
[-- Attachment #2: Type: text/html, Size: 24194 bytes --]
^ permalink raw reply [flat|nested] 38+ messages in thread