Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Fix fs_reclaim deadlock caused by CCS save/restore
@ 2026-02-04 16:46 Satyanarayana K V P
  2026-02-04 16:46 ` [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers Satyanarayana K V P
                   ` (5 more replies)
  0 siblings, 6 replies; 17+ messages in thread
From: Satyanarayana K V P @ 2026-02-04 16:46 UTC (permalink / raw)
  To: intel-xe; +Cc: Satyanarayana K V P

CCS save/restore batch buffers are currently attached during BO allocation
and detached during BO teardown. The shrinker also triggers xe_bo_move(),
which is used for both allocation and deletion paths.

When BO allocation and shrinking occur concurrently, a circular locking
dependency involving fs_reclaim and swap_guard can occur, leading to a
deadlock such as:

======================================================
WARNING: possible circular locking dependency detected
------------------------------------------------------
CPU0                    CPU1
----                    ----
lock(fs_reclaim);
                        lock(&sa_manager->swap_guard);
                        lock(fs_reclaim);
lock(&sa_manager->swap_guard);
***  DEADLOCK   ***
=====================================================

To avoid this, the BB pointer allocation is separated from xe_bb_ccs_new(),
used drm_suballoc_alloc() for SA allocation and drm_suballoc_init() for BB
allocation preventing reclaim from being invoked in this context.

---
V1 -> V2:
- Splitted drm_suballoc_new() into drm_suballoc_alloc() and
drm_suballoc_init() (Thomas).
- Used drm_suballoc_alloc() and drm_suballoc_init() for BB allocation
(Thomas).

Satyanarayana K V P (3):
  drm/sa: Split drm_suballoc_new() into SA alloc and init helpers
  drm/xe/sa: Add lockdep annotations for SA manager swap_guard
  drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation

 drivers/gpu/drm/drm_suballoc.c  | 135 ++++++++++++++++++++++++--------
 drivers/gpu/drm/xe/xe_bb.c      |  22 ++----
 drivers/gpu/drm/xe/xe_bb.h      |   4 +-
 drivers/gpu/drm/xe/xe_migrate.c |  29 ++++++-
 drivers/gpu/drm/xe/xe_sa.c      |  30 +++++++
 drivers/gpu/drm/xe/xe_sa.h      |  19 +++++
 include/drm/drm_suballoc.h      |   8 ++
 7 files changed, 196 insertions(+), 51 deletions(-)

-- 
2.43.0


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

* [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers
  2026-02-04 16:46 [PATCH v2 0/3] Fix fs_reclaim deadlock caused by CCS save/restore Satyanarayana K V P
@ 2026-02-04 16:46 ` Satyanarayana K V P
  2026-02-04 19:45   ` Matthew Brost
  2026-02-06 12:34   ` Thomas Hellström
  2026-02-04 16:46 ` [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard Satyanarayana K V P
                   ` (4 subsequent siblings)
  5 siblings, 2 replies; 17+ messages in thread
From: Satyanarayana K V P @ 2026-02-04 16:46 UTC (permalink / raw)
  To: intel-xe
  Cc: Satyanarayana K V P, Matthew Brost, Thomas Hellström,
	Michal Wajdeczko, Matthew Auld

drm_suballoc_new() currently both allocates the SA object using kmalloc()
and searches for a suitable hole in the sub-allocator for the requested
size. Since kmalloc() may take internal locks, performing memory
allocation while holding the sub-allocator mutex can trigger lockdep
deadlock warnings.

Fix this by splitting SA allocation from drm_suballoc_new(), separating
object allocation from sub-allocator initialization and hole selection.

Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Suggested-by: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>

---
V1 -> V2:
- Splitted drm_suballoc_new() into drm_suballoc_alloc() and
drm_suballoc_init() (Thomas).
---
 drivers/gpu/drm/drm_suballoc.c | 135 +++++++++++++++++++++++++--------
 include/drm/drm_suballoc.h     |   8 ++
 2 files changed, 112 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/drm_suballoc.c b/drivers/gpu/drm/drm_suballoc.c
index 879ea33dbbc4..6f21f9e048d6 100644
--- a/drivers/gpu/drm/drm_suballoc.c
+++ b/drivers/gpu/drm/drm_suballoc.c
@@ -123,7 +123,7 @@ static void drm_suballoc_remove_locked(struct drm_suballoc *sa)
 	list_del_init(&sa->olist);
 	list_del_init(&sa->flist);
 	dma_fence_put(sa->fence);
-	kfree(sa);
+	drm_suballoc_release(sa);
 }
 
 static void drm_suballoc_try_free(struct drm_suballoc_manager *sa_manager)
@@ -293,45 +293,75 @@ static bool drm_suballoc_next_hole(struct drm_suballoc_manager *sa_manager,
 }
 
 /**
- * drm_suballoc_new() - Make a suballocation.
+ * drm_suballoc_alloc() - Allocate uninitialized suballoc object.
+ * @gfp: gfp flags used for memory allocation.
+ *
+ * Allocate memory for an uninitialized suballoc object. Intended usage is
+ * allocate memory for suballoc object outside of a reclaim tainted context
+ * and then be initialized at a later time in a reclaim tainted context.
+ *
+ * @drm_suballoc_release should be used to release the memory if returned
+ * suballoc object is in uninitialized state.
+ *
+ * Return: a new uninitialized suballoc object, or an ERR_PTR(-ENOMEM).
+ */
+struct drm_suballoc *drm_suballoc_alloc(gfp_t gfp)
+{
+	struct drm_suballoc *sa;
+
+	sa = kmalloc(sizeof(*sa), gfp);
+	if (!sa)
+		return ERR_PTR(-ENOMEM);
+
+	return sa;
+}
+EXPORT_SYMBOL(drm_suballoc_alloc);
+
+/**
+ * drm_suballoc_release() - Release memory for suballocation.
+ * @sa: The struct drm_suballoc.
+ */
+void drm_suballoc_release(struct drm_suballoc *sa)
+{
+	kfree(sa);
+}
+EXPORT_SYMBOL(drm_suballoc_release);
+
+/**
+ * drm_suballoc_init() - Initialize a suballocation.
  * @sa_manager: pointer to the sa_manager
+ * @sa: The struct drm_suballoc.
  * @size: number of bytes we want to suballocate.
- * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL but
- *       the argument is provided for suballocations from reclaim context or
- *       where the caller wants to avoid pipelining rather than wait for
- *       reclaim.
  * @intr: Whether to perform waits interruptible. This should typically
  *        always be true, unless the caller needs to propagate a
  *        non-interruptible context from above layers.
  * @align: Alignment. Must not exceed the default manager alignment.
  *         If @align is zero, then the manager alignment is used.
+ * @timeout: Time to a wait suballocation to become available.
  *
- * Try to make a suballocation of size @size, which will be rounded
- * up to the alignment specified in specified in drm_suballoc_manager_init().
+ * Try to make a suballocation on a pre-allocated suballoc object of size @size,
+ * which will be rounded up to the alignment specified in specified in
+ * drm_suballoc_manager_init().
  *
- * Return: a new suballocated bo, or an ERR_PTR.
+ * Return: zero on success, errno on failure.
  */
-struct drm_suballoc *
-drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
-		 gfp_t gfp, bool intr, size_t align)
+int drm_suballoc_init(struct drm_suballoc_manager *sa_manager,
+		      struct drm_suballoc *sa, size_t size,
+		      bool intr, size_t align, signed long timeout)
 {
 	struct dma_fence *fences[DRM_SUBALLOC_MAX_QUEUES];
 	unsigned int tries[DRM_SUBALLOC_MAX_QUEUES];
 	unsigned int count;
 	int i, r;
-	struct drm_suballoc *sa;
 
 	if (WARN_ON_ONCE(align > sa_manager->align))
-		return ERR_PTR(-EINVAL);
+		return -EINVAL;
 	if (WARN_ON_ONCE(size > sa_manager->size || !size))
-		return ERR_PTR(-EINVAL);
+		return -EINVAL;
 
 	if (!align)
 		align = sa_manager->align;
 
-	sa = kmalloc(sizeof(*sa), gfp);
-	if (!sa)
-		return ERR_PTR(-ENOMEM);
 	sa->manager = sa_manager;
 	sa->fence = NULL;
 	INIT_LIST_HEAD(&sa->olist);
@@ -339,6 +369,8 @@ drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
 
 	spin_lock(&sa_manager->wq.lock);
 	do {
+		long t;
+
 		for (i = 0; i < DRM_SUBALLOC_MAX_QUEUES; ++i)
 			tries[i] = 0;
 
@@ -348,7 +380,7 @@ drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
 			if (drm_suballoc_try_alloc(sa_manager, sa,
 						   size, align)) {
 				spin_unlock(&sa_manager->wq.lock);
-				return sa;
+				return 0;
 			}
 
 			/* see if we can skip over some allocations */
@@ -359,34 +391,75 @@ drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
 				fences[count++] = dma_fence_get(fences[i]);
 
 		if (count) {
-			long t;
-
 			spin_unlock(&sa_manager->wq.lock);
 			t = dma_fence_wait_any_timeout(fences, count, intr,
-						       MAX_SCHEDULE_TIMEOUT,
-						       NULL);
+						       timeout, NULL);
 			for (i = 0; i < count; ++i)
 				dma_fence_put(fences[i]);
 
-			r = (t > 0) ? 0 : t;
 			spin_lock(&sa_manager->wq.lock);
 		} else if (intr) {
+			spin_unlock(&sa_manager->wq.lock);
 			/* if we have nothing to wait for block */
-			r = wait_event_interruptible_locked
+			r = wait_event_interruptible_timeout
 				(sa_manager->wq,
-				 __drm_suballoc_event(sa_manager, size, align));
+				 __drm_suballoc_event(sa_manager, size, align),
+				 timeout);
+			spin_lock(&sa_manager->wq.lock);
 		} else {
 			spin_unlock(&sa_manager->wq.lock);
-			wait_event(sa_manager->wq,
-				   drm_suballoc_event(sa_manager, size, align));
-			r = 0;
+			t = wait_event_timeout
+				(sa_manager->wq,
+				 drm_suballoc_event(sa_manager, size, align),
+				 timeout);
 			spin_lock(&sa_manager->wq.lock);
 		}
+		r = (t > 0) ? 0 : !r ? -ETIME : t;
 	} while (!r);
 
 	spin_unlock(&sa_manager->wq.lock);
-	kfree(sa);
-	return ERR_PTR(r);
+	return r;
+}
+EXPORT_SYMBOL(drm_suballoc_init);
+
+/**
+ * drm_suballoc_new() - Make a suballocation.
+ * @sa_manager: pointer to the sa_manager
+ * @size: number of bytes we want to suballocate.
+ * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL but
+ *       the argument is provided for suballocations from reclaim context or
+ *       where the caller wants to avoid pipelining rather than wait for
+ *       reclaim.
+ * @intr: Whether to perform waits interruptible. This should typically
+ *        always be true, unless the caller needs to propagate a
+ *        non-interruptible context from above layers.
+ * @align: Alignment. Must not exceed the default manager alignment.
+ *         If @align is zero, then the manager alignment is used.
+ *
+ * Try to make a suballocation of size @size, which will be rounded
+ * up to the alignment specified in specified in drm_suballoc_manager_init().
+ *
+ * Return: a new suballocated bo, or an ERR_PTR.
+ */
+struct drm_suballoc *
+drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
+		 gfp_t gfp, bool intr, size_t align)
+{
+	struct drm_suballoc *sa;
+	int err;
+
+	sa = drm_suballoc_alloc(gfp);
+	if (IS_ERR(sa))
+		return sa;
+
+	err = drm_suballoc_init(sa_manager, sa, size, intr, align,
+				MAX_SCHEDULE_TIMEOUT);
+	if (err) {
+		drm_suballoc_release(sa);
+		return ERR_PTR(err);
+	}
+
+	return sa;
 }
 EXPORT_SYMBOL(drm_suballoc_new);
 
diff --git a/include/drm/drm_suballoc.h b/include/drm/drm_suballoc.h
index 7ba72a81a808..cff0e14556d1 100644
--- a/include/drm/drm_suballoc.h
+++ b/include/drm/drm_suballoc.h
@@ -53,6 +53,14 @@ void drm_suballoc_manager_init(struct drm_suballoc_manager *sa_manager,
 
 void drm_suballoc_manager_fini(struct drm_suballoc_manager *sa_manager);
 
+struct drm_suballoc *drm_suballoc_alloc(gfp_t gfp);
+
+void drm_suballoc_release(struct drm_suballoc *sa);
+
+int drm_suballoc_init(struct drm_suballoc_manager *sa_manager,
+		      struct drm_suballoc *sa, size_t size, bool intr,
+		      size_t align, signed long timeout);
+
 struct drm_suballoc *
 drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
 		 gfp_t gfp, bool intr, size_t align);
-- 
2.43.0


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

* [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard
  2026-02-04 16:46 [PATCH v2 0/3] Fix fs_reclaim deadlock caused by CCS save/restore Satyanarayana K V P
  2026-02-04 16:46 ` [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers Satyanarayana K V P
@ 2026-02-04 16:46 ` Satyanarayana K V P
  2026-02-04 19:11   ` Matthew Brost
  2026-02-06 16:17   ` Thomas Hellström
  2026-02-04 16:46 ` [PATCH v2 3/3] drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation Satyanarayana K V P
                   ` (3 subsequent siblings)
  5 siblings, 2 replies; 17+ messages in thread
From: Satyanarayana K V P @ 2026-02-04 16:46 UTC (permalink / raw)
  To: intel-xe; +Cc: Satyanarayana K V P, Matthew Brost, Michal Wajdeczko,
	Matthew Auld

Annotate the SA manager init path to model taking swap_guard while under
reclaim context. This helps lockdep catch potential circular dependencies
between fs_reclaim and swap_guard in debug builds.

Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Suggested-by: Matthew Brost <matthew.brost@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>

---
V1 -> V2:
- None.
---
 drivers/gpu/drm/xe/xe_sa.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_sa.c b/drivers/gpu/drm/xe/xe_sa.c
index b738102575d4..5efbb5a09f77 100644
--- a/drivers/gpu/drm/xe/xe_sa.c
+++ b/drivers/gpu/drm/xe/xe_sa.c
@@ -89,6 +89,12 @@ struct xe_sa_manager *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size,
 		if (ret)
 			return ERR_PTR(ret);
 
+		if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
+			fs_reclaim_acquire(GFP_KERNEL);
+			might_lock(&sa_manager->swap_guard);
+			fs_reclaim_release(GFP_KERNEL);
+		}
+
 		shadow = xe_managed_bo_create_pin_map(xe, tile, size,
 						      XE_BO_FLAG_VRAM_IF_DGFX(tile) |
 						      XE_BO_FLAG_GGTT |
-- 
2.43.0


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

* [PATCH v2 3/3] drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation
  2026-02-04 16:46 [PATCH v2 0/3] Fix fs_reclaim deadlock caused by CCS save/restore Satyanarayana K V P
  2026-02-04 16:46 ` [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers Satyanarayana K V P
  2026-02-04 16:46 ` [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard Satyanarayana K V P
@ 2026-02-04 16:46 ` Satyanarayana K V P
  2026-02-04 19:18   ` Matthew Brost
  2026-02-06 12:49   ` Thomas Hellström
  2026-02-05  2:49 ` ✓ CI.KUnit: success for Fix fs_reclaim deadlock caused by CCS save/restore (rev2) Patchwork
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 17+ messages in thread
From: Satyanarayana K V P @ 2026-02-04 16:46 UTC (permalink / raw)
  To: intel-xe
  Cc: Satyanarayana K V P, Matthew Brost, Michal Wajdeczko,
	Matthew Auld, Thomas Hellström

CCS save/restore batch buffers are attached during BO allocation and
detached during BO teardown. The shrinker triggers xe_bo_move(), which is
used for both allocation and deletion paths.

When BO allocation and shrinking occur concurrently, a circular locking
dependency involving fs_reclaim and swap_guard can occur, leading to a
deadlock such as:

======================================================
WARNING: possible circular locking dependency detected
------------------------------------------------------

      CPU0                    CPU1
      ----                    ----
 lock(fs_reclaim);
                              lock(&sa_manager->swap_guard);
                              lock(fs_reclaim);
 lock(&sa_manager->swap_guard);

 *** DEADLOCK ***
=====================================================

To avoid this, the BB pointer allocation is separated from xe_bb_ccs_new(),
used drm_suballoc_alloc() for SA allocation and drm_suballoc_init() for BB
allocation preventing reclaim from being invoked in this context.

Fixes: 864690cf4dd62 ("drm/xe/vf: Attach and detach CCS copy commands with BO")
Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>

---
V1 -> V2:
- Used drm_suballoc_alloc() and drm_suballoc_init() for BB allocation
(Thomas).
---
 drivers/gpu/drm/xe/xe_bb.c      | 22 ++++++++--------------
 drivers/gpu/drm/xe/xe_bb.h      |  4 ++--
 drivers/gpu/drm/xe/xe_migrate.c | 29 +++++++++++++++++++++++++----
 drivers/gpu/drm/xe/xe_sa.c      | 24 ++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_sa.h      | 19 +++++++++++++++++++
 5 files changed, 78 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
index 8b678297aaa2..9a04d0e814d3 100644
--- a/drivers/gpu/drm/xe/xe_bb.c
+++ b/drivers/gpu/drm/xe/xe_bb.c
@@ -59,16 +59,14 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm)
 	return ERR_PTR(err);
 }
 
-struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
-			    enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
+int xe_bb_ccs_new(struct xe_gt *gt, struct xe_bb *bb, struct drm_suballoc *sa,
+		  u32 dwords, enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
 {
-	struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
 	struct xe_device *xe = gt_to_xe(gt);
 	struct xe_sa_manager *bb_pool;
+	int timeout = HZ;
 	int err;
 
-	if (!bb)
-		return ERR_PTR(-ENOMEM);
 	/*
 	 * We need to allocate space for the requested number of dwords &
 	 * one additional MI_BATCH_BUFFER_END dword. Since the whole SA
@@ -78,20 +76,16 @@ struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
 	 */
 
 	bb_pool = xe->sriov.vf.ccs.contexts[ctx_id].mem.ccs_bb_pool;
-	bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
+	err = xe_sa_bo_new_init(bb_pool, sa, 4 * (dwords + 1), timeout);
 
-	if (IS_ERR(bb->bo)) {
-		err = PTR_ERR(bb->bo);
-		goto err;
-	}
+	if (err)
+		return err;
 
+	bb->bo = sa;
 	bb->cs = xe_sa_bo_cpu_addr(bb->bo);
 	bb->len = 0;
 
-	return bb;
-err:
-	kfree(bb);
-	return ERR_PTR(err);
+	return 0;
 }
 
 static struct xe_sched_job *
diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
index 2a8adc9a6dee..3da4652cf0b0 100644
--- a/drivers/gpu/drm/xe/xe_bb.h
+++ b/drivers/gpu/drm/xe/xe_bb.h
@@ -16,8 +16,8 @@ struct xe_sched_job;
 enum xe_sriov_vf_ccs_rw_ctxs;
 
 struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm);
-struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
-			    enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
+int xe_bb_ccs_new(struct xe_gt *gt, struct xe_bb *bb, struct drm_suballoc *sa,
+		  u32 dwords, enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
 struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
 				      struct xe_bb *bb);
 struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue *q,
diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
index 078a9bc2821d..15d73814a08a 100644
--- a/drivers/gpu/drm/xe/xe_migrate.c
+++ b/drivers/gpu/drm/xe/xe_migrate.c
@@ -1109,6 +1109,7 @@ int xe_migrate_ccs_rw_copy(struct xe_tile *tile, struct xe_exec_queue *q,
 	struct xe_sriov_vf_ccs_ctx *ctx;
 	struct xe_sa_manager *bb_pool;
 	u64 size = xe_bo_size(src_bo);
+	struct drm_suballoc *sa;
 	struct xe_bb *bb = NULL;
 	u64 src_L0, src_L0_ofs;
 	u32 src_L0_pt;
@@ -1148,15 +1149,28 @@ int xe_migrate_ccs_rw_copy(struct xe_tile *tile, struct xe_exec_queue *q,
 		size -= src_L0;
 	}
 
+	bb = kmalloc(sizeof(*bb), GFP_KERNEL);
+	if (!bb) {
+		err = -ENOMEM;
+		goto err_bb;
+	}
+
+	sa = drm_suballoc_alloc(GFP_KERNEL);
+	if (IS_ERR(sa)) {
+		drm_err(&xe->drm, "Sub-allocator memory allocation failed with %ld\n",
+			PTR_ERR(sa));
+		err = PTR_ERR(sa);
+		goto err_sa;
+	}
+
 	bb_pool = ctx->mem.ccs_bb_pool;
 	guard(mutex) (xe_sa_bo_swap_guard(bb_pool));
 	xe_sa_bo_swap_shadow(bb_pool);
 
-	bb = xe_bb_ccs_new(gt, batch_size, read_write);
-	if (IS_ERR(bb)) {
+	err = xe_bb_ccs_new(gt, bb, sa, batch_size, read_write);
+	if (err) {
 		drm_err(&xe->drm, "BB allocation failed.\n");
-		err = PTR_ERR(bb);
-		return err;
+		goto err_bb_ccs;
 	}
 
 	batch_size_allocated = batch_size;
@@ -1208,6 +1222,13 @@ int xe_migrate_ccs_rw_copy(struct xe_tile *tile, struct xe_exec_queue *q,
 	xe_sriov_vf_ccs_rw_update_bb_addr(ctx);
 	xe_sa_bo_sync_shadow(bb->bo);
 	return 0;
+
+err_bb_ccs:
+	drm_suballoc_release(sa);
+err_sa:
+	kfree(bb);
+err_bb:
+	return err;
 }
 
 /**
diff --git a/drivers/gpu/drm/xe/xe_sa.c b/drivers/gpu/drm/xe/xe_sa.c
index 5efbb5a09f77..2cfe6a353299 100644
--- a/drivers/gpu/drm/xe/xe_sa.c
+++ b/drivers/gpu/drm/xe/xe_sa.c
@@ -181,6 +181,30 @@ struct drm_suballoc *__xe_sa_bo_new(struct xe_sa_manager *sa_manager, u32 size,
 	return drm_suballoc_new(&sa_manager->base, size, gfp, true, 0);
 }
 
+/**
+ * __xe_sa_bo_new_init() - Make a suballocation with given SA.
+ * @sa_manager: the &xe_sa_manager
+ * @sa : Uninitalized sub allocator
+ * @size: number of bytes we want to suballocate
+ * @timeout: Timeout in jiffies waiting for allocation.
+ *
+ * Try to make a suballocation of size @size.
+ *
+ * Return: zero on success, errno on failure.
+ */
+int __xe_sa_bo_new_init(struct xe_sa_manager *sa_manager, struct drm_suballoc *sa,
+			u32 size, int timeout)
+{
+	/*
+	 * BB to large, return -ENOBUFS indicating user should split
+	 * array of binds into smaller chunks.
+	 */
+	if (size > sa_manager->base.size)
+		return -ENOBUFS;
+
+	return drm_suballoc_init(&sa_manager->base, sa, size, true, 0, timeout);
+}
+
 /**
  * xe_sa_bo_flush_write() - Copy the data from the sub-allocation to the GPU memory.
  * @sa_bo: the &drm_suballoc to flush
diff --git a/drivers/gpu/drm/xe/xe_sa.h b/drivers/gpu/drm/xe/xe_sa.h
index 05e9a4e00e78..9cb8722779a4 100644
--- a/drivers/gpu/drm/xe/xe_sa.h
+++ b/drivers/gpu/drm/xe/xe_sa.h
@@ -18,6 +18,8 @@ struct xe_tile;
 struct xe_sa_manager *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size,
 					      u32 guard, u32 align, u32 flags);
 struct drm_suballoc *__xe_sa_bo_new(struct xe_sa_manager *sa_manager, u32 size, gfp_t gfp);
+int __xe_sa_bo_new_init(struct xe_sa_manager *sa_manager, struct drm_suballoc *sa,
+			u32 size, int timeout);
 
 static inline struct xe_sa_manager *xe_sa_bo_manager_init(struct xe_tile *tile, u32 size, u32 align)
 {
@@ -38,6 +40,23 @@ static inline struct drm_suballoc *xe_sa_bo_new(struct xe_sa_manager *sa_manager
 	return __xe_sa_bo_new(sa_manager, size, GFP_KERNEL);
 }
 
+/**
+ * xe_sa_bo_new_init() - Make a suballocation.
+ * @sa_manager: the &xe_sa_manager
+ * @sa : Uninitialized sub-allocator
+ * @size: number of bytes we want to suballocate
+ * @timeout: Time to a wait suballocation to become available.
+ *
+ * Try to make a suballocation of size @size.
+ *
+ * Return: zero on success, errno on failure.
+ */
+static inline int xe_sa_bo_new_init(struct xe_sa_manager *sa_manager,
+				    struct drm_suballoc *sa, u32 size, int timeout)
+{
+	return __xe_sa_bo_new_init(sa_manager, sa, size, timeout);
+}
+
 void xe_sa_bo_flush_write(struct drm_suballoc *sa_bo);
 void xe_sa_bo_sync_read(struct drm_suballoc *sa_bo);
 void xe_sa_bo_free(struct drm_suballoc *sa_bo, struct dma_fence *fence);
-- 
2.43.0


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

* Re: [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard
  2026-02-04 16:46 ` [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard Satyanarayana K V P
@ 2026-02-04 19:11   ` Matthew Brost
  2026-02-06 16:17   ` Thomas Hellström
  1 sibling, 0 replies; 17+ messages in thread
From: Matthew Brost @ 2026-02-04 19:11 UTC (permalink / raw)
  To: Satyanarayana K V P; +Cc: intel-xe, Michal Wajdeczko, Matthew Auld

On Wed, Feb 04, 2026 at 04:46:45PM +0000, Satyanarayana K V P wrote:
> Annotate the SA manager init path to model taking swap_guard while under
> reclaim context. This helps lockdep catch potential circular dependencies
> between fs_reclaim and swap_guard in debug builds.

I'd mention without this annotation it lockdep is unware of this chain
until the shrinker runs.

> 
> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Suggested-by: Matthew Brost <matthew.brost@intel.com>

I'd make this the last patch in series so it goes in after the reclaim
problem is fixed.

But patch itself LGTM:

Reviewed-by: Matthew Brost <matthew.brost@intel.com>

> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> 
> ---
> V1 -> V2:
> - None.
> ---
>  drivers/gpu/drm/xe/xe_sa.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_sa.c b/drivers/gpu/drm/xe/xe_sa.c
> index b738102575d4..5efbb5a09f77 100644
> --- a/drivers/gpu/drm/xe/xe_sa.c
> +++ b/drivers/gpu/drm/xe/xe_sa.c
> @@ -89,6 +89,12 @@ struct xe_sa_manager *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size,
>  		if (ret)
>  			return ERR_PTR(ret);
>  
> +		if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
> +			fs_reclaim_acquire(GFP_KERNEL);
> +			might_lock(&sa_manager->swap_guard);
> +			fs_reclaim_release(GFP_KERNEL);
> +		}
> +
>  		shadow = xe_managed_bo_create_pin_map(xe, tile, size,
>  						      XE_BO_FLAG_VRAM_IF_DGFX(tile) |
>  						      XE_BO_FLAG_GGTT |
> -- 
> 2.43.0
> 

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

* Re: [PATCH v2 3/3] drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation
  2026-02-04 16:46 ` [PATCH v2 3/3] drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation Satyanarayana K V P
@ 2026-02-04 19:18   ` Matthew Brost
  2026-02-06 12:49   ` Thomas Hellström
  1 sibling, 0 replies; 17+ messages in thread
From: Matthew Brost @ 2026-02-04 19:18 UTC (permalink / raw)
  To: Satyanarayana K V P
  Cc: intel-xe, Michal Wajdeczko, Matthew Auld, Thomas Hellström

On Wed, Feb 04, 2026 at 04:46:46PM +0000, Satyanarayana K V P wrote:
> CCS save/restore batch buffers are attached during BO allocation and
> detached during BO teardown. The shrinker triggers xe_bo_move(), which is
> used for both allocation and deletion paths.
> 
> When BO allocation and shrinking occur concurrently, a circular locking
> dependency involving fs_reclaim and swap_guard can occur, leading to a
> deadlock such as:
> 
> ======================================================
> WARNING: possible circular locking dependency detected
> ------------------------------------------------------
> 
>       CPU0                    CPU1
>       ----                    ----
>  lock(fs_reclaim);
>                               lock(&sa_manager->swap_guard);
>                               lock(fs_reclaim);
>  lock(&sa_manager->swap_guard);
> 
>  *** DEADLOCK ***
> =====================================================
> 
> To avoid this, the BB pointer allocation is separated from xe_bb_ccs_new(),
> used drm_suballoc_alloc() for SA allocation and drm_suballoc_init() for BB
> allocation preventing reclaim from being invoked in this context.
> 
> Fixes: 864690cf4dd62 ("drm/xe/vf: Attach and detach CCS copy commands with BO")
> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> 
> ---
> V1 -> V2:
> - Used drm_suballoc_alloc() and drm_suballoc_init() for BB allocation
> (Thomas).
> ---
>  drivers/gpu/drm/xe/xe_bb.c      | 22 ++++++++--------------
>  drivers/gpu/drm/xe/xe_bb.h      |  4 ++--
>  drivers/gpu/drm/xe/xe_migrate.c | 29 +++++++++++++++++++++++++----
>  drivers/gpu/drm/xe/xe_sa.c      | 24 ++++++++++++++++++++++++
>  drivers/gpu/drm/xe/xe_sa.h      | 19 +++++++++++++++++++
>  5 files changed, 78 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
> index 8b678297aaa2..9a04d0e814d3 100644
> --- a/drivers/gpu/drm/xe/xe_bb.c
> +++ b/drivers/gpu/drm/xe/xe_bb.c
> @@ -59,16 +59,14 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm)
>  	return ERR_PTR(err);
>  }
>  
> -struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> -			    enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
> +int xe_bb_ccs_new(struct xe_gt *gt, struct xe_bb *bb, struct drm_suballoc *sa,
> +		  u32 dwords, enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
>  {
> -	struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
>  	struct xe_device *xe = gt_to_xe(gt);
>  	struct xe_sa_manager *bb_pool;
> +	int timeout = HZ;

I think the timeout can less as suballocations should always succeed if
it is correctly sized. So maybe 1 or zero (unsure if zero is valid value
though).

I don't see the size of suballocator changed in this series - are you
still trying to figure that part out?

>  	int err;
>  
> -	if (!bb)
> -		return ERR_PTR(-ENOMEM);
>  	/*
>  	 * We need to allocate space for the requested number of dwords &
>  	 * one additional MI_BATCH_BUFFER_END dword. Since the whole SA
> @@ -78,20 +76,16 @@ struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
>  	 */
>  
>  	bb_pool = xe->sriov.vf.ccs.contexts[ctx_id].mem.ccs_bb_pool;
> -	bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
> +	err = xe_sa_bo_new_init(bb_pool, sa, 4 * (dwords + 1), timeout);
>  
> -	if (IS_ERR(bb->bo)) {
> -		err = PTR_ERR(bb->bo);
> -		goto err;
> -	}
> +	if (err)
> +		return err;
>  
> +	bb->bo = sa;
>  	bb->cs = xe_sa_bo_cpu_addr(bb->bo);
>  	bb->len = 0;
>  
> -	return bb;
> -err:
> -	kfree(bb);
> -	return ERR_PTR(err);
> +	return 0;
>  }
>  
>  static struct xe_sched_job *
> diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
> index 2a8adc9a6dee..3da4652cf0b0 100644
> --- a/drivers/gpu/drm/xe/xe_bb.h
> +++ b/drivers/gpu/drm/xe/xe_bb.h
> @@ -16,8 +16,8 @@ struct xe_sched_job;
>  enum xe_sriov_vf_ccs_rw_ctxs;
>  
>  struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm);
> -struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> -			    enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
> +int xe_bb_ccs_new(struct xe_gt *gt, struct xe_bb *bb, struct drm_suballoc *sa,
> +		  u32 dwords, enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
>  struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
>  				      struct xe_bb *bb);
>  struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue *q,
> diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
> index 078a9bc2821d..15d73814a08a 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/xe_migrate.c
> @@ -1109,6 +1109,7 @@ int xe_migrate_ccs_rw_copy(struct xe_tile *tile, struct xe_exec_queue *q,
>  	struct xe_sriov_vf_ccs_ctx *ctx;
>  	struct xe_sa_manager *bb_pool;
>  	u64 size = xe_bo_size(src_bo);
> +	struct drm_suballoc *sa;
>  	struct xe_bb *bb = NULL;
>  	u64 src_L0, src_L0_ofs;
>  	u32 src_L0_pt;
> @@ -1148,15 +1149,28 @@ int xe_migrate_ccs_rw_copy(struct xe_tile *tile, struct xe_exec_queue *q,
>  		size -= src_L0;
>  	}
>  
> +	bb = kmalloc(sizeof(*bb), GFP_KERNEL);
> +	if (!bb) {
> +		err = -ENOMEM;
> +		goto err_bb;
> +	}
> +
> +	sa = drm_suballoc_alloc(GFP_KERNEL);
> +	if (IS_ERR(sa)) {
> +		drm_err(&xe->drm, "Sub-allocator memory allocation failed with %ld\n",
> +			PTR_ERR(sa));
> +		err = PTR_ERR(sa);
> +		goto err_sa;
> +	}
> +
>  	bb_pool = ctx->mem.ccs_bb_pool;
>  	guard(mutex) (xe_sa_bo_swap_guard(bb_pool));
>  	xe_sa_bo_swap_shadow(bb_pool);
>  
> -	bb = xe_bb_ccs_new(gt, batch_size, read_write);
> -	if (IS_ERR(bb)) {
> +	err = xe_bb_ccs_new(gt, bb, sa, batch_size, read_write);
> +	if (err) {
>  		drm_err(&xe->drm, "BB allocation failed.\n");
> -		err = PTR_ERR(bb);
> -		return err;
> +		goto err_bb_ccs;

Hmm, it is frowned upon [1] to use goto cleanups after a guard. I believe
this case works but to adhere to the guidelines in cleanup.h I'd avoid
the goto (i.e., do the cleanup directly inside the if statement or drop
the guard usage).

[1] https://elixir.bootlin.com/linux/v6.12/source/include/linux/cleanup.h#L135

Matt

>  	}
>  
>  	batch_size_allocated = batch_size;
> @@ -1208,6 +1222,13 @@ int xe_migrate_ccs_rw_copy(struct xe_tile *tile, struct xe_exec_queue *q,
>  	xe_sriov_vf_ccs_rw_update_bb_addr(ctx);
>  	xe_sa_bo_sync_shadow(bb->bo);
>  	return 0;
> +
> +err_bb_ccs:
> +	drm_suballoc_release(sa);
> +err_sa:
> +	kfree(bb);
> +err_bb:
> +	return err;
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/xe/xe_sa.c b/drivers/gpu/drm/xe/xe_sa.c
> index 5efbb5a09f77..2cfe6a353299 100644
> --- a/drivers/gpu/drm/xe/xe_sa.c
> +++ b/drivers/gpu/drm/xe/xe_sa.c
> @@ -181,6 +181,30 @@ struct drm_suballoc *__xe_sa_bo_new(struct xe_sa_manager *sa_manager, u32 size,
>  	return drm_suballoc_new(&sa_manager->base, size, gfp, true, 0);
>  }
>  
> +/**
> + * __xe_sa_bo_new_init() - Make a suballocation with given SA.
> + * @sa_manager: the &xe_sa_manager
> + * @sa : Uninitalized sub allocator
> + * @size: number of bytes we want to suballocate
> + * @timeout: Timeout in jiffies waiting for allocation.
> + *
> + * Try to make a suballocation of size @size.
> + *
> + * Return: zero on success, errno on failure.
> + */
> +int __xe_sa_bo_new_init(struct xe_sa_manager *sa_manager, struct drm_suballoc *sa,
> +			u32 size, int timeout)
> +{
> +	/*
> +	 * BB to large, return -ENOBUFS indicating user should split
> +	 * array of binds into smaller chunks.
> +	 */
> +	if (size > sa_manager->base.size)
> +		return -ENOBUFS;
> +
> +	return drm_suballoc_init(&sa_manager->base, sa, size, true, 0, timeout);
> +}
> +
>  /**
>   * xe_sa_bo_flush_write() - Copy the data from the sub-allocation to the GPU memory.
>   * @sa_bo: the &drm_suballoc to flush
> diff --git a/drivers/gpu/drm/xe/xe_sa.h b/drivers/gpu/drm/xe/xe_sa.h
> index 05e9a4e00e78..9cb8722779a4 100644
> --- a/drivers/gpu/drm/xe/xe_sa.h
> +++ b/drivers/gpu/drm/xe/xe_sa.h
> @@ -18,6 +18,8 @@ struct xe_tile;
>  struct xe_sa_manager *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size,
>  					      u32 guard, u32 align, u32 flags);
>  struct drm_suballoc *__xe_sa_bo_new(struct xe_sa_manager *sa_manager, u32 size, gfp_t gfp);
> +int __xe_sa_bo_new_init(struct xe_sa_manager *sa_manager, struct drm_suballoc *sa,
> +			u32 size, int timeout);
>  
>  static inline struct xe_sa_manager *xe_sa_bo_manager_init(struct xe_tile *tile, u32 size, u32 align)
>  {
> @@ -38,6 +40,23 @@ static inline struct drm_suballoc *xe_sa_bo_new(struct xe_sa_manager *sa_manager
>  	return __xe_sa_bo_new(sa_manager, size, GFP_KERNEL);
>  }
>  
> +/**
> + * xe_sa_bo_new_init() - Make a suballocation.
> + * @sa_manager: the &xe_sa_manager
> + * @sa : Uninitialized sub-allocator
> + * @size: number of bytes we want to suballocate
> + * @timeout: Time to a wait suballocation to become available.
> + *
> + * Try to make a suballocation of size @size.
> + *
> + * Return: zero on success, errno on failure.
> + */
> +static inline int xe_sa_bo_new_init(struct xe_sa_manager *sa_manager,
> +				    struct drm_suballoc *sa, u32 size, int timeout)
> +{
> +	return __xe_sa_bo_new_init(sa_manager, sa, size, timeout);
> +}
> +
>  void xe_sa_bo_flush_write(struct drm_suballoc *sa_bo);
>  void xe_sa_bo_sync_read(struct drm_suballoc *sa_bo);
>  void xe_sa_bo_free(struct drm_suballoc *sa_bo, struct dma_fence *fence);
> -- 
> 2.43.0
> 

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

* Re: [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers
  2026-02-04 16:46 ` [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers Satyanarayana K V P
@ 2026-02-04 19:45   ` Matthew Brost
  2026-02-06 12:34   ` Thomas Hellström
  1 sibling, 0 replies; 17+ messages in thread
From: Matthew Brost @ 2026-02-04 19:45 UTC (permalink / raw)
  To: Satyanarayana K V P
  Cc: intel-xe, Thomas Hellström, Michal Wajdeczko, Matthew Auld

On Wed, Feb 04, 2026 at 04:46:44PM +0000, Satyanarayana K V P wrote:
> drm_suballoc_new() currently both allocates the SA object using kmalloc()
> and searches for a suitable hole in the sub-allocator for the requested
> size. Since kmalloc() may take internal locks, performing memory
> allocation while holding the sub-allocator mutex can trigger lockdep
> deadlock warnings.

The above isn't quite right. By spliting the kmalloc step outside of the
init step, this allows kmalloc to be reclaim unsafe (GFP_KERNEL) and the
enter a reclaim unsafe section (e.g., take a reclaim tainted lock)
during init.

> 
> Fix this by splitting SA allocation from drm_suballoc_new(), separating
> object allocation from sub-allocator initialization and hole selection.
> 

I'd also mention that a timeout argument is provided in init too,
with use cases in mind where the suballocator is sized to never fail
finding a hole or if does, it won't hang forever.

Matt

> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Suggested-by: Matthew Brost <matthew.brost@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> 
> ---
> V1 -> V2:
> - Splitted drm_suballoc_new() into drm_suballoc_alloc() and
> drm_suballoc_init() (Thomas).
> ---
>  drivers/gpu/drm/drm_suballoc.c | 135 +++++++++++++++++++++++++--------
>  include/drm/drm_suballoc.h     |   8 ++
>  2 files changed, 112 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_suballoc.c b/drivers/gpu/drm/drm_suballoc.c
> index 879ea33dbbc4..6f21f9e048d6 100644
> --- a/drivers/gpu/drm/drm_suballoc.c
> +++ b/drivers/gpu/drm/drm_suballoc.c
> @@ -123,7 +123,7 @@ static void drm_suballoc_remove_locked(struct drm_suballoc *sa)
>  	list_del_init(&sa->olist);
>  	list_del_init(&sa->flist);
>  	dma_fence_put(sa->fence);
> -	kfree(sa);
> +	drm_suballoc_release(sa);
>  }
>  
>  static void drm_suballoc_try_free(struct drm_suballoc_manager *sa_manager)
> @@ -293,45 +293,75 @@ static bool drm_suballoc_next_hole(struct drm_suballoc_manager *sa_manager,
>  }
>  
>  /**
> - * drm_suballoc_new() - Make a suballocation.
> + * drm_suballoc_alloc() - Allocate uninitialized suballoc object.
> + * @gfp: gfp flags used for memory allocation.
> + *
> + * Allocate memory for an uninitialized suballoc object. Intended usage is
> + * allocate memory for suballoc object outside of a reclaim tainted context
> + * and then be initialized at a later time in a reclaim tainted context.
> + *
> + * @drm_suballoc_release should be used to release the memory if returned
> + * suballoc object is in uninitialized state.
> + *
> + * Return: a new uninitialized suballoc object, or an ERR_PTR(-ENOMEM).
> + */
> +struct drm_suballoc *drm_suballoc_alloc(gfp_t gfp)
> +{
> +	struct drm_suballoc *sa;
> +
> +	sa = kmalloc(sizeof(*sa), gfp);
> +	if (!sa)
> +		return ERR_PTR(-ENOMEM);
> +
> +	return sa;
> +}
> +EXPORT_SYMBOL(drm_suballoc_alloc);
> +
> +/**
> + * drm_suballoc_release() - Release memory for suballocation.
> + * @sa: The struct drm_suballoc.
> + */
> +void drm_suballoc_release(struct drm_suballoc *sa)
> +{
> +	kfree(sa);
> +}
> +EXPORT_SYMBOL(drm_suballoc_release);
> +
> +/**
> + * drm_suballoc_init() - Initialize a suballocation.
>   * @sa_manager: pointer to the sa_manager
> + * @sa: The struct drm_suballoc.
>   * @size: number of bytes we want to suballocate.
> - * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL but
> - *       the argument is provided for suballocations from reclaim context or
> - *       where the caller wants to avoid pipelining rather than wait for
> - *       reclaim.
>   * @intr: Whether to perform waits interruptible. This should typically
>   *        always be true, unless the caller needs to propagate a
>   *        non-interruptible context from above layers.
>   * @align: Alignment. Must not exceed the default manager alignment.
>   *         If @align is zero, then the manager alignment is used.
> + * @timeout: Time to a wait suballocation to become available.
>   *
> - * Try to make a suballocation of size @size, which will be rounded
> - * up to the alignment specified in specified in drm_suballoc_manager_init().
> + * Try to make a suballocation on a pre-allocated suballoc object of size @size,
> + * which will be rounded up to the alignment specified in specified in
> + * drm_suballoc_manager_init().
>   *
> - * Return: a new suballocated bo, or an ERR_PTR.
> + * Return: zero on success, errno on failure.
>   */
> -struct drm_suballoc *
> -drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
> -		 gfp_t gfp, bool intr, size_t align)
> +int drm_suballoc_init(struct drm_suballoc_manager *sa_manager,
> +		      struct drm_suballoc *sa, size_t size,
> +		      bool intr, size_t align, signed long timeout)
>  {
>  	struct dma_fence *fences[DRM_SUBALLOC_MAX_QUEUES];
>  	unsigned int tries[DRM_SUBALLOC_MAX_QUEUES];
>  	unsigned int count;
>  	int i, r;
> -	struct drm_suballoc *sa;
>  
>  	if (WARN_ON_ONCE(align > sa_manager->align))
> -		return ERR_PTR(-EINVAL);
> +		return -EINVAL;
>  	if (WARN_ON_ONCE(size > sa_manager->size || !size))
> -		return ERR_PTR(-EINVAL);
> +		return -EINVAL;
>  
>  	if (!align)
>  		align = sa_manager->align;
>  
> -	sa = kmalloc(sizeof(*sa), gfp);
> -	if (!sa)
> -		return ERR_PTR(-ENOMEM);
>  	sa->manager = sa_manager;
>  	sa->fence = NULL;
>  	INIT_LIST_HEAD(&sa->olist);
> @@ -339,6 +369,8 @@ drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
>  
>  	spin_lock(&sa_manager->wq.lock);
>  	do {
> +		long t;
> +
>  		for (i = 0; i < DRM_SUBALLOC_MAX_QUEUES; ++i)
>  			tries[i] = 0;
>  
> @@ -348,7 +380,7 @@ drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
>  			if (drm_suballoc_try_alloc(sa_manager, sa,
>  						   size, align)) {
>  				spin_unlock(&sa_manager->wq.lock);
> -				return sa;
> +				return 0;
>  			}
>  
>  			/* see if we can skip over some allocations */
> @@ -359,34 +391,75 @@ drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
>  				fences[count++] = dma_fence_get(fences[i]);
>  
>  		if (count) {
> -			long t;
> -
>  			spin_unlock(&sa_manager->wq.lock);
>  			t = dma_fence_wait_any_timeout(fences, count, intr,
> -						       MAX_SCHEDULE_TIMEOUT,
> -						       NULL);
> +						       timeout, NULL);
>  			for (i = 0; i < count; ++i)
>  				dma_fence_put(fences[i]);
>  
> -			r = (t > 0) ? 0 : t;
>  			spin_lock(&sa_manager->wq.lock);
>  		} else if (intr) {
> +			spin_unlock(&sa_manager->wq.lock);
>  			/* if we have nothing to wait for block */
> -			r = wait_event_interruptible_locked
> +			r = wait_event_interruptible_timeout
>  				(sa_manager->wq,
> -				 __drm_suballoc_event(sa_manager, size, align));
> +				 __drm_suballoc_event(sa_manager, size, align),
> +				 timeout);
> +			spin_lock(&sa_manager->wq.lock);
>  		} else {
>  			spin_unlock(&sa_manager->wq.lock);
> -			wait_event(sa_manager->wq,
> -				   drm_suballoc_event(sa_manager, size, align));
> -			r = 0;
> +			t = wait_event_timeout
> +				(sa_manager->wq,
> +				 drm_suballoc_event(sa_manager, size, align),
> +				 timeout);
>  			spin_lock(&sa_manager->wq.lock);
>  		}
> +		r = (t > 0) ? 0 : !r ? -ETIME : t;
>  	} while (!r);
>  
>  	spin_unlock(&sa_manager->wq.lock);
> -	kfree(sa);
> -	return ERR_PTR(r);
> +	return r;
> +}
> +EXPORT_SYMBOL(drm_suballoc_init);
> +
> +/**
> + * drm_suballoc_new() - Make a suballocation.
> + * @sa_manager: pointer to the sa_manager
> + * @size: number of bytes we want to suballocate.
> + * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL but
> + *       the argument is provided for suballocations from reclaim context or
> + *       where the caller wants to avoid pipelining rather than wait for
> + *       reclaim.
> + * @intr: Whether to perform waits interruptible. This should typically
> + *        always be true, unless the caller needs to propagate a
> + *        non-interruptible context from above layers.
> + * @align: Alignment. Must not exceed the default manager alignment.
> + *         If @align is zero, then the manager alignment is used.
> + *
> + * Try to make a suballocation of size @size, which will be rounded
> + * up to the alignment specified in specified in drm_suballoc_manager_init().
> + *
> + * Return: a new suballocated bo, or an ERR_PTR.
> + */
> +struct drm_suballoc *
> +drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
> +		 gfp_t gfp, bool intr, size_t align)
> +{
> +	struct drm_suballoc *sa;
> +	int err;
> +
> +	sa = drm_suballoc_alloc(gfp);
> +	if (IS_ERR(sa))
> +		return sa;
> +
> +	err = drm_suballoc_init(sa_manager, sa, size, intr, align,
> +				MAX_SCHEDULE_TIMEOUT);
> +	if (err) {
> +		drm_suballoc_release(sa);
> +		return ERR_PTR(err);
> +	}
> +
> +	return sa;
>  }
>  EXPORT_SYMBOL(drm_suballoc_new);
>  
> diff --git a/include/drm/drm_suballoc.h b/include/drm/drm_suballoc.h
> index 7ba72a81a808..cff0e14556d1 100644
> --- a/include/drm/drm_suballoc.h
> +++ b/include/drm/drm_suballoc.h
> @@ -53,6 +53,14 @@ void drm_suballoc_manager_init(struct drm_suballoc_manager *sa_manager,
>  
>  void drm_suballoc_manager_fini(struct drm_suballoc_manager *sa_manager);
>  
> +struct drm_suballoc *drm_suballoc_alloc(gfp_t gfp);
> +
> +void drm_suballoc_release(struct drm_suballoc *sa);
> +
> +int drm_suballoc_init(struct drm_suballoc_manager *sa_manager,
> +		      struct drm_suballoc *sa, size_t size, bool intr,
> +		      size_t align, signed long timeout);
> +
>  struct drm_suballoc *
>  drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
>  		 gfp_t gfp, bool intr, size_t align);
> -- 
> 2.43.0
> 

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

* ✓ CI.KUnit: success for Fix fs_reclaim deadlock caused by CCS save/restore (rev2)
  2026-02-04 16:46 [PATCH v2 0/3] Fix fs_reclaim deadlock caused by CCS save/restore Satyanarayana K V P
                   ` (2 preceding siblings ...)
  2026-02-04 16:46 ` [PATCH v2 3/3] drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation Satyanarayana K V P
@ 2026-02-05  2:49 ` Patchwork
  2026-02-05  3:24 ` ✓ Xe.CI.BAT: " Patchwork
  2026-02-05 18:34 ` ✓ Xe.CI.FULL: " Patchwork
  5 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-02-05  2:49 UTC (permalink / raw)
  To: Satyanarayana K V P; +Cc: intel-xe

== Series Details ==

Series: Fix fs_reclaim deadlock caused by CCS save/restore (rev2)
URL   : https://patchwork.freedesktop.org/series/160841/
State : success

== Summary ==

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

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

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

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



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

* ✓ Xe.CI.BAT: success for Fix fs_reclaim deadlock caused by CCS save/restore (rev2)
  2026-02-04 16:46 [PATCH v2 0/3] Fix fs_reclaim deadlock caused by CCS save/restore Satyanarayana K V P
                   ` (3 preceding siblings ...)
  2026-02-05  2:49 ` ✓ CI.KUnit: success for Fix fs_reclaim deadlock caused by CCS save/restore (rev2) Patchwork
@ 2026-02-05  3:24 ` Patchwork
  2026-02-05 18:34 ` ✓ Xe.CI.FULL: " Patchwork
  5 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-02-05  3:24 UTC (permalink / raw)
  To: Satyanarayana K V P; +Cc: intel-xe

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

== Series Details ==

Series: Fix fs_reclaim deadlock caused by CCS save/restore (rev2)
URL   : https://patchwork.freedesktop.org/series/160841/
State : success

== Summary ==

CI Bug Log - changes from xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3_BAT -> xe-pw-160841v2_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-160841v2_BAT that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@xe_pat@pat-index-xe2@render:
    - bat-ptl-vm:         [PASS][1] -> [DMESG-WARN][2] ([Intel XE#7110]) +1 other test dmesg-warn
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/bat-ptl-vm/igt@xe_pat@pat-index-xe2@render.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/bat-ptl-vm/igt@xe_pat@pat-index-xe2@render.html

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


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

  * Linux: xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3 -> xe-pw-160841v2

  IGT_8737: 8737
  xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3: 55e3e3aeecf80d9fd2536acd8ed785282be5a7b3
  xe-pw-160841v2: 160841v2

== Logs ==

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

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

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

* ✓ Xe.CI.FULL: success for Fix fs_reclaim deadlock caused by CCS save/restore (rev2)
  2026-02-04 16:46 [PATCH v2 0/3] Fix fs_reclaim deadlock caused by CCS save/restore Satyanarayana K V P
                   ` (4 preceding siblings ...)
  2026-02-05  3:24 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-02-05 18:34 ` Patchwork
  5 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-02-05 18:34 UTC (permalink / raw)
  To: Satyanarayana K V P; +Cc: intel-xe

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

== Series Details ==

Series: Fix fs_reclaim deadlock caused by CCS save/restore (rev2)
URL   : https://patchwork.freedesktop.org/series/160841/
State : success

== Summary ==

CI Bug Log - changes from xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3_FULL -> xe-pw-160841v2_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-160841v2_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@intel_hwmon@hwmon-read:
    - shard-lnl:          NOTRUN -> [SKIP][1] ([Intel XE#1125])
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-lnl-2/igt@intel_hwmon@hwmon-read.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels:
    - shard-bmg:          NOTRUN -> [SKIP][2] ([Intel XE#2370])
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels.html

  * igt@kms_big_fb@linear-8bpp-rotate-270:
    - shard-bmg:          NOTRUN -> [SKIP][3] ([Intel XE#2327])
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_big_fb@linear-8bpp-rotate-270.html

  * igt@kms_big_fb@yf-tiled-8bpp-rotate-0:
    - shard-bmg:          NOTRUN -> [SKIP][4] ([Intel XE#1124]) +1 other test skip
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_big_fb@yf-tiled-8bpp-rotate-0.html

  * igt@kms_bw@connected-linear-tiling-4-displays-2160x1440p:
    - shard-bmg:          NOTRUN -> [SKIP][5] ([Intel XE#2314] / [Intel XE#2894])
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_bw@connected-linear-tiling-4-displays-2160x1440p.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs@pipe-d-hdmi-a-3:
    - shard-bmg:          NOTRUN -> [SKIP][6] ([Intel XE#2652] / [Intel XE#787]) +16 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-7/igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs@pipe-d-hdmi-a-3.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][7] ([Intel XE#2887]) +1 other test skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs.html

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

  * igt@kms_content_protection@atomic-hdcp14@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][9] ([Intel XE#3304]) +1 other test fail
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_content_protection@atomic-hdcp14@pipe-a-dp-2.html

  * igt@kms_cursor_crc@cursor-onscreen-max-size:
    - shard-bmg:          NOTRUN -> [SKIP][10] ([Intel XE#2320]) +1 other test skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_cursor_crc@cursor-onscreen-max-size.html

  * igt@kms_cursor_crc@cursor-sliding-512x170:
    - shard-bmg:          NOTRUN -> [SKIP][11] ([Intel XE#2321])
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_cursor_crc@cursor-sliding-512x170.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic:
    - shard-lnl:          NOTRUN -> [SKIP][12] ([Intel XE#309])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-lnl-2/igt@kms_cursor_legacy@cursora-vs-flipb-atomic.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-toggle:
    - shard-bmg:          [PASS][13] -> [SKIP][14] ([Intel XE#2291]) +2 other tests skip
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-2/igt@kms_cursor_legacy@cursora-vs-flipb-toggle.html
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-toggle.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-varying-size:
    - shard-bmg:          [PASS][15] -> [DMESG-WARN][16] ([Intel XE#5354])
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-7/igt@kms_cursor_legacy@cursora-vs-flipb-varying-size.html
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-2/igt@kms_cursor_legacy@cursora-vs-flipb-varying-size.html

  * igt@kms_dp_link_training@non-uhbr-sst:
    - shard-bmg:          [PASS][17] -> [SKIP][18] ([Intel XE#4354])
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-2/igt@kms_dp_link_training@non-uhbr-sst.html
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-6/igt@kms_dp_link_training@non-uhbr-sst.html

  * igt@kms_dsc@dsc-with-output-formats:
    - shard-bmg:          NOTRUN -> [SKIP][19] ([Intel XE#2244])
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_dsc@dsc-with-output-formats.html

  * igt@kms_flip@2x-plain-flip-fb-recreate-interruptible:
    - shard-bmg:          [PASS][20] -> [SKIP][21] ([Intel XE#2316]) +3 other tests skip
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-10/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-5/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html

  * igt@kms_flip@bo-too-big-interruptible@c-edp1:
    - shard-lnl:          [PASS][22] -> [FAIL][23] ([Intel XE#3149]) +1 other test fail
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-lnl-6/igt@kms_flip@bo-too-big-interruptible@c-edp1.html
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-lnl-7/igt@kms_flip@bo-too-big-interruptible@c-edp1.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
    - shard-bmg:          NOTRUN -> [SKIP][24] ([Intel XE#7178])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][25] ([Intel XE#4141]) +4 other tests skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-argb161616f-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#7061])
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-argb161616f-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-shrfb-pgflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][27] ([Intel XE#2311]) +8 other tests skip
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-shrfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][28] ([Intel XE#2313]) +3 other tests skip
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt.html

  * igt@kms_hdr@static-swap:
    - shard-bmg:          [PASS][29] -> [SKIP][30] ([Intel XE#1503])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-10/igt@kms_hdr@static-swap.html
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-5/igt@kms_hdr@static-swap.html

  * igt@kms_plane@pixel-format-yf-tiled-ccs-modifier:
    - shard-bmg:          NOTRUN -> [SKIP][31] ([Intel XE#7111] / [Intel XE#7130]) +1 other test skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_plane@pixel-format-yf-tiled-ccs-modifier.html

  * igt@kms_plane@pixel-format-yf-tiled-ccs-modifier@pipe-a-plane-0:
    - shard-bmg:          NOTRUN -> [SKIP][32] ([Intel XE#7130]) +6 other tests skip
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_plane@pixel-format-yf-tiled-ccs-modifier@pipe-a-plane-0.html

  * igt@kms_pm_rpm@modeset-lpsp-stress-no-wait:
    - shard-bmg:          NOTRUN -> [SKIP][33] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#836])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_pm_rpm@modeset-lpsp-stress-no-wait.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-sf:
    - shard-lnl:          NOTRUN -> [SKIP][34] ([Intel XE#1406] / [Intel XE#2893])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-lnl-2/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@psr2-overlay-plane-update-continuous-sf:
    - shard-bmg:          NOTRUN -> [SKIP][35] ([Intel XE#1406] / [Intel XE#1489]) +1 other test skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_psr2_sf@psr2-overlay-plane-update-continuous-sf.html

  * igt@kms_psr@fbc-psr2-sprite-render:
    - shard-bmg:          NOTRUN -> [SKIP][36] ([Intel XE#1406] / [Intel XE#2234] / [Intel XE#2850]) +3 other tests skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_psr@fbc-psr2-sprite-render.html

  * igt@kms_sharpness_filter@invalid-filter-with-scaler:
    - shard-bmg:          NOTRUN -> [SKIP][37] ([Intel XE#6503])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_sharpness_filter@invalid-filter-with-scaler.html

  * igt@xe_eudebug@vma-ufence:
    - shard-bmg:          NOTRUN -> [SKIP][38] ([Intel XE#4837])
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-7/igt@xe_eudebug@vma-ufence.html

  * igt@xe_eudebug_online@stopped-thread:
    - shard-bmg:          NOTRUN -> [SKIP][39] ([Intel XE#4837] / [Intel XE#6665]) +2 other tests skip
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@xe_eudebug_online@stopped-thread.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind:
    - shard-bmg:          NOTRUN -> [SKIP][40] ([Intel XE#2322]) +2 other tests skip
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind.html

  * igt@xe_exec_basic@multigpu-no-exec-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][41] ([Intel XE#1392])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-lnl-2/igt@xe_exec_basic@multigpu-no-exec-userptr.html

  * igt@xe_exec_fault_mode@many-multi-queue-userptr-prefetch:
    - shard-bmg:          NOTRUN -> [SKIP][42] ([Intel XE#7136]) +3 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-7/igt@xe_exec_fault_mode@many-multi-queue-userptr-prefetch.html

  * igt@xe_exec_multi_queue@max-queues-preempt-mode-basic:
    - shard-bmg:          NOTRUN -> [SKIP][43] ([Intel XE#6874]) +8 other tests skip
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@xe_exec_multi_queue@max-queues-preempt-mode-basic.html

  * igt@xe_exec_system_allocator@many-64k-mmap-new-huge-nomemset:
    - shard-bmg:          NOTRUN -> [SKIP][44] ([Intel XE#5007])
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@xe_exec_system_allocator@many-64k-mmap-new-huge-nomemset.html

  * igt@xe_exec_system_allocator@threads-many-large-mmap-new-huge:
    - shard-bmg:          NOTRUN -> [SKIP][45] ([Intel XE#4943]) +7 other tests skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-7/igt@xe_exec_system_allocator@threads-many-large-mmap-new-huge.html

  * igt@xe_exec_threads@threads-multi-queue-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][46] ([Intel XE#7138]) +3 other tests skip
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-7/igt@xe_exec_threads@threads-multi-queue-rebind.html

  * igt@xe_multigpu_svm@mgpu-pagefault-prefetch:
    - shard-bmg:          NOTRUN -> [SKIP][47] ([Intel XE#6964])
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@xe_multigpu_svm@mgpu-pagefault-prefetch.html

  * igt@xe_pm@s3-vm-bind-userptr:
    - shard-bmg:          [PASS][48] -> [DMESG-WARN][49] ([Intel XE#3428])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-5/igt@xe_pm@s3-vm-bind-userptr.html
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-3/igt@xe_pm@s3-vm-bind-userptr.html

  * igt@xe_pxp@pxp-stale-bo-exec-post-termination-irq:
    - shard-bmg:          NOTRUN -> [SKIP][50] ([Intel XE#4733]) +1 other test skip
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@xe_pxp@pxp-stale-bo-exec-post-termination-irq.html

  
#### Possible fixes ####

  * igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p:
    - shard-bmg:          [SKIP][51] ([Intel XE#2314] / [Intel XE#2894]) -> [PASS][52]
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-legacy:
    - shard-bmg:          [SKIP][53] ([Intel XE#2291]) -> [PASS][54] +3 other tests pass
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-5/igt@kms_cursor_legacy@cursorb-vs-flipb-legacy.html
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-2/igt@kms_cursor_legacy@cursorb-vs-flipb-legacy.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic:
    - shard-bmg:          [FAIL][55] ([Intel XE#4633]) -> [PASS][56]
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-9/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-8/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
    - shard-bmg:          [FAIL][57] ([Intel XE#5299]) -> [PASS][58]
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-6/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html

  * igt@kms_dp_aux_dev:
    - shard-bmg:          [SKIP][59] ([Intel XE#3009]) -> [PASS][60]
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-5/igt@kms_dp_aux_dev.html
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-2/igt@kms_dp_aux_dev.html

  * igt@kms_flip@2x-blocking-wf_vblank:
    - shard-bmg:          [SKIP][61] ([Intel XE#2316]) -> [PASS][62] +10 other tests pass
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-6/igt@kms_flip@2x-blocking-wf_vblank.html
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-7/igt@kms_flip@2x-blocking-wf_vblank.html

  * igt@kms_flip@dpms-off-confusion-interruptible:
    - shard-lnl:          [INCOMPLETE][63] -> [PASS][64] +1 other test pass
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-lnl-6/igt@kms_flip@dpms-off-confusion-interruptible.html
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-lnl-2/igt@kms_flip@dpms-off-confusion-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-bmg:          [INCOMPLETE][65] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][66] +1 other test pass
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-2/igt@kms_flip@flip-vs-suspend-interruptible.html
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-7/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_hdr@invalid-hdr:
    - shard-bmg:          [SKIP][67] ([Intel XE#1503]) -> [PASS][68]
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-10/igt@kms_hdr@invalid-hdr.html
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-8/igt@kms_hdr@invalid-hdr.html

  * igt@kms_plane_multiple@2x-tiling-4:
    - shard-bmg:          [SKIP][69] ([Intel XE#4596]) -> [PASS][70]
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-5/igt@kms_plane_multiple@2x-tiling-4.html
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-2/igt@kms_plane_multiple@2x-tiling-4.html

  * igt@kms_rotation_crc@multiplane-rotation:
    - shard-lnl:          [FAIL][71] ([Intel XE#1874]) -> [PASS][72]
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-lnl-3/igt@kms_rotation_crc@multiplane-rotation.html
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-lnl-4/igt@kms_rotation_crc@multiplane-rotation.html

  * igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma:
    - shard-lnl:          [FAIL][73] ([Intel XE#5625]) -> [PASS][74]
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-lnl-5/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma.html
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-lnl-7/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma.html

  
#### Warnings ####

  * igt@kms_content_protection@atomic-dpms-hdcp14:
    - shard-bmg:          [FAIL][75] ([Intel XE#3304]) -> [SKIP][76] ([Intel XE#7194])
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-3/igt@kms_content_protection@atomic-dpms-hdcp14.html
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-6/igt@kms_content_protection@atomic-dpms-hdcp14.html

  * igt@kms_content_protection@atomic-hdcp14:
    - shard-bmg:          [SKIP][77] ([Intel XE#7194]) -> [FAIL][78] ([Intel XE#3304]) +1 other test fail
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-6/igt@kms_content_protection@atomic-hdcp14.html
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_content_protection@atomic-hdcp14.html

  * igt@kms_content_protection@suspend-resume:
    - shard-bmg:          [FAIL][79] ([Intel XE#1178] / [Intel XE#3304]) -> [SKIP][80] ([Intel XE#6705])
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-3/igt@kms_content_protection@suspend-resume.html
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-6/igt@kms_content_protection@suspend-resume.html

  * igt@kms_content_protection@uevent:
    - shard-bmg:          [FAIL][81] ([Intel XE#6707]) -> [SKIP][82] ([Intel XE#2341])
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-2/igt@kms_content_protection@uevent.html
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-6/igt@kms_content_protection@uevent.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][83] ([Intel XE#2312]) -> [SKIP][84] ([Intel XE#2311]) +13 other tests skip
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][85] ([Intel XE#2311]) -> [SKIP][86] ([Intel XE#2312]) +12 other tests skip
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-10/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-mmap-wc.html
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-render:
    - shard-bmg:          [SKIP][87] ([Intel XE#2312]) -> [SKIP][88] ([Intel XE#4141]) +3 other tests skip
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-render.html
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff:
    - shard-bmg:          [SKIP][89] ([Intel XE#4141]) -> [SKIP][90] ([Intel XE#2312]) +4 other tests skip
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-10/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff.html
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render:
    - shard-bmg:          [SKIP][91] ([Intel XE#2312]) -> [SKIP][92] ([Intel XE#2313]) +12 other tests skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt:
    - shard-bmg:          [SKIP][93] ([Intel XE#2313]) -> [SKIP][94] ([Intel XE#2312]) +8 other tests skip
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-bmg:          [SKIP][95] ([Intel XE#3544]) -> [SKIP][96] ([Intel XE#3374] / [Intel XE#3544])
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3/shard-bmg-9/igt@kms_hdr@brightness-with-hdr.html
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160841v2/shard-bmg-3/igt@kms_hdr@brightness-with-hdr.html

  
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1125]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1125
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
  [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#1874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1874
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
  [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#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2370
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [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#2893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2893
  [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
  [Intel XE#3009]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3009
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3141
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
  [Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
  [Intel XE#3428]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3428
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#4633]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4633
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
  [Intel XE#5007]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5007
  [Intel XE#5299]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5299
  [Intel XE#5354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5354
  [Intel XE#5625]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5625
  [Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
  [Intel XE#6665]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6665
  [Intel XE#6705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6705
  [Intel XE#6707]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6707
  [Intel XE#6874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6874
  [Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
  [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
  [Intel XE#7111]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7111
  [Intel XE#7130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7130
  [Intel XE#7136]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7136
  [Intel XE#7138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7138
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7194]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7194
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836


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

  * Linux: xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3 -> xe-pw-160841v2

  IGT_8737: 8737
  xe-4500-55e3e3aeecf80d9fd2536acd8ed785282be5a7b3: 55e3e3aeecf80d9fd2536acd8ed785282be5a7b3
  xe-pw-160841v2: 160841v2

== Logs ==

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

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

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

* Re: [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers
  2026-02-04 16:46 ` [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers Satyanarayana K V P
  2026-02-04 19:45   ` Matthew Brost
@ 2026-02-06 12:34   ` Thomas Hellström
  2026-02-06 15:27     ` Christian König
  1 sibling, 1 reply; 17+ messages in thread
From: Thomas Hellström @ 2026-02-06 12:34 UTC (permalink / raw)
  To: Satyanarayana K V P, intel-xe
  Cc: Matthew Brost, Michal Wajdeczko, Matthew Auld, dri-devel,
	christian.koenig

+ dri-devel, Christian

On Wed, 2026-02-04 at 16:46 +0000, Satyanarayana K V P wrote:
> drm_suballoc_new() currently both allocates the SA object using
> kmalloc()
> and searches for a suitable hole in the sub-allocator for the
> requested
> size. Since kmalloc() may take internal locks, performing memory
> allocation while holding the sub-allocator mutex can trigger lockdep
> deadlock warnings.

... As Matt mentioned, This is to be able to suballocate under a
reclaim-tainted lock: Allocation can be done outside the lock, and init
inside the lock.

> 
> Fix this by splitting SA allocation from drm_suballoc_new(),
> separating
> object allocation from sub-allocator initialization and hole
> selection.
> 
> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Suggested-by: Matthew Brost <matthew.brost@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>

This must be CC'd dri-devel as well and AMD maintainers.

Below is in addition to MBrost's comments.

> 
> ---
> V1 -> V2:
> - Splitted drm_suballoc_new() into drm_suballoc_alloc() and
> drm_suballoc_init() (Thomas).
> ---
>  drivers/gpu/drm/drm_suballoc.c | 135 +++++++++++++++++++++++++------
> --
>  include/drm/drm_suballoc.h     |   8 ++
>  2 files changed, 112 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_suballoc.c
> b/drivers/gpu/drm/drm_suballoc.c
> index 879ea33dbbc4..6f21f9e048d6 100644
> --- a/drivers/gpu/drm/drm_suballoc.c
> +++ b/drivers/gpu/drm/drm_suballoc.c
> @@ -123,7 +123,7 @@ static void drm_suballoc_remove_locked(struct
> drm_suballoc *sa)
>  	list_del_init(&sa->olist);
>  	list_del_init(&sa->flist);
>  	dma_fence_put(sa->fence);
> -	kfree(sa);
> +	drm_suballoc_release(sa);
>  }
>  
>  static void drm_suballoc_try_free(struct drm_suballoc_manager
> *sa_manager)
> @@ -293,45 +293,75 @@ static bool drm_suballoc_next_hole(struct
> drm_suballoc_manager *sa_manager,
>  }
>  
>  /**
> - * drm_suballoc_new() - Make a suballocation.
> + * drm_suballoc_alloc() - Allocate uninitialized suballoc object.
> + * @gfp: gfp flags used for memory allocation.
> + *
> + * Allocate memory for an uninitialized suballoc object. Intended
> usage is
> + * allocate memory for suballoc object outside of a reclaim tainted
> context
> + * and then be initialized at a later time in a reclaim tainted
> context.
> + *
> + * @drm_suballoc_release should be used to release the memory if
> returned
> + * suballoc object is in uninitialized state.
> + *
> + * Return: a new uninitialized suballoc object, or an ERR_PTR(-
> ENOMEM).
> + */
> +struct drm_suballoc *drm_suballoc_alloc(gfp_t gfp)
> +{
> +	struct drm_suballoc *sa;
> +
> +	sa = kmalloc(sizeof(*sa), gfp);
> +	if (!sa)
> +		return ERR_PTR(-ENOMEM);
> +
> +	return sa;
> +}
> +EXPORT_SYMBOL(drm_suballoc_alloc);
> +
> +/**
> + * drm_suballoc_release() - Release memory for suballocation.
> + * @sa: The struct drm_suballoc.
> + */
> +void drm_suballoc_release(struct drm_suballoc *sa)
> +{
> +	kfree(sa);
> +}
> +EXPORT_SYMBOL(drm_suballoc_release);
> +
> +/**
> + * drm_suballoc_init() - Initialize a suballocation.
>   * @sa_manager: pointer to the sa_manager
> + * @sa: The struct drm_suballoc.
>   * @size: number of bytes we want to suballocate.
> - * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL
> but
> - *       the argument is provided for suballocations from reclaim
> context or
> - *       where the caller wants to avoid pipelining rather than wait
> for
> - *       reclaim.
>   * @intr: Whether to perform waits interruptible. This should
> typically
>   *        always be true, unless the caller needs to propagate a
>   *        non-interruptible context from above layers.
>   * @align: Alignment. Must not exceed the default manager alignment.
>   *         If @align is zero, then the manager alignment is used.
> + * @timeout: Time to a wait suballocation to become available.

I think we should split out the timeout to a separate patch, since that
is not really related to the problem of the lockdep splat, and it would
require a separate motivation, since typically the CTRL-C in
combination with fence timeouts are sufficient. We need to explain why
that's not the case for this particuar use-case. 

Also that would make the -fixes patches for the reclaim lockdep splat
smaller.


Otherwise LGTM.
Thomas


>   *
> - * Try to make a suballocation of size @size, which will be rounded
> - * up to the alignment specified in specified in
> drm_suballoc_manager_init().
> + * Try to make a suballocation on a pre-allocated suballoc object of
> size @size,
> + * which will be rounded up to the alignment specified in specified
> in
> + * drm_suballoc_manager_init().
>   *
> - * Return: a new suballocated bo, or an ERR_PTR.
> + * Return: zero on success, errno on failure.
>   */
> -struct drm_suballoc *
> -drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t
> size,
> -		 gfp_t gfp, bool intr, size_t align)
> +int drm_suballoc_init(struct drm_suballoc_manager *sa_manager,
> +		      struct drm_suballoc *sa, size_t size,
> +		      bool intr, size_t align, signed long timeout)
>  {
>  	struct dma_fence *fences[DRM_SUBALLOC_MAX_QUEUES];
>  	unsigned int tries[DRM_SUBALLOC_MAX_QUEUES];
>  	unsigned int count;
>  	int i, r;
> -	struct drm_suballoc *sa;
>  
>  	if (WARN_ON_ONCE(align > sa_manager->align))
> -		return ERR_PTR(-EINVAL);
> +		return -EINVAL;
>  	if (WARN_ON_ONCE(size > sa_manager->size || !size))
> -		return ERR_PTR(-EINVAL);
> +		return -EINVAL;
>  
>  	if (!align)
>  		align = sa_manager->align;
>  
> -	sa = kmalloc(sizeof(*sa), gfp);
> -	if (!sa)
> -		return ERR_PTR(-ENOMEM);
>  	sa->manager = sa_manager;
>  	sa->fence = NULL;
>  	INIT_LIST_HEAD(&sa->olist);
> @@ -339,6 +369,8 @@ drm_suballoc_new(struct drm_suballoc_manager
> *sa_manager, size_t size,
>  
>  	spin_lock(&sa_manager->wq.lock);
>  	do {
> +		long t;
> +
>  		for (i = 0; i < DRM_SUBALLOC_MAX_QUEUES; ++i)
>  			tries[i] = 0;
>  
> @@ -348,7 +380,7 @@ drm_suballoc_new(struct drm_suballoc_manager
> *sa_manager, size_t size,
>  			if (drm_suballoc_try_alloc(sa_manager, sa,
>  						   size, align)) {
>  				spin_unlock(&sa_manager->wq.lock);
> -				return sa;
> +				return 0;
>  			}
>  
>  			/* see if we can skip over some allocations
> */
> @@ -359,34 +391,75 @@ drm_suballoc_new(struct drm_suballoc_manager
> *sa_manager, size_t size,
>  				fences[count++] =
> dma_fence_get(fences[i]);
>  
>  		if (count) {
> -			long t;
> -
>  			spin_unlock(&sa_manager->wq.lock);
>  			t = dma_fence_wait_any_timeout(fences,
> count, intr,
> -						      
> MAX_SCHEDULE_TIMEOUT,
> -						       NULL);
> +						       timeout,
> NULL);
>  			for (i = 0; i < count; ++i)
>  				dma_fence_put(fences[i]);
>  
> -			r = (t > 0) ? 0 : t;
>  			spin_lock(&sa_manager->wq.lock);
>  		} else if (intr) {
> +			spin_unlock(&sa_manager->wq.lock);
>  			/* if we have nothing to wait for block */
> -			r = wait_event_interruptible_locked
> +			r = wait_event_interruptible_timeout
>  				(sa_manager->wq,
> -				 __drm_suballoc_event(sa_manager,
> size, align));
> +				 __drm_suballoc_event(sa_manager,
> size, align),
> +				 timeout);
> +			spin_lock(&sa_manager->wq.lock);
>  		} else {
>  			spin_unlock(&sa_manager->wq.lock);
> -			wait_event(sa_manager->wq,
> -				   drm_suballoc_event(sa_manager,
> size, align));
> -			r = 0;
> +			t = wait_event_timeout
> +				(sa_manager->wq,
> +				 drm_suballoc_event(sa_manager,
> size, align),
> +				 timeout);
>  			spin_lock(&sa_manager->wq.lock);
>  		}
> +		r = (t > 0) ? 0 : !r ? -ETIME : t;
>  	} while (!r);
>  
>  	spin_unlock(&sa_manager->wq.lock);
> -	kfree(sa);
> -	return ERR_PTR(r);
> +	return r;
> +}
> +EXPORT_SYMBOL(drm_suballoc_init);
> +
> +/**
> + * drm_suballoc_new() - Make a suballocation.
> + * @sa_manager: pointer to the sa_manager
> + * @size: number of bytes we want to suballocate.
> + * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL
> but
> + *       the argument is provided for suballocations from reclaim
> context or
> + *       where the caller wants to avoid pipelining rather than wait
> for
> + *       reclaim.
> + * @intr: Whether to perform waits interruptible. This should
> typically
> + *        always be true, unless the caller needs to propagate a
> + *        non-interruptible context from above layers.
> + * @align: Alignment. Must not exceed the default manager alignment.
> + *         If @align is zero, then the manager alignment is used.
> + *
> + * Try to make a suballocation of size @size, which will be rounded
> + * up to the alignment specified in specified in
> drm_suballoc_manager_init().
> + *
> + * Return: a new suballocated bo, or an ERR_PTR.
> + */
> +struct drm_suballoc *
> +drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t
> size,
> +		 gfp_t gfp, bool intr, size_t align)
> +{
> +	struct drm_suballoc *sa;
> +	int err;
> +
> +	sa = drm_suballoc_alloc(gfp);
> +	if (IS_ERR(sa))
> +		return sa;
> +
> +	err = drm_suballoc_init(sa_manager, sa, size, intr, align,
> +				MAX_SCHEDULE_TIMEOUT);
> +	if (err) {
> +		drm_suballoc_release(sa);
> +		return ERR_PTR(err);
> +	}
> +
> +	return sa;
>  }
>  EXPORT_SYMBOL(drm_suballoc_new);
>  
> diff --git a/include/drm/drm_suballoc.h b/include/drm/drm_suballoc.h
> index 7ba72a81a808..cff0e14556d1 100644
> --- a/include/drm/drm_suballoc.h
> +++ b/include/drm/drm_suballoc.h
> @@ -53,6 +53,14 @@ void drm_suballoc_manager_init(struct
> drm_suballoc_manager *sa_manager,
>  
>  void drm_suballoc_manager_fini(struct drm_suballoc_manager
> *sa_manager);
>  
> +struct drm_suballoc *drm_suballoc_alloc(gfp_t gfp);
> +
> +void drm_suballoc_release(struct drm_suballoc *sa);
> +
> +int drm_suballoc_init(struct drm_suballoc_manager *sa_manager,
> +		      struct drm_suballoc *sa, size_t size, bool
> intr,
> +		      size_t align, signed long timeout);
> +
>  struct drm_suballoc *
>  drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t
> size,
>  		 gfp_t gfp, bool intr, size_t align);

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

* Re: [PATCH v2 3/3] drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation
  2026-02-04 16:46 ` [PATCH v2 3/3] drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation Satyanarayana K V P
  2026-02-04 19:18   ` Matthew Brost
@ 2026-02-06 12:49   ` Thomas Hellström
  1 sibling, 0 replies; 17+ messages in thread
From: Thomas Hellström @ 2026-02-06 12:49 UTC (permalink / raw)
  To: Satyanarayana K V P, intel-xe
  Cc: Matthew Brost, Michal Wajdeczko, Matthew Auld

On Wed, 2026-02-04 at 16:46 +0000, Satyanarayana K V P wrote:
> CCS save/restore batch buffers are attached during BO allocation and
> detached during BO teardown. The shrinker triggers xe_bo_move(),
> which is
> used for both allocation and deletion paths.
> 
> When BO allocation and shrinking occur concurrently, a circular
> locking
> dependency involving fs_reclaim and swap_guard can occur, leading to
> a
> deadlock such as:
> 
> ======================================================
> WARNING: possible circular locking dependency detected
> ------------------------------------------------------
> 
>       CPU0                    CPU1
>       ----                    ----
>  lock(fs_reclaim);
>                               lock(&sa_manager->swap_guard);
>                               lock(fs_reclaim);
>  lock(&sa_manager->swap_guard);
> 
>  *** DEADLOCK ***
> =====================================================
> 
> To avoid this, the BB pointer allocation is separated from
> xe_bb_ccs_new(),
> used drm_suballoc_alloc() for SA allocation and drm_suballoc_init()
> for BB
> allocation preventing reclaim from being invoked in this context.
> 
> Fixes: 864690cf4dd62 ("drm/xe/vf: Attach and detach CCS copy commands
> with BO")
> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> 
> ---
> V1 -> V2:
> - Used drm_suballoc_alloc() and drm_suballoc_init() for BB allocation
> (Thomas).
> ---
>  drivers/gpu/drm/xe/xe_bb.c      | 22 ++++++++--------------
>  drivers/gpu/drm/xe/xe_bb.h      |  4 ++--
>  drivers/gpu/drm/xe/xe_migrate.c | 29 +++++++++++++++++++++++++----
>  drivers/gpu/drm/xe/xe_sa.c      | 24 ++++++++++++++++++++++++
>  drivers/gpu/drm/xe/xe_sa.h      | 19 +++++++++++++++++++
>  5 files changed, 78 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
> index 8b678297aaa2..9a04d0e814d3 100644
> --- a/drivers/gpu/drm/xe/xe_bb.c
> +++ b/drivers/gpu/drm/xe/xe_bb.c
> @@ -59,16 +59,14 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32
> dwords, bool usm)
>  	return ERR_PTR(err);
>  }
>  
> -struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> -			    enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
> +int xe_bb_ccs_new(struct xe_gt *gt, struct xe_bb *bb, struct
> drm_suballoc *sa,
> +		  u32 dwords, enum xe_sriov_vf_ccs_rw_ctxs ctx_id)

Should be called xe_bb_ccs_init()?

>  {
> -	struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
>  	struct xe_device *xe = gt_to_xe(gt);
>  	struct xe_sa_manager *bb_pool;
> +	int timeout = HZ;
>  	int err;
>  
> -	if (!bb)
> -		return ERR_PTR(-ENOMEM);
>  	/*
>  	 * We need to allocate space for the requested number of
> dwords &
>  	 * one additional MI_BATCH_BUFFER_END dword. Since the whole
> SA
> @@ -78,20 +76,16 @@ struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32
> dwords,
>  	 */
>  
>  	bb_pool = xe->sriov.vf.ccs.contexts[ctx_id].mem.ccs_bb_pool;
> -	bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
> +	err = xe_sa_bo_new_init(bb_pool, sa, 4 * (dwords + 1),
> timeout);
>  
> -	if (IS_ERR(bb->bo)) {
> -		err = PTR_ERR(bb->bo);
> -		goto err;
> -	}
> +	if (err)
> +		return err;
>  
> +	bb->bo = sa;
>  	bb->cs = xe_sa_bo_cpu_addr(bb->bo);
>  	bb->len = 0;
>  
> -	return bb;
> -err:
> -	kfree(bb);
> -	return ERR_PTR(err);
> +	return 0;
>  }
>  
>  static struct xe_sched_job *
> diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
> index 2a8adc9a6dee..3da4652cf0b0 100644
> --- a/drivers/gpu/drm/xe/xe_bb.h
> +++ b/drivers/gpu/drm/xe/xe_bb.h
> @@ -16,8 +16,8 @@ struct xe_sched_job;
>  enum xe_sriov_vf_ccs_rw_ctxs;
>  
>  struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm);
> -struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> -			    enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
> +int xe_bb_ccs_new(struct xe_gt *gt, struct xe_bb *bb, struct
> drm_suballoc *sa,
> +		  u32 dwords, enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
>  struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
>  				      struct xe_bb *bb);
>  struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue
> *q,
> diff --git a/drivers/gpu/drm/xe/xe_migrate.c
> b/drivers/gpu/drm/xe/xe_migrate.c
> index 078a9bc2821d..15d73814a08a 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/xe_migrate.c
> @@ -1109,6 +1109,7 @@ int xe_migrate_ccs_rw_copy(struct xe_tile
> *tile, struct xe_exec_queue *q,
>  	struct xe_sriov_vf_ccs_ctx *ctx;
>  	struct xe_sa_manager *bb_pool;
>  	u64 size = xe_bo_size(src_bo);
> +	struct drm_suballoc *sa;
>  	struct xe_bb *bb = NULL;
>  	u64 src_L0, src_L0_ofs;
>  	u32 src_L0_pt;
> @@ -1148,15 +1149,28 @@ int xe_migrate_ccs_rw_copy(struct xe_tile
> *tile, struct xe_exec_queue *q,
>  		size -= src_L0;
>  	}
>  
> +	bb = kmalloc(sizeof(*bb), GFP_KERNEL);
> +	if (!bb) {
> +		err = -ENOMEM;
> +		goto err_bb;
> +	}
> +
> +	sa = drm_suballoc_alloc(GFP_KERNEL);
> +	if (IS_ERR(sa)) {
> +		drm_err(&xe->drm, "Sub-allocator memory allocation
> failed with %ld\n",
> +			PTR_ERR(sa));
> +		err = PTR_ERR(sa);
> +		goto err_sa;
> +	}
> +

The above should be replaced by a new function xe_bb_alloc().

>  	bb_pool = ctx->mem.ccs_bb_pool;
>  	guard(mutex) (xe_sa_bo_swap_guard(bb_pool));
>  	xe_sa_bo_swap_shadow(bb_pool);
>  
> -	bb = xe_bb_ccs_new(gt, batch_size, read_write);
> -	if (IS_ERR(bb)) {
> +	err = xe_bb_ccs_new(gt, bb, sa, batch_size, read_write);

And this should be xe_bb_ccs_init().

> +	if (err) {
>  		drm_err(&xe->drm, "BB allocation failed.\n");
> -		err = PTR_ERR(bb);
> -		return err;
> +		goto err_bb_ccs;
>  	}
>  
>  	batch_size_allocated = batch_size;
> @@ -1208,6 +1222,13 @@ int xe_migrate_ccs_rw_copy(struct xe_tile
> *tile, struct xe_exec_queue *q,
>  	xe_sriov_vf_ccs_rw_update_bb_addr(ctx);
>  	xe_sa_bo_sync_shadow(bb->bo);
>  	return 0;
> +
> +err_bb_ccs:
> +	drm_suballoc_release(sa);
> +err_sa:
> +	kfree(bb);
> +err_bb:
> +	return err;

And corresponding error path.

>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/xe/xe_sa.c b/drivers/gpu/drm/xe/xe_sa.c
> index 5efbb5a09f77..2cfe6a353299 100644
> --- a/drivers/gpu/drm/xe/xe_sa.c
> +++ b/drivers/gpu/drm/xe/xe_sa.c
> @@ -181,6 +181,30 @@ struct drm_suballoc *__xe_sa_bo_new(struct
> xe_sa_manager *sa_manager, u32 size,
>  	return drm_suballoc_new(&sa_manager->base, size, gfp, true,
> 0);
>  }
>  
> +/**
> + * __xe_sa_bo_new_init() - Make a suballocation with given SA.

Avoid external functions starting with __

> + * @sa_manager: the &xe_sa_manager
> + * @sa : Uninitalized sub allocator
> + * @size: number of bytes we want to suballocate
> + * @timeout: Timeout in jiffies waiting for allocation.
> + *
> + * Try to make a suballocation of size @size.
> + *
> + * Return: zero on success, errno on failure.
> + */
> +int __xe_sa_bo_new_init(struct xe_sa_manager *sa_manager, struct
> drm_suballoc *sa,
> +			u32 size, int timeout)
> +{
> +	/*
> +	 * BB to large, return -ENOBUFS indicating user should split
> +	 * array of binds into smaller chunks.
> +	 */

This is a double layer violation. Upper layers should not be aware that
xe_sa_manager is using drm_suballoc internally. And the xe_sa_manager
should not adapt error codes to what upper layers return to their
callers. The code should be self-contained and reusable for other
purposes. I'm not sure this function is needed.


> +	if (size > sa_manager->base.size)
> +		return -ENOBUFS;
> +
> +	return drm_suballoc_init(&sa_manager->base, sa, size, true,
> 0, timeout);
> +}
> +
>  /**
>   * xe_sa_bo_flush_write() - Copy the data from the sub-allocation to
> the GPU memory.
>   * @sa_bo: the &drm_suballoc to flush
> diff --git a/drivers/gpu/drm/xe/xe_sa.h b/drivers/gpu/drm/xe/xe_sa.h
> index 05e9a4e00e78..9cb8722779a4 100644
> --- a/drivers/gpu/drm/xe/xe_sa.h
> +++ b/drivers/gpu/drm/xe/xe_sa.h
> @@ -18,6 +18,8 @@ struct xe_tile;
>  struct xe_sa_manager *__xe_sa_bo_manager_init(struct xe_tile *tile,
> u32 size,
>  					      u32 guard, u32 align,
> u32 flags);
>  struct drm_suballoc *__xe_sa_bo_new(struct xe_sa_manager
> *sa_manager, u32 size, gfp_t gfp);
> +int __xe_sa_bo_new_init(struct xe_sa_manager *sa_manager, struct
> drm_suballoc *sa,
> +			u32 size, int timeout);
>  
>  static inline struct xe_sa_manager *xe_sa_bo_manager_init(struct
> xe_tile *tile, u32 size, u32 align)
>  {
> @@ -38,6 +40,23 @@ static inline struct drm_suballoc
> *xe_sa_bo_new(struct xe_sa_manager *sa_manager
>  	return __xe_sa_bo_new(sa_manager, size, GFP_KERNEL);
>  }
>  
> +/**
> + * xe_sa_bo_new_init() - Make a suballocation.
> + * @sa_manager: the &xe_sa_manager
> + * @sa : Uninitialized sub-allocator
> + * @size: number of bytes we want to suballocate
> + * @timeout: Time to a wait suballocation to become available.
> + *
> + * Try to make a suballocation of size @size.
> + *
> + * Return: zero on success, errno on failure.
> + */
> +static inline int xe_sa_bo_new_init(struct xe_sa_manager
> *sa_manager,
> +				    struct drm_suballoc *sa, u32
> size, int timeout)
> +{
> +	return __xe_sa_bo_new_init(sa_manager, sa, size, timeout);
> +}

I think this should be split into xe_sa_bo_alloc() and xe_sa_bo_init() 

> +
>  void xe_sa_bo_flush_write(struct drm_suballoc *sa_bo);
>  void xe_sa_bo_sync_read(struct drm_suballoc *sa_bo);
>  void xe_sa_bo_free(struct drm_suballoc *sa_bo, struct dma_fence
> *fence);

Thanks,
Thomas



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

* Re: [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers
  2026-02-06 12:34   ` Thomas Hellström
@ 2026-02-06 15:27     ` Christian König
  0 siblings, 0 replies; 17+ messages in thread
From: Christian König @ 2026-02-06 15:27 UTC (permalink / raw)
  To: Thomas Hellström, Satyanarayana K V P, intel-xe
  Cc: Matthew Brost, Michal Wajdeczko, Matthew Auld, dri-devel

On 2/6/26 13:34, Thomas Hellström wrote:
> + dri-devel, Christian
> 
> On Wed, 2026-02-04 at 16:46 +0000, Satyanarayana K V P wrote:
>> drm_suballoc_new() currently both allocates the SA object using
>> kmalloc()
>> and searches for a suitable hole in the sub-allocator for the
>> requested
>> size. Since kmalloc() may take internal locks, performing memory
>> allocation while holding the sub-allocator mutex can trigger lockdep
>> deadlock warnings.
> 
> ... As Matt mentioned, This is to be able to suballocate under a
> reclaim-tainted lock: Allocation can be done outside the lock, and init
> inside the lock.
> 
>>
>> Fix this by splitting SA allocation from drm_suballoc_new(),
>> separating
>> object allocation from sub-allocator initialization and hole
>> selection.
>>
>> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
>> Suggested-by: Matthew Brost <matthew.brost@intel.com>
>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Cc: Matthew Auld <matthew.auld@intel.com>
> 
> This must be CC'd dri-devel as well and AMD maintainers.
> 
> Below is in addition to MBrost's comments.
> 
>>
>> ---
>> V1 -> V2:
>> - Splitted drm_suballoc_new() into drm_suballoc_alloc() and
>> drm_suballoc_init() (Thomas).
>> ---
>>  drivers/gpu/drm/drm_suballoc.c | 135 +++++++++++++++++++++++++------
>> --
>>  include/drm/drm_suballoc.h     |   8 ++
>>  2 files changed, 112 insertions(+), 31 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_suballoc.c
>> b/drivers/gpu/drm/drm_suballoc.c
>> index 879ea33dbbc4..6f21f9e048d6 100644
>> --- a/drivers/gpu/drm/drm_suballoc.c
>> +++ b/drivers/gpu/drm/drm_suballoc.c
>> @@ -123,7 +123,7 @@ static void drm_suballoc_remove_locked(struct
>> drm_suballoc *sa)
>>  	list_del_init(&sa->olist);
>>  	list_del_init(&sa->flist);
>>  	dma_fence_put(sa->fence);
>> -	kfree(sa);
>> +	drm_suballoc_release(sa);
>>  }
>>  
>>  static void drm_suballoc_try_free(struct drm_suballoc_manager
>> *sa_manager)
>> @@ -293,45 +293,75 @@ static bool drm_suballoc_next_hole(struct
>> drm_suballoc_manager *sa_manager,
>>  }
>>  
>>  /**
>> - * drm_suballoc_new() - Make a suballocation.
>> + * drm_suballoc_alloc() - Allocate uninitialized suballoc object.
>> + * @gfp: gfp flags used for memory allocation.
>> + *
>> + * Allocate memory for an uninitialized suballoc object. Intended
>> usage is
>> + * allocate memory for suballoc object outside of a reclaim tainted
>> context
>> + * and then be initialized at a later time in a reclaim tainted
>> context.
>> + *
>> + * @drm_suballoc_release should be used to release the memory if
>> returned
>> + * suballoc object is in uninitialized state.
>> + *
>> + * Return: a new uninitialized suballoc object, or an ERR_PTR(-
>> ENOMEM).
>> + */
>> +struct drm_suballoc *drm_suballoc_alloc(gfp_t gfp)
>> +{
>> +	struct drm_suballoc *sa;
>> +
>> +	sa = kmalloc(sizeof(*sa), gfp);
>> +	if (!sa)
>> +		return ERR_PTR(-ENOMEM);
>> +
>> +	return sa;
>> +}
>> +EXPORT_SYMBOL(drm_suballoc_alloc);
>> +
>> +/**
>> + * drm_suballoc_release() - Release memory for suballocation.
>> + * @sa: The struct drm_suballoc.
>> + */
>> +void drm_suballoc_release(struct drm_suballoc *sa)
>> +{
>> +	kfree(sa);
>> +}
>> +EXPORT_SYMBOL(drm_suballoc_release);
>> +
>> +/**
>> + * drm_suballoc_init() - Initialize a suballocation.
>>   * @sa_manager: pointer to the sa_manager
>> + * @sa: The struct drm_suballoc.
>>   * @size: number of bytes we want to suballocate.
>> - * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL
>> but
>> - *       the argument is provided for suballocations from reclaim
>> context or
>> - *       where the caller wants to avoid pipelining rather than wait
>> for
>> - *       reclaim.
>>   * @intr: Whether to perform waits interruptible. This should
>> typically
>>   *        always be true, unless the caller needs to propagate a
>>   *        non-interruptible context from above layers.
>>   * @align: Alignment. Must not exceed the default manager alignment.
>>   *         If @align is zero, then the manager alignment is used.
>> + * @timeout: Time to a wait suballocation to become available.
> 
> I think we should split out the timeout to a separate patch, since that
> is not really related to the problem of the lockdep splat, and it would
> require a separate motivation, since typically the CTRL-C in
> combination with fence timeouts are sufficient. We need to explain why
> that's not the case for this particuar use-case.

Yeah, agree completely.

Timeouts need to have a justification, either because userspace said it wants to wait only that long for something to happen or because some HW specification says an operation can only take a specific amount of time.

Otherwise timeouts have the strong potential of being abused to solve deadlocks which is clearly not allowed upstream.

> 
> Also that would make the -fixes patches for the reclaim lockdep splat
> smaller.

Agree as well, skimmed only over it but it looks pretty good of hand.

Regards,
Christian.

> 
> 
> Otherwise LGTM.
> Thomas
> 
> 
>>   *
>> - * Try to make a suballocation of size @size, which will be rounded
>> - * up to the alignment specified in specified in
>> drm_suballoc_manager_init().
>> + * Try to make a suballocation on a pre-allocated suballoc object of
>> size @size,
>> + * which will be rounded up to the alignment specified in specified
>> in
>> + * drm_suballoc_manager_init().
>>   *
>> - * Return: a new suballocated bo, or an ERR_PTR.
>> + * Return: zero on success, errno on failure.
>>   */
>> -struct drm_suballoc *
>> -drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t
>> size,
>> -		 gfp_t gfp, bool intr, size_t align)
>> +int drm_suballoc_init(struct drm_suballoc_manager *sa_manager,
>> +		      struct drm_suballoc *sa, size_t size,
>> +		      bool intr, size_t align, signed long timeout)
>>  {
>>  	struct dma_fence *fences[DRM_SUBALLOC_MAX_QUEUES];
>>  	unsigned int tries[DRM_SUBALLOC_MAX_QUEUES];
>>  	unsigned int count;
>>  	int i, r;
>> -	struct drm_suballoc *sa;
>>  
>>  	if (WARN_ON_ONCE(align > sa_manager->align))
>> -		return ERR_PTR(-EINVAL);
>> +		return -EINVAL;
>>  	if (WARN_ON_ONCE(size > sa_manager->size || !size))
>> -		return ERR_PTR(-EINVAL);
>> +		return -EINVAL;
>>  
>>  	if (!align)
>>  		align = sa_manager->align;
>>  
>> -	sa = kmalloc(sizeof(*sa), gfp);
>> -	if (!sa)
>> -		return ERR_PTR(-ENOMEM);
>>  	sa->manager = sa_manager;
>>  	sa->fence = NULL;
>>  	INIT_LIST_HEAD(&sa->olist);
>> @@ -339,6 +369,8 @@ drm_suballoc_new(struct drm_suballoc_manager
>> *sa_manager, size_t size,
>>  
>>  	spin_lock(&sa_manager->wq.lock);
>>  	do {
>> +		long t;
>> +
>>  		for (i = 0; i < DRM_SUBALLOC_MAX_QUEUES; ++i)
>>  			tries[i] = 0;
>>  
>> @@ -348,7 +380,7 @@ drm_suballoc_new(struct drm_suballoc_manager
>> *sa_manager, size_t size,
>>  			if (drm_suballoc_try_alloc(sa_manager, sa,
>>  						   size, align)) {
>>  				spin_unlock(&sa_manager->wq.lock);
>> -				return sa;
>> +				return 0;
>>  			}
>>  
>>  			/* see if we can skip over some allocations
>> */
>> @@ -359,34 +391,75 @@ drm_suballoc_new(struct drm_suballoc_manager
>> *sa_manager, size_t size,
>>  				fences[count++] =
>> dma_fence_get(fences[i]);
>>  
>>  		if (count) {
>> -			long t;
>> -
>>  			spin_unlock(&sa_manager->wq.lock);
>>  			t = dma_fence_wait_any_timeout(fences,
>> count, intr,
>> -						      
>> MAX_SCHEDULE_TIMEOUT,
>> -						       NULL);
>> +						       timeout,
>> NULL);
>>  			for (i = 0; i < count; ++i)
>>  				dma_fence_put(fences[i]);
>>  
>> -			r = (t > 0) ? 0 : t;
>>  			spin_lock(&sa_manager->wq.lock);
>>  		} else if (intr) {
>> +			spin_unlock(&sa_manager->wq.lock);
>>  			/* if we have nothing to wait for block */
>> -			r = wait_event_interruptible_locked
>> +			r = wait_event_interruptible_timeout
>>  				(sa_manager->wq,
>> -				 __drm_suballoc_event(sa_manager,
>> size, align));
>> +				 __drm_suballoc_event(sa_manager,
>> size, align),
>> +				 timeout);
>> +			spin_lock(&sa_manager->wq.lock);
>>  		} else {
>>  			spin_unlock(&sa_manager->wq.lock);
>> -			wait_event(sa_manager->wq,
>> -				   drm_suballoc_event(sa_manager,
>> size, align));
>> -			r = 0;
>> +			t = wait_event_timeout
>> +				(sa_manager->wq,
>> +				 drm_suballoc_event(sa_manager,
>> size, align),
>> +				 timeout);
>>  			spin_lock(&sa_manager->wq.lock);
>>  		}
>> +		r = (t > 0) ? 0 : !r ? -ETIME : t;
>>  	} while (!r);
>>  
>>  	spin_unlock(&sa_manager->wq.lock);
>> -	kfree(sa);
>> -	return ERR_PTR(r);
>> +	return r;
>> +}
>> +EXPORT_SYMBOL(drm_suballoc_init);
>> +
>> +/**
>> + * drm_suballoc_new() - Make a suballocation.
>> + * @sa_manager: pointer to the sa_manager
>> + * @size: number of bytes we want to suballocate.
>> + * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL
>> but
>> + *       the argument is provided for suballocations from reclaim
>> context or
>> + *       where the caller wants to avoid pipelining rather than wait
>> for
>> + *       reclaim.
>> + * @intr: Whether to perform waits interruptible. This should
>> typically
>> + *        always be true, unless the caller needs to propagate a
>> + *        non-interruptible context from above layers.
>> + * @align: Alignment. Must not exceed the default manager alignment.
>> + *         If @align is zero, then the manager alignment is used.
>> + *
>> + * Try to make a suballocation of size @size, which will be rounded
>> + * up to the alignment specified in specified in
>> drm_suballoc_manager_init().
>> + *
>> + * Return: a new suballocated bo, or an ERR_PTR.
>> + */
>> +struct drm_suballoc *
>> +drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t
>> size,
>> +		 gfp_t gfp, bool intr, size_t align)
>> +{
>> +	struct drm_suballoc *sa;
>> +	int err;
>> +
>> +	sa = drm_suballoc_alloc(gfp);
>> +	if (IS_ERR(sa))
>> +		return sa;
>> +
>> +	err = drm_suballoc_init(sa_manager, sa, size, intr, align,
>> +				MAX_SCHEDULE_TIMEOUT);
>> +	if (err) {
>> +		drm_suballoc_release(sa);
>> +		return ERR_PTR(err);
>> +	}
>> +
>> +	return sa;
>>  }
>>  EXPORT_SYMBOL(drm_suballoc_new);
>>  
>> diff --git a/include/drm/drm_suballoc.h b/include/drm/drm_suballoc.h
>> index 7ba72a81a808..cff0e14556d1 100644
>> --- a/include/drm/drm_suballoc.h
>> +++ b/include/drm/drm_suballoc.h
>> @@ -53,6 +53,14 @@ void drm_suballoc_manager_init(struct
>> drm_suballoc_manager *sa_manager,
>>  
>>  void drm_suballoc_manager_fini(struct drm_suballoc_manager
>> *sa_manager);
>>  
>> +struct drm_suballoc *drm_suballoc_alloc(gfp_t gfp);
>> +
>> +void drm_suballoc_release(struct drm_suballoc *sa);
>> +
>> +int drm_suballoc_init(struct drm_suballoc_manager *sa_manager,
>> +		      struct drm_suballoc *sa, size_t size, bool
>> intr,
>> +		      size_t align, signed long timeout);
>> +
>>  struct drm_suballoc *
>>  drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t
>> size,
>>  		 gfp_t gfp, bool intr, size_t align);


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

* Re: [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard
  2026-02-04 16:46 ` [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard Satyanarayana K V P
  2026-02-04 19:11   ` Matthew Brost
@ 2026-02-06 16:17   ` Thomas Hellström
  2026-02-06 18:28     ` Matthew Brost
  1 sibling, 1 reply; 17+ messages in thread
From: Thomas Hellström @ 2026-02-06 16:17 UTC (permalink / raw)
  To: Satyanarayana K V P, intel-xe
  Cc: Matthew Brost, Michal Wajdeczko, Matthew Auld

Hi

On Wed, 2026-02-04 at 16:46 +0000, Satyanarayana K V P wrote:
> Annotate the SA manager init path to model taking swap_guard while
> under
> reclaim context. This helps lockdep catch potential circular
> dependencies
> between fs_reclaim and swap_guard in debug builds.
> 
> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Suggested-by: Matthew Brost <matthew.brost@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> 
> ---
> V1 -> V2:
> - None.
> ---
>  drivers/gpu/drm/xe/xe_sa.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_sa.c b/drivers/gpu/drm/xe/xe_sa.c
> index b738102575d4..5efbb5a09f77 100644
> --- a/drivers/gpu/drm/xe/xe_sa.c
> +++ b/drivers/gpu/drm/xe/xe_sa.c
> @@ -89,6 +89,12 @@ struct xe_sa_manager
> *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size,
>   if (ret)
>   return ERR_PTR(ret);
>  
> + if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
> + fs_reclaim_acquire(GFP_KERNEL);
> + might_lock(&sa_manager->swap_guard);
> + fs_reclaim_release(GFP_KERNEL);
> + }
> +
>   shadow = xe_managed_bo_create_pin_map(xe, tile, size,
>         XE_BO_FLAG_VRAM_IF_DGFX(tile) |
>         XE_BO_FLAG_GGTT |

Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>

In addition to this, a couple of comments to the code that is already
in the driver:

It would be beneficial for understanding if a document section was
added for the typical usage flow of the shadow buffer, something like
the below (hope I got this correct).

*) Clearly stating the use-case: That the whole buffer is bound to HW
and can execute at any time. The shadow buffer is part of a double
buffering scheme so that updates are visible to the hardware
atomically.

*) The flow:
-lock()
-Swap buffers: The buffers are identical. The buffer bound to hardware
becomes the shadow.
-Update the primary buffer.
-Flush the cpu buffer to primary on DGFX (BTW IIRC this was missing in
the code). -Point the HW to the primary buffer.
-sync the shadow to the primary.
-unlock()

In addition perhaps more lockdep asserts an also perhaps pin the lock
in swap buffers and unpin in sync to shadow so that if anybody releases
the lock in between you'd get a warning.

But this can be done as a follow-up, (beware the possibly missing cpu
buffer flush, though). I think it's worth spending some time on this.

Thanks,
Thomas
   A. 

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

* Re: [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard
  2026-02-06 16:17   ` Thomas Hellström
@ 2026-02-06 18:28     ` Matthew Brost
  2026-02-09  9:09       ` Thomas Hellström
  0 siblings, 1 reply; 17+ messages in thread
From: Matthew Brost @ 2026-02-06 18:28 UTC (permalink / raw)
  To: Thomas Hellström
  Cc: Satyanarayana K V P, intel-xe, Michal Wajdeczko, Matthew Auld

On Fri, Feb 06, 2026 at 05:17:46PM +0100, Thomas Hellström wrote:
> Hi
> 
> On Wed, 2026-02-04 at 16:46 +0000, Satyanarayana K V P wrote:
> > Annotate the SA manager init path to model taking swap_guard while
> > under
> > reclaim context. This helps lockdep catch potential circular
> > dependencies
> > between fs_reclaim and swap_guard in debug builds.
> > 
> > Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> > Suggested-by: Matthew Brost <matthew.brost@intel.com>
> > Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> > Cc: Matthew Auld <matthew.auld@intel.com>
> > 
> > ---
> > V1 -> V2:
> > - None.
> > ---
> >  drivers/gpu/drm/xe/xe_sa.c | 6 ++++++
> >  1 file changed, 6 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/xe/xe_sa.c b/drivers/gpu/drm/xe/xe_sa.c
> > index b738102575d4..5efbb5a09f77 100644
> > --- a/drivers/gpu/drm/xe/xe_sa.c
> > +++ b/drivers/gpu/drm/xe/xe_sa.c
> > @@ -89,6 +89,12 @@ struct xe_sa_manager
> > *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size,
> >   if (ret)
> >   return ERR_PTR(ret);
> >  
> > + if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
> > + fs_reclaim_acquire(GFP_KERNEL);
> > + might_lock(&sa_manager->swap_guard);
> > + fs_reclaim_release(GFP_KERNEL);
> > + }
> > +
> >   shadow = xe_managed_bo_create_pin_map(xe, tile, size,
> >         XE_BO_FLAG_VRAM_IF_DGFX(tile) |
> >         XE_BO_FLAG_GGTT |
> 
> Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> 
> In addition to this, a couple of comments to the code that is already
> in the driver:
> 
> It would be beneficial for understanding if a document section was
> added for the typical usage flow of the shadow buffer, something like
> the below (hope I got this correct).
> 
> *) Clearly stating the use-case: That the whole buffer is bound to HW
> and can execute at any time. The shadow buffer is part of a double
> buffering scheme so that updates are visible to the hardware
> atomically.
> 
> *) The flow:
> -lock()
> -Swap buffers: The buffers are identical. The buffer bound to hardware
> becomes the shadow.
> -Update the primary buffer.
> -Flush the cpu buffer to primary on DGFX (BTW IIRC this was missing in
> the code). -Point the HW to the primary buffer.
> -sync the shadow to the primary.
> -unlock()
> 

This is is roughly correct. I agree a kernel doc section would be good.

> In addition perhaps more lockdep asserts an also perhaps pin the lock

More lockdep is also good. What functions do you think are missing asserts?

These are two possible ones I came up with:

xe_sriov_vf_ccs_rw_update_bb_addr
xe_bb_ccs_new

> in swap buffers and unpin in sync to shadow so that if anybody releases

Pin/unpin isn’t a bad idea. We could also have xe_sa_bo_swap_shadow /
xe_sa_bo_sync_shadow acquire and release the swap lock, since that clearly
defines the critical section for this lock - what do think?

> the lock in between you'd get a warning.
> 
> But this can be done as a follow-up, (beware the possibly missing cpu

There are barriers in xe_sriov_vf_ccs_rw_update_bb_addr, do you think
anything else is missing?

Matt

> buffer flush, though). I think it's worth spending some time on this.
> 
> Thanks,
> Thomas
>    A. 

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

* Re: [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard
  2026-02-06 18:28     ` Matthew Brost
@ 2026-02-09  9:09       ` Thomas Hellström
  2026-02-09 17:07         ` Matthew Brost
  0 siblings, 1 reply; 17+ messages in thread
From: Thomas Hellström @ 2026-02-09  9:09 UTC (permalink / raw)
  To: Matthew Brost
  Cc: Satyanarayana K V P, intel-xe, Michal Wajdeczko, Matthew Auld


Hi,

On Fri, 2026-02-06 at 10:28 -0800, Matthew Brost wrote:
> On Fri, Feb 06, 2026 at 05:17:46PM +0100, Thomas Hellström wrote:
> > Hi
> > 
> > On Wed, 2026-02-04 at 16:46 +0000, Satyanarayana K V P wrote:
> > > Annotate the SA manager init path to model taking swap_guard
> > > while
> > > under
> > > reclaim context. This helps lockdep catch potential circular
> > > dependencies
> > > between fs_reclaim and swap_guard in debug builds.
> > > 
> > > Signed-off-by: Satyanarayana K V P
> > > <satyanarayana.k.v.p@intel.com>
> > > Suggested-by: Matthew Brost <matthew.brost@intel.com>
> > > Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> > > Cc: Matthew Auld <matthew.auld@intel.com>
> > > 
> > > ---
> > > V1 -> V2:
> > > - None.
> > > ---
> > >  drivers/gpu/drm/xe/xe_sa.c | 6 ++++++
> > >  1 file changed, 6 insertions(+)
> > > 
> > > diff --git a/drivers/gpu/drm/xe/xe_sa.c
> > > b/drivers/gpu/drm/xe/xe_sa.c
> > > index b738102575d4..5efbb5a09f77 100644
> > > --- a/drivers/gpu/drm/xe/xe_sa.c
> > > +++ b/drivers/gpu/drm/xe/xe_sa.c
> > > @@ -89,6 +89,12 @@ struct xe_sa_manager
> > > *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size,
> > >   if (ret)
> > >   return ERR_PTR(ret);
> > >  
> > > + if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
> > > + fs_reclaim_acquire(GFP_KERNEL);
> > > + might_lock(&sa_manager->swap_guard);
> > > + fs_reclaim_release(GFP_KERNEL);
> > > + }
> > > +
> > >   shadow = xe_managed_bo_create_pin_map(xe, tile, size,
> > >         XE_BO_FLAG_VRAM_IF_DGFX(tile) |
> > >         XE_BO_FLAG_GGTT |
> > 
> > Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> > 
> > In addition to this, a couple of comments to the code that is
> > already
> > in the driver:
> > 
> > It would be beneficial for understanding if a document section was
> > added for the typical usage flow of the shadow buffer, something
> > like
> > the below (hope I got this correct).
> > 
> > *) Clearly stating the use-case: That the whole buffer is bound to
> > HW
> > and can execute at any time. The shadow buffer is part of a double
> > buffering scheme so that updates are visible to the hardware
> > atomically.
> > 
> > *) The flow:
> > -lock()
> > -Swap buffers: The buffers are identical. The buffer bound to
> > hardware
> > becomes the shadow.
> > -Update the primary buffer.
> > -Flush the cpu buffer to primary on DGFX (BTW IIRC this was missing
> > in
> > the code). -Point the HW to the primary buffer.
> > -sync the shadow to the primary.
> > -unlock()
> > 
> 
> This is is roughly correct. I agree a kernel doc section would be
> good.
> 
> > In addition perhaps more lockdep asserts an also perhaps pin the
> > lock
> 
> More lockdep is also good. What functions do you think are missing
> asserts?
> 
> These are two possible ones I came up with:
> 
> xe_sriov_vf_ccs_rw_update_bb_addr


> xe_bb_ccs_new

These are possible candidates, But I was mostly thinking of the xe_sa
functions involved in the above flow. So that would essentially be
xe_sa_bo_flush_write() missing asserts.


> 
> > in swap buffers and unpin in sync to shadow so that if anybody
> > releases
> 
> Pin/unpin isn’t a bad idea. We could also have xe_sa_bo_swap_shadow /
> xe_sa_bo_sync_shadow acquire and release the swap lock, since that
> clearly
> defines the critical section for this lock - what do think?
> 
> > the lock in between you'd get a warning.
> > 
> > But this can be done as a follow-up, (beware the possibly missing
> > cpu
> 
> There are barriers in xe_sriov_vf_ccs_rw_update_bb_addr, do you think
> anything else is missing?

Yes, on DGFX we maintain a system memory buffer to avoid read
operations over PCIe. So writes to the sa memory doesn't immediately
appear in primary gpu memory. It needs a xe_sa_bo_flush_write(). I
might have missed it, but I don't see it in the code?

Also as an unrelated item, I think we should use scoped_guard() instead
of guard() for xe_bo_swap_guard() to clearly mark the region where the
lock is strictly needed? Would make it easier for a new developer
reading the code or somebody updating the code at the end of the
function to not add unnecessary stuff in the critical section.

Thanks,
Thomas

> 
> Matt
> 
> > buffer flush, though). I think it's worth spending some time on
> > this.
> > 
> > Thanks,
> > Thomas
> >    A. 

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

* Re: [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard
  2026-02-09  9:09       ` Thomas Hellström
@ 2026-02-09 17:07         ` Matthew Brost
  0 siblings, 0 replies; 17+ messages in thread
From: Matthew Brost @ 2026-02-09 17:07 UTC (permalink / raw)
  To: Thomas Hellström
  Cc: Satyanarayana K V P, intel-xe, Michal Wajdeczko, Matthew Auld

On Mon, Feb 09, 2026 at 10:09:11AM +0100, Thomas Hellström wrote:
> 
> Hi,
> 
> On Fri, 2026-02-06 at 10:28 -0800, Matthew Brost wrote:
> > On Fri, Feb 06, 2026 at 05:17:46PM +0100, Thomas Hellström wrote:
> > > Hi
> > > 
> > > On Wed, 2026-02-04 at 16:46 +0000, Satyanarayana K V P wrote:
> > > > Annotate the SA manager init path to model taking swap_guard
> > > > while
> > > > under
> > > > reclaim context. This helps lockdep catch potential circular
> > > > dependencies
> > > > between fs_reclaim and swap_guard in debug builds.
> > > > 
> > > > Signed-off-by: Satyanarayana K V P
> > > > <satyanarayana.k.v.p@intel.com>
> > > > Suggested-by: Matthew Brost <matthew.brost@intel.com>
> > > > Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> > > > Cc: Matthew Auld <matthew.auld@intel.com>
> > > > 
> > > > ---
> > > > V1 -> V2:
> > > > - None.
> > > > ---
> > > >  drivers/gpu/drm/xe/xe_sa.c | 6 ++++++
> > > >  1 file changed, 6 insertions(+)
> > > > 
> > > > diff --git a/drivers/gpu/drm/xe/xe_sa.c
> > > > b/drivers/gpu/drm/xe/xe_sa.c
> > > > index b738102575d4..5efbb5a09f77 100644
> > > > --- a/drivers/gpu/drm/xe/xe_sa.c
> > > > +++ b/drivers/gpu/drm/xe/xe_sa.c
> > > > @@ -89,6 +89,12 @@ struct xe_sa_manager
> > > > *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size,
> > > >   if (ret)
> > > >   return ERR_PTR(ret);
> > > >  
> > > > + if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
> > > > + fs_reclaim_acquire(GFP_KERNEL);
> > > > + might_lock(&sa_manager->swap_guard);
> > > > + fs_reclaim_release(GFP_KERNEL);
> > > > + }
> > > > +
> > > >   shadow = xe_managed_bo_create_pin_map(xe, tile, size,
> > > >         XE_BO_FLAG_VRAM_IF_DGFX(tile) |
> > > >         XE_BO_FLAG_GGTT |
> > > 
> > > Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> > > 
> > > In addition to this, a couple of comments to the code that is
> > > already
> > > in the driver:
> > > 
> > > It would be beneficial for understanding if a document section was
> > > added for the typical usage flow of the shadow buffer, something
> > > like
> > > the below (hope I got this correct).
> > > 
> > > *) Clearly stating the use-case: That the whole buffer is bound to
> > > HW
> > > and can execute at any time. The shadow buffer is part of a double
> > > buffering scheme so that updates are visible to the hardware
> > > atomically.
> > > 
> > > *) The flow:
> > > -lock()
> > > -Swap buffers: The buffers are identical. The buffer bound to
> > > hardware
> > > becomes the shadow.
> > > -Update the primary buffer.
> > > -Flush the cpu buffer to primary on DGFX (BTW IIRC this was missing
> > > in
> > > the code). -Point the HW to the primary buffer.
> > > -sync the shadow to the primary.
> > > -unlock()
> > > 
> > 
> > This is is roughly correct. I agree a kernel doc section would be
> > good.
> > 
> > > In addition perhaps more lockdep asserts an also perhaps pin the
> > > lock
> > 
> > More lockdep is also good. What functions do you think are missing
> > asserts?
> > 
> > These are two possible ones I came up with:
> > 
> > xe_sriov_vf_ccs_rw_update_bb_addr
> 
> 
> > xe_bb_ccs_new
> 
> These are possible candidates, But I was mostly thinking of the xe_sa
> functions involved in the above flow. So that would essentially be
> xe_sa_bo_flush_write() missing asserts.
> 
> 
> > 
> > > in swap buffers and unpin in sync to shadow so that if anybody
> > > releases
> > 
> > Pin/unpin isn’t a bad idea. We could also have xe_sa_bo_swap_shadow /
> > xe_sa_bo_sync_shadow acquire and release the swap lock, since that
> > clearly
> > defines the critical section for this lock - what do think?
> > 
> > > the lock in between you'd get a warning.
> > > 
> > > But this can be done as a follow-up, (beware the possibly missing
> > > cpu
> > 
> > There are barriers in xe_sriov_vf_ccs_rw_update_bb_addr, do you think
> > anything else is missing?
> 
> Yes, on DGFX we maintain a system memory buffer to avoid read
> operations over PCIe. So writes to the sa memory doesn't immediately
> appear in primary gpu memory. It needs a xe_sa_bo_flush_write(). I
> might have missed it, but I don't see it in the code?
> 

You are not blind, that call is missing. This is a iGPU feature only, so
it isn't needed but for completeness / future proofing that call should
likely be added in.

> Also as an unrelated item, I think we should use scoped_guard() instead
> of guard() for xe_bo_swap_guard() to clearly mark the region where the
> lock is strictly needed? Would make it easier for a new developer
> reading the code or somebody updating the code at the end of the
> function to not add unnecessary stuff in the critical section.

+1. Let's do a scoped guard for locking clarity.

Matt

> 
> Thanks,
> Thomas
> 
> > 
> > Matt
> > 
> > > buffer flush, though). I think it's worth spending some time on
> > > this.
> > > 
> > > Thanks,
> > > Thomas
> > >    A. 

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

end of thread, other threads:[~2026-02-09 17:07 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-04 16:46 [PATCH v2 0/3] Fix fs_reclaim deadlock caused by CCS save/restore Satyanarayana K V P
2026-02-04 16:46 ` [PATCH v2 1/3] drm/sa: Split drm_suballoc_new() into SA alloc and init helpers Satyanarayana K V P
2026-02-04 19:45   ` Matthew Brost
2026-02-06 12:34   ` Thomas Hellström
2026-02-06 15:27     ` Christian König
2026-02-04 16:46 ` [PATCH v2 2/3] drm/xe/sa: Add lockdep annotations for SA manager swap_guard Satyanarayana K V P
2026-02-04 19:11   ` Matthew Brost
2026-02-06 16:17   ` Thomas Hellström
2026-02-06 18:28     ` Matthew Brost
2026-02-09  9:09       ` Thomas Hellström
2026-02-09 17:07         ` Matthew Brost
2026-02-04 16:46 ` [PATCH v2 3/3] drm/xe/vf: Fix fs_reclaim warning with CCS save/restore BB allocation Satyanarayana K V P
2026-02-04 19:18   ` Matthew Brost
2026-02-06 12:49   ` Thomas Hellström
2026-02-05  2:49 ` ✓ CI.KUnit: success for Fix fs_reclaim deadlock caused by CCS save/restore (rev2) Patchwork
2026-02-05  3:24 ` ✓ Xe.CI.BAT: " Patchwork
2026-02-05 18:34 ` ✓ Xe.CI.FULL: " Patchwork

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