Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
@ 2025-06-13 15:18 Thomas Hellström
  2025-06-13 15:18 ` [PATCH 1/3] drm/ttm: Use a struct for the common part of struct ttm_lru_walk and struct ttm_bo_lru_cursor Thomas Hellström
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: Thomas Hellström @ 2025-06-13 15:18 UTC (permalink / raw)
  To: intel-xe
  Cc: Thomas Hellström, dri-devel, airlied, Matthew Brost,
	Matthew Auld, Christian König

This is a deferred task from the Xe bo shrinker addition.

TTM currently have two separate ways of doing buffer object LRU
walks, of which one is exposed to drivers. Both have their benefits
but we shouldn't be implementing the complex bo locking in
two different places. So implement the ttm_lru_walk_for_evict()
function in terms of the guarded iteration also exposed to drivers.

This means that when we get to implement locking using drm_exec,
we only need to do that in a single place.

Add ticketlocking support to the guarded iteration and modify
the iteration arguments.

Thomas Hellström (3):
  drm/ttm: Use a struct for the common part of struct ttm_lru_walk and
    struct ttm_bo_lru_cursor.
  drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor
    initialization
  drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded
    LRU iteration

 drivers/gpu/drm/ttm/ttm_bo.c      |  24 ++--
 drivers/gpu/drm/ttm/ttm_bo_util.c | 186 ++++++++++++------------------
 drivers/gpu/drm/xe/xe_shrinker.c  |   8 +-
 include/drm/ttm/ttm_bo.h          |  44 ++++---
 4 files changed, 122 insertions(+), 140 deletions(-)

-- 
2.49.0


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

* [PATCH 1/3] drm/ttm: Use a struct for the common part of struct ttm_lru_walk and struct ttm_bo_lru_cursor.
  2025-06-13 15:18 [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Thomas Hellström
@ 2025-06-13 15:18 ` Thomas Hellström
  2025-06-16 13:04   ` Christian König
  2025-06-13 15:18 ` [PATCH 2/3] drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor initialization Thomas Hellström
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Thomas Hellström @ 2025-06-13 15:18 UTC (permalink / raw)
  To: intel-xe
  Cc: Thomas Hellström, dri-devel, airlied, Matthew Brost,
	Matthew Auld, Christian König

Let the locking functions take the new struct ttm_lru_walk_arg
as argument in order for them to be easily used from both
types of walk.

Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c      | 24 ++++++++++++++----------
 drivers/gpu/drm/ttm/ttm_bo_util.c | 26 ++++++++++++++------------
 include/drm/ttm/ttm_bo.h          | 23 ++++++++++++++---------
 3 files changed, 42 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 0f874f1e2526..eca486dff976 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -525,11 +525,11 @@ static s64 ttm_bo_evict_cb(struct ttm_lru_walk *walk, struct ttm_buffer_object *
 		return 0;
 
 	if (bo->deleted) {
-		lret = ttm_bo_wait_ctx(bo, walk->ctx);
+		lret = ttm_bo_wait_ctx(bo, walk->arg.ctx);
 		if (!lret)
 			ttm_bo_cleanup_memtype_use(bo);
 	} else {
-		lret = ttm_bo_evict(bo, walk->ctx);
+		lret = ttm_bo_evict(bo, walk->arg.ctx);
 	}
 
 	if (lret)
@@ -565,8 +565,10 @@ static int ttm_bo_evict_alloc(struct ttm_device *bdev,
 	struct ttm_bo_evict_walk evict_walk = {
 		.walk = {
 			.ops = &ttm_evict_walk_ops,
-			.ctx = ctx,
-			.ticket = ticket,
+			.arg = {
+				.ctx = ctx,
+				.ticket = ticket,
+			}
 		},
 		.place = place,
 		.evictor = evictor,
@@ -575,7 +577,7 @@ static int ttm_bo_evict_alloc(struct ttm_device *bdev,
 	};
 	s64 lret;
 
-	evict_walk.walk.trylock_only = true;
+	evict_walk.walk.arg.trylock_only = true;
 	lret = ttm_lru_walk_for_evict(&evict_walk.walk, bdev, man, 1);
 
 	/* One more attempt if we hit low limit? */
@@ -589,12 +591,12 @@ static int ttm_bo_evict_alloc(struct ttm_device *bdev,
 	/* Reset low limit */
 	evict_walk.try_low = evict_walk.hit_low = false;
 	/* If ticket-locking, repeat while making progress. */
-	evict_walk.walk.trylock_only = false;
+	evict_walk.walk.arg.trylock_only = false;
 
 retry:
 	do {
 		/* The walk may clear the evict_walk.walk.ticket field */
-		evict_walk.walk.ticket = ticket;
+		evict_walk.walk.arg.ticket = ticket;
 		evict_walk.evicted = 0;
 		lret = ttm_lru_walk_for_evict(&evict_walk.walk, bdev, man, 1);
 	} while (!lret && evict_walk.evicted);
@@ -1105,7 +1107,7 @@ ttm_bo_swapout_cb(struct ttm_lru_walk *walk, struct ttm_buffer_object *bo)
 	struct ttm_place place = {.mem_type = bo->resource->mem_type};
 	struct ttm_bo_swapout_walk *swapout_walk =
 		container_of(walk, typeof(*swapout_walk), walk);
-	struct ttm_operation_ctx *ctx = walk->ctx;
+	struct ttm_operation_ctx *ctx = walk->arg.ctx;
 	s64 ret;
 
 	/*
@@ -1216,8 +1218,10 @@ s64 ttm_bo_swapout(struct ttm_device *bdev, struct ttm_operation_ctx *ctx,
 	struct ttm_bo_swapout_walk swapout_walk = {
 		.walk = {
 			.ops = &ttm_swap_ops,
-			.ctx = ctx,
-			.trylock_only = true,
+			.arg = {
+				.ctx = ctx,
+				.trylock_only = true,
+			},
 		},
 		.gfp_flags = gfp_flags,
 	};
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index b78365dc1fed..600145cdeb9c 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -771,10 +771,12 @@ int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
 	return ret;
 }
 
-static bool ttm_lru_walk_trylock(struct ttm_operation_ctx *ctx,
+static bool ttm_lru_walk_trylock(struct ttm_lru_walk_arg *arg,
 				 struct ttm_buffer_object *bo,
 				 bool *needs_unlock)
 {
+	struct ttm_operation_ctx *ctx = arg->ctx;
+
 	*needs_unlock = false;
 
 	if (dma_resv_trylock(bo->base.resv)) {
@@ -790,17 +792,17 @@ static bool ttm_lru_walk_trylock(struct ttm_operation_ctx *ctx,
 	return false;
 }
 
-static int ttm_lru_walk_ticketlock(struct ttm_lru_walk *walk,
+static int ttm_lru_walk_ticketlock(struct ttm_lru_walk_arg *arg,
 				   struct ttm_buffer_object *bo,
 				   bool *needs_unlock)
 {
 	struct dma_resv *resv = bo->base.resv;
 	int ret;
 
-	if (walk->ctx->interruptible)
-		ret = dma_resv_lock_interruptible(resv, walk->ticket);
+	if (arg->ctx->interruptible)
+		ret = dma_resv_lock_interruptible(resv, arg->ticket);
 	else
-		ret = dma_resv_lock(resv, walk->ticket);
+		ret = dma_resv_lock(resv, arg->ticket);
 
 	if (!ret) {
 		*needs_unlock = true;
@@ -810,7 +812,7 @@ static int ttm_lru_walk_ticketlock(struct ttm_lru_walk *walk,
 		 * after waiting for the ticketlock, revert back to
 		 * trylocking for this walk.
 		 */
-		walk->ticket = NULL;
+		arg->ticket = NULL;
 	} else if (ret == -EDEADLK) {
 		/* Caller needs to exit the ww transaction. */
 		ret = -ENOSPC;
@@ -877,10 +879,10 @@ s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
 		 * since if we do it the other way around, and the trylock fails,
 		 * we need to drop the lru lock to put the bo.
 		 */
-		if (ttm_lru_walk_trylock(walk->ctx, bo, &bo_needs_unlock))
+		if (ttm_lru_walk_trylock(&walk->arg, bo, &bo_needs_unlock))
 			bo_locked = true;
-		else if (!walk->ticket || walk->ctx->no_wait_gpu ||
-			 walk->trylock_only)
+		else if (!walk->arg.ticket || walk->arg.ctx->no_wait_gpu ||
+			 walk->arg.trylock_only)
 			continue;
 
 		if (!ttm_bo_get_unless_zero(bo)) {
@@ -893,7 +895,7 @@ s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
 
 		lret = 0;
 		if (!bo_locked)
-			lret = ttm_lru_walk_ticketlock(walk, bo, &bo_needs_unlock);
+			lret = ttm_lru_walk_ticketlock(&walk->arg, bo, &bo_needs_unlock);
 
 		/*
 		 * Note that in between the release of the lru lock and the
@@ -970,7 +972,7 @@ ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
 {
 	memset(curs, 0, sizeof(*curs));
 	ttm_resource_cursor_init(&curs->res_curs, man);
-	curs->ctx = ctx;
+	curs->arg.ctx = ctx;
 
 	return curs;
 }
@@ -981,7 +983,7 @@ ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *cur
 {
 	struct ttm_buffer_object *bo = res->bo;
 
-	if (!ttm_lru_walk_trylock(curs->ctx, bo, &curs->needs_unlock))
+	if (!ttm_lru_walk_trylock(&curs->arg, bo, &curs->needs_unlock))
 		return NULL;
 
 	if (!ttm_bo_get_unless_zero(bo)) {
diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
index 8ad6e2713625..4e52283e5db1 100644
--- a/include/drm/ttm/ttm_bo.h
+++ b/include/drm/ttm/ttm_bo.h
@@ -207,11 +207,9 @@ struct ttm_lru_walk_ops {
 };
 
 /**
- * struct ttm_lru_walk - Structure describing a LRU walk.
+ * struct ttm_lru_walk_arg - Common part for the variants of BO LRU walk.
  */
-struct ttm_lru_walk {
-	/** @ops: Pointer to the ops structure. */
-	const struct ttm_lru_walk_ops *ops;
+struct ttm_lru_walk_arg {
 	/** @ctx: Pointer to the struct ttm_operation_ctx. */
 	struct ttm_operation_ctx *ctx;
 	/** @ticket: The struct ww_acquire_ctx if any. */
@@ -219,6 +217,16 @@ struct ttm_lru_walk {
 	/** @trylock_only: Only use trylock for locking. */
 	bool trylock_only;
 };
+	
+/**
+ * struct ttm_lru_walk - Structure describing a LRU walk.
+ */
+struct ttm_lru_walk {
+	/** @ops: Pointer to the ops structure. */
+	const struct ttm_lru_walk_ops *ops;
+	/** @arg: Common bo LRU walk arguments. */
+	struct ttm_lru_walk_arg arg;
+};
 
 s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
 			   struct ttm_resource_manager *man, s64 target);
@@ -466,11 +474,6 @@ int ttm_bo_populate(struct ttm_buffer_object *bo,
 struct ttm_bo_lru_cursor {
 	/** @res_curs: Embedded struct ttm_resource_cursor. */
 	struct ttm_resource_cursor res_curs;
-	/**
-	 * @ctx: The struct ttm_operation_ctx used while looping.
-	 * governs the locking mode.
-	 */
-	struct ttm_operation_ctx *ctx;
 	/**
 	 * @bo: Buffer object pointer if a buffer object is refcounted,
 	 * NULL otherwise.
@@ -481,6 +484,8 @@ struct ttm_bo_lru_cursor {
 	 * unlock before the next iteration or after loop exit.
 	 */
 	bool needs_unlock;
+	/** @arg: Common BO LRU walk arguments. */
+	struct ttm_lru_walk_arg arg;
 };
 
 void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);
-- 
2.49.0


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

* [PATCH 2/3] drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor initialization
  2025-06-13 15:18 [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Thomas Hellström
  2025-06-13 15:18 ` [PATCH 1/3] drm/ttm: Use a struct for the common part of struct ttm_lru_walk and struct ttm_bo_lru_cursor Thomas Hellström
@ 2025-06-13 15:18 ` Thomas Hellström
  2025-06-16 13:15   ` Christian König
  2025-06-13 15:18 ` [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration Thomas Hellström
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Thomas Hellström @ 2025-06-13 15:18 UTC (permalink / raw)
  To: intel-xe
  Cc: Thomas Hellström, dri-devel, airlied, Matthew Brost,
	Matthew Auld, Christian König

Instead of the struct ttm_operation_ctx, Pass a struct ttm_lru_walk_arg
to enable us to easily extend the walk functionality, and to
implement ttm_lru_walk_for_evict() using the guarded LRU iteration.

Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/ttm/ttm_bo_util.c | 10 +++++-----
 drivers/gpu/drm/xe/xe_shrinker.c  |  3 ++-
 include/drm/ttm/ttm_bo.h          | 16 ++++++++--------
 3 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 600145cdeb9c..62b76abac578 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -956,11 +956,11 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
  * ttm_bo_lru_cursor_init() - Initialize a struct ttm_bo_lru_cursor
  * @curs: The ttm_bo_lru_cursor to initialize.
  * @man: The ttm resource_manager whose LRU lists to iterate over.
- * @ctx: The ttm_operation_ctx to govern the locking.
+ * @arg: The ttm_lru_walk_arg to govern the walk.
  *
  * Initialize a struct ttm_bo_lru_cursor. Currently only trylocking
  * or prelocked buffer objects are available as detailed by
- * @ctx::resv and @ctx::allow_res_evict. Ticketlocking is not
+ * @arg->ctx.resv and @arg->ctx.allow_res_evict. Ticketlocking is not
  * supported.
  *
  * Return: Pointer to @curs. The function does not fail.
@@ -968,11 +968,11 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
 struct ttm_bo_lru_cursor *
 ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
 		       struct ttm_resource_manager *man,
-		       struct ttm_operation_ctx *ctx)
+		       struct ttm_lru_walk_arg *arg)
 {
 	memset(curs, 0, sizeof(*curs));
 	ttm_resource_cursor_init(&curs->res_curs, man);
-	curs->arg.ctx = ctx;
+	curs->arg = arg;
 
 	return curs;
 }
@@ -983,7 +983,7 @@ ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *cur
 {
 	struct ttm_buffer_object *bo = res->bo;
 
-	if (!ttm_lru_walk_trylock(&curs->arg, bo, &curs->needs_unlock))
+	if (!ttm_lru_walk_trylock(curs->arg, bo, &curs->needs_unlock))
 		return NULL;
 
 	if (!ttm_bo_get_unless_zero(bo)) {
diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
index 125c836e0ee4..f8a1129da2c3 100644
--- a/drivers/gpu/drm/xe/xe_shrinker.c
+++ b/drivers/gpu/drm/xe/xe_shrinker.c
@@ -66,11 +66,12 @@ static s64 xe_shrinker_walk(struct xe_device *xe,
 		struct ttm_resource_manager *man = ttm_manager_type(&xe->ttm, mem_type);
 		struct ttm_bo_lru_cursor curs;
 		struct ttm_buffer_object *ttm_bo;
+		struct ttm_lru_walk_arg arg = {.ctx = ctx};
 
 		if (!man || !man->use_tt)
 			continue;
 
-		ttm_bo_lru_for_each_reserved_guarded(&curs, man, ctx, ttm_bo) {
+		ttm_bo_lru_for_each_reserved_guarded(&curs, man, &arg, ttm_bo) {
 			if (!ttm_bo_shrink_suitable(ttm_bo, ctx))
 				continue;
 
diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
index 4e52283e5db1..8f04fa48b332 100644
--- a/include/drm/ttm/ttm_bo.h
+++ b/include/drm/ttm/ttm_bo.h
@@ -484,8 +484,8 @@ struct ttm_bo_lru_cursor {
 	 * unlock before the next iteration or after loop exit.
 	 */
 	bool needs_unlock;
-	/** @arg: Common BO LRU walk arguments. */
-	struct ttm_lru_walk_arg arg;
+	/** @arg: Pointer to common BO LRU walk arguments. */
+	struct ttm_lru_walk_arg *arg;
 };
 
 void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);
@@ -493,7 +493,7 @@ void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);
 struct ttm_bo_lru_cursor *
 ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
 		       struct ttm_resource_manager *man,
-		       struct ttm_operation_ctx *ctx);
+		       struct ttm_lru_walk_arg *arg);
 
 struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs);
 
@@ -504,9 +504,9 @@ struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs)
  */
 DEFINE_CLASS(ttm_bo_lru_cursor, struct ttm_bo_lru_cursor *,
 	     if (_T) {ttm_bo_lru_cursor_fini(_T); },
-	     ttm_bo_lru_cursor_init(curs, man, ctx),
+	     ttm_bo_lru_cursor_init(curs, man, arg),
 	     struct ttm_bo_lru_cursor *curs, struct ttm_resource_manager *man,
-	     struct ttm_operation_ctx *ctx);
+	     struct ttm_lru_walk_arg *arg);
 static inline void *
 class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
 { return *_T; }
@@ -517,7 +517,7 @@ class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
  * resources on LRU lists.
  * @_cursor: struct ttm_bo_lru_cursor to use for the iteration.
  * @_man: The resource manager whose LRU lists to iterate over.
- * @_ctx: The struct ttm_operation_context to govern the @_bo locking.
+ * @_arg: The struct ttm_lru_walk_arg to govern the LRU walk.
  * @_bo: The struct ttm_buffer_object pointer pointing to the buffer object
  * for the current iteration.
  *
@@ -530,8 +530,8 @@ class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
  * example a return or break statement. Exiting the loop will also unlock
  * (if needed) and unreference @_bo.
  */
-#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _ctx, _bo)	\
-	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _ctx)		\
+#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg, _bo)	\
+	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _arg)		\
 		for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo);	\
 		     (_bo) = ttm_bo_lru_cursor_next(_cursor))
 
-- 
2.49.0


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

* [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration
  2025-06-13 15:18 [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Thomas Hellström
  2025-06-13 15:18 ` [PATCH 1/3] drm/ttm: Use a struct for the common part of struct ttm_lru_walk and struct ttm_bo_lru_cursor Thomas Hellström
  2025-06-13 15:18 ` [PATCH 2/3] drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor initialization Thomas Hellström
@ 2025-06-13 15:18 ` Thomas Hellström
  2025-06-13 18:39   ` kernel test robot
                     ` (2 more replies)
  2025-06-13 17:15 ` ✗ CI.checkpatch: warning for drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Patchwork
                   ` (3 subsequent siblings)
  6 siblings, 3 replies; 14+ messages in thread
From: Thomas Hellström @ 2025-06-13 15:18 UTC (permalink / raw)
  To: intel-xe
  Cc: Thomas Hellström, dri-devel, airlied, Matthew Brost,
	Matthew Auld, Christian König

To avoid duplicating the tricky bo locking implementation,
Implement ttm_lru_walk_for_evict() using the guarded bo LRU iteration.

To facilitate this, support ticketlocking from the guarded bo LRU
iteration.

Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/ttm/ttm_bo_util.c | 166 ++++++++++++------------------
 drivers/gpu/drm/xe/xe_shrinker.c  |   7 +-
 include/drm/ttm/ttm_bo.h          |   9 +-
 3 files changed, 76 insertions(+), 106 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 62b76abac578..9bc17ea1adb2 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -821,12 +821,6 @@ static int ttm_lru_walk_ticketlock(struct ttm_lru_walk_arg *arg,
 	return ret;
 }
 
-static void ttm_lru_walk_unlock(struct ttm_buffer_object *bo, bool locked)
-{
-	if (locked)
-		dma_resv_unlock(bo->base.resv);
-}
-
 /**
  * ttm_lru_walk_for_evict() - Perform a LRU list walk, with actions taken on
  * valid items.
@@ -861,64 +855,21 @@ static void ttm_lru_walk_unlock(struct ttm_buffer_object *bo, bool locked)
 s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
 			   struct ttm_resource_manager *man, s64 target)
 {
-	struct ttm_resource_cursor cursor;
-	struct ttm_resource *res;
+	struct ttm_bo_lru_cursor cursor;
+	struct ttm_buffer_object *bo;
 	s64 progress = 0;
 	s64 lret;
 
-	spin_lock(&bdev->lru_lock);
-	ttm_resource_cursor_init(&cursor, man);
-	ttm_resource_manager_for_each_res(&cursor, res) {
-		struct ttm_buffer_object *bo = res->bo;
-		bool bo_needs_unlock = false;
-		bool bo_locked = false;
-		int mem_type;
-
-		/*
-		 * Attempt a trylock before taking a reference on the bo,
-		 * since if we do it the other way around, and the trylock fails,
-		 * we need to drop the lru lock to put the bo.
-		 */
-		if (ttm_lru_walk_trylock(&walk->arg, bo, &bo_needs_unlock))
-			bo_locked = true;
-		else if (!walk->arg.ticket || walk->arg.ctx->no_wait_gpu ||
-			 walk->arg.trylock_only)
-			continue;
-
-		if (!ttm_bo_get_unless_zero(bo)) {
-			ttm_lru_walk_unlock(bo, bo_needs_unlock);
-			continue;
-		}
-
-		mem_type = res->mem_type;
-		spin_unlock(&bdev->lru_lock);
-
-		lret = 0;
-		if (!bo_locked)
-			lret = ttm_lru_walk_ticketlock(&walk->arg, bo, &bo_needs_unlock);
-
-		/*
-		 * Note that in between the release of the lru lock and the
-		 * ticketlock, the bo may have switched resource,
-		 * and also memory type, since the resource may have been
-		 * freed and allocated again with a different memory type.
-		 * In that case, just skip it.
-		 */
-		if (!lret && bo->resource && bo->resource->mem_type == mem_type)
-			lret = walk->ops->process_bo(walk, bo);
-
-		ttm_lru_walk_unlock(bo, bo_needs_unlock);
-		ttm_bo_put(bo);
+	ttm_bo_lru_for_each_reserved_guarded(&cursor, man, &walk->arg, bo) {
+		lret = walk->ops->process_bo(walk, bo);
 		if (lret == -EBUSY || lret == -EALREADY)
 			lret = 0;
 		progress = (lret < 0) ? lret : progress + lret;
-
-		spin_lock(&bdev->lru_lock);
 		if (progress < 0 || progress >= target)
 			break;
 	}
-	ttm_resource_cursor_fini(&cursor);
-	spin_unlock(&bdev->lru_lock);
+	if (IS_ERR(bo))
+		return PTR_ERR(bo);
 
 	return progress;
 }
@@ -958,10 +909,7 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
  * @man: The ttm resource_manager whose LRU lists to iterate over.
  * @arg: The ttm_lru_walk_arg to govern the walk.
  *
- * Initialize a struct ttm_bo_lru_cursor. Currently only trylocking
- * or prelocked buffer objects are available as detailed by
- * @arg->ctx.resv and @arg->ctx.allow_res_evict. Ticketlocking is not
- * supported.
+ * Initialize a struct ttm_bo_lru_cursor.
  *
  * Return: Pointer to @curs. The function does not fail.
  */
@@ -979,21 +927,65 @@ ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
 EXPORT_SYMBOL(ttm_bo_lru_cursor_init);
 
 static struct ttm_buffer_object *
-ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *curs)
+__ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs, bool first)
 {
-	struct ttm_buffer_object *bo = res->bo;
+	spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
+	struct ttm_resource *res = NULL;
+	struct ttm_buffer_object *bo;
+	struct ttm_lru_walk_arg *arg = curs->arg;
 
-	if (!ttm_lru_walk_trylock(curs->arg, bo, &curs->needs_unlock))
-		return NULL;
+	ttm_bo_lru_cursor_cleanup_bo(curs);
 
-	if (!ttm_bo_get_unless_zero(bo)) {
-		if (curs->needs_unlock)
-			dma_resv_unlock(bo->base.resv);
-		return NULL;
+	spin_lock(lru_lock);
+	for (;;) {
+		int mem_type, ret;
+		bool bo_locked = false;
+
+		if (first) {
+			res = ttm_resource_manager_first(&curs->res_curs);
+			first = false;
+		} else {
+			res = ttm_resource_manager_next(&curs->res_curs);
+		}
+		if (!res)
+			break;
+
+		bo = res->bo;
+		if (ttm_lru_walk_trylock(arg, bo, &curs->needs_unlock))
+			bo_locked = true;
+		else if (!arg->ticket || arg->ctx->no_wait_gpu || arg->trylock_only)
+			continue;
+
+		if (!ttm_bo_get_unless_zero(bo)) {
+			if (curs->needs_unlock)
+				dma_resv_unlock(bo->base.resv);
+			continue;
+		}
+
+		mem_type = res->mem_type;
+		spin_unlock(lru_lock);
+		if (!bo_locked)
+			ret = ttm_lru_walk_ticketlock(arg, bo, &curs->needs_unlock);
+		/*
+		 * Note that in between the release of the lru lock and the
+		 * ticketlock, the bo may have switched resource,
+		 * and also memory type, since the resource may have been
+		 * freed and allocated again with a different memory type.
+		 * In that case, just skip it.
+		 */
+		curs->bo = bo;
+		if (!ret && bo->resource && bo->resource->mem_type == mem_type)
+			return bo;
+
+		ttm_bo_lru_cursor_cleanup_bo(curs);
+		if (ret)
+			return ERR_PTR(ret);
+
+		spin_lock(lru_lock);
 	}
 
-	curs->bo = bo;
-	return bo;
+	spin_unlock(lru_lock);
+	return res ? bo : NULL;
 }
 
 /**
@@ -1007,25 +999,7 @@ ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *cur
  */
 struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs)
 {
-	spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
-	struct ttm_resource *res = NULL;
-	struct ttm_buffer_object *bo;
-
-	ttm_bo_lru_cursor_cleanup_bo(curs);
-
-	spin_lock(lru_lock);
-	for (;;) {
-		res = ttm_resource_manager_next(&curs->res_curs);
-		if (!res)
-			break;
-
-		bo = ttm_bo_from_res_reserved(res, curs);
-		if (bo)
-			break;
-	}
-
-	spin_unlock(lru_lock);
-	return res ? bo : NULL;
+	return __ttm_bo_lru_cursor_next(curs, false);
 }
 EXPORT_SYMBOL(ttm_bo_lru_cursor_next);
 
@@ -1039,21 +1013,7 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_next);
  */
 struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs)
 {
-	spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
-	struct ttm_buffer_object *bo;
-	struct ttm_resource *res;
-
-	spin_lock(lru_lock);
-	res = ttm_resource_manager_first(&curs->res_curs);
-	if (!res) {
-		spin_unlock(lru_lock);
-		return NULL;
-	}
-
-	bo = ttm_bo_from_res_reserved(res, curs);
-	spin_unlock(lru_lock);
-
-	return bo ? bo : ttm_bo_lru_cursor_next(curs);
+	return __ttm_bo_lru_cursor_next(curs, true);
 }
 EXPORT_SYMBOL(ttm_bo_lru_cursor_first);
 
diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
index f8a1129da2c3..1c3c04d52f55 100644
--- a/drivers/gpu/drm/xe/xe_shrinker.c
+++ b/drivers/gpu/drm/xe/xe_shrinker.c
@@ -66,7 +66,10 @@ static s64 xe_shrinker_walk(struct xe_device *xe,
 		struct ttm_resource_manager *man = ttm_manager_type(&xe->ttm, mem_type);
 		struct ttm_bo_lru_cursor curs;
 		struct ttm_buffer_object *ttm_bo;
-		struct ttm_lru_walk_arg arg = {.ctx = ctx};
+		struct ttm_lru_walk_arg arg = {
+			.ctx = ctx,
+			.trylock_only = true,
+		};
 
 		if (!man || !man->use_tt)
 			continue;
@@ -83,6 +86,8 @@ static s64 xe_shrinker_walk(struct xe_device *xe,
 			if (*scanned >= to_scan)
 				break;
 		}
+		/* Trylocks should never error, just fail. */
+		xe_assert(xe, !IS_ERR(ttm_bo));
 	}
 
 	return freed;
diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
index 8f04fa48b332..d3a85d76aaff 100644
--- a/include/drm/ttm/ttm_bo.h
+++ b/include/drm/ttm/ttm_bo.h
@@ -529,10 +529,15 @@ class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
  * up at looping termination, even if terminated prematurely by, for
  * example a return or break statement. Exiting the loop will also unlock
  * (if needed) and unreference @_bo.
+ *
+ * Return: If locking of a bo returns an error, then iteration is terminated
+ * and @_bo is set to a corresponding error pointer. It's illegal to
+ * dereference @_bo after loop exit.
  */
 #define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg, _bo)	\
 	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _arg)		\
-		for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo);	\
-		     (_bo) = ttm_bo_lru_cursor_next(_cursor))
+		for ((_bo) = ttm_bo_lru_cursor_first(_cursor);		\
+		       !IS_ERR_OR_NULL(_bo);				\
+		       (_bo) = ttm_bo_lru_cursor_next(_cursor))
 
 #endif
-- 
2.49.0


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

* ✗ CI.checkpatch: warning for drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
  2025-06-13 15:18 [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Thomas Hellström
                   ` (2 preceding siblings ...)
  2025-06-13 15:18 ` [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration Thomas Hellström
@ 2025-06-13 17:15 ` Patchwork
  2025-06-13 17:16 ` ✓ CI.KUnit: success " Patchwork
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2025-06-13 17:15 UTC (permalink / raw)
  To: Thomas Hellström; +Cc: intel-xe

== Series Details ==

Series: drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
URL   : https://patchwork.freedesktop.org/series/150242/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
f8ff75ae1d2127635239b134695774ed4045d05b
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 7ca1f80a2063b9ff68502846af167af83e39e516
Author: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Date:   Fri Jun 13 17:18:24 2025 +0200

    drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration
    
    To avoid duplicating the tricky bo locking implementation,
    Implement ttm_lru_walk_for_evict() using the guarded bo LRU iteration.
    
    To facilitate this, support ticketlocking from the guarded bo LRU
    iteration.
    
    Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
+ /mt/dim checkpatch 4d016d6e602638e0ebc3895331224e057508c07a drm-intel
62fb3ea5091c drm/ttm: Use a struct for the common part of struct ttm_lru_walk and struct ttm_bo_lru_cursor.
-:205: ERROR:TRAILING_WHITESPACE: trailing whitespace
#205: FILE: include/drm/ttm/ttm_bo.h:220:
+^I$

total: 1 errors, 0 warnings, 0 checks, 194 lines checked
3426ec02d6f5 drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor initialization
-:126: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#126: FILE: include/drm/ttm/ttm_bo.h:533:
+#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg, _bo)	\
+	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _arg)		\
 		for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo);	\
 		     (_bo) = ttm_bo_lru_cursor_next(_cursor))

BUT SEE:

   do {} while (0) advice is over-stated in a few situations:

   The more obvious case is macros, like MODULE_PARM_DESC, invoked at
   file-scope, where C disallows code (it must be in functions).  See
   $exceptions if you have one to add by name.

   More troublesome is declarative macros used at top of new scope,
   like DECLARE_PER_CPU.  These might just compile with a do-while-0
   wrapper, but would be incorrect.  Most of these are handled by
   detecting struct,union,etc declaration primitives in $exceptions.

   Theres also macros called inside an if (block), which "return" an
   expression.  These cannot do-while, and need a ({}) wrapper.

   Enjoy this qualification while we work to improve our heuristics.

-:126: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_cursor' - possible side-effects?
#126: FILE: include/drm/ttm/ttm_bo.h:533:
+#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg, _bo)	\
+	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _arg)		\
 		for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo);	\
 		     (_bo) = ttm_bo_lru_cursor_next(_cursor))

-:126: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_bo' - possible side-effects?
#126: FILE: include/drm/ttm/ttm_bo.h:533:
+#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg, _bo)	\
+	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _arg)		\
 		for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo);	\
 		     (_bo) = ttm_bo_lru_cursor_next(_cursor))

total: 1 errors, 0 warnings, 2 checks, 94 lines checked
7ca1f80a2063 drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration



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

* ✓ CI.KUnit: success for drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
  2025-06-13 15:18 [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Thomas Hellström
                   ` (3 preceding siblings ...)
  2025-06-13 17:15 ` ✗ CI.checkpatch: warning for drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Patchwork
@ 2025-06-13 17:16 ` Patchwork
  2025-06-13 18:19 ` ✓ Xe.CI.BAT: " Patchwork
  2025-06-15 14:51 ` ✓ Xe.CI.Full: " Patchwork
  6 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2025-06-13 17:16 UTC (permalink / raw)
  To: Thomas Hellström; +Cc: intel-xe

== Series Details ==

Series: drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
URL   : https://patchwork.freedesktop.org/series/150242/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[17:15:01] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:15:05] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[17:15:32] Starting KUnit Kernel (1/1)...
[17:15:32] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:15:32] ================== guc_buf (11 subtests) ===================
[17:15:32] [PASSED] test_smallest
[17:15:32] [PASSED] test_largest
[17:15:32] [PASSED] test_granular
[17:15:32] [PASSED] test_unique
[17:15:32] [PASSED] test_overlap
[17:15:32] [PASSED] test_reusable
[17:15:32] [PASSED] test_too_big
[17:15:32] [PASSED] test_flush
[17:15:32] [PASSED] test_lookup
[17:15:32] [PASSED] test_data
[17:15:32] [PASSED] test_class
[17:15:32] ===================== [PASSED] guc_buf =====================
[17:15:32] =================== guc_dbm (7 subtests) ===================
[17:15:32] [PASSED] test_empty
[17:15:32] [PASSED] test_default
[17:15:32] ======================== test_size  ========================
[17:15:32] [PASSED] 4
[17:15:32] [PASSED] 8
[17:15:32] [PASSED] 32
[17:15:32] [PASSED] 256
[17:15:32] ==================== [PASSED] test_size ====================
[17:15:32] ======================= test_reuse  ========================
[17:15:32] [PASSED] 4
[17:15:32] [PASSED] 8
[17:15:32] [PASSED] 32
[17:15:32] [PASSED] 256
[17:15:32] =================== [PASSED] test_reuse ====================
[17:15:32] =================== test_range_overlap  ====================
[17:15:32] [PASSED] 4
[17:15:32] [PASSED] 8
[17:15:32] [PASSED] 32
[17:15:32] [PASSED] 256
[17:15:32] =============== [PASSED] test_range_overlap ================
[17:15:32] =================== test_range_compact  ====================
[17:15:32] [PASSED] 4
[17:15:32] [PASSED] 8
[17:15:32] [PASSED] 32
[17:15:32] [PASSED] 256
[17:15:32] =============== [PASSED] test_range_compact ================
[17:15:32] ==================== test_range_spare  =====================
[17:15:32] [PASSED] 4
[17:15:32] [PASSED] 8
[17:15:32] [PASSED] 32
[17:15:32] [PASSED] 256
[17:15:32] ================ [PASSED] test_range_spare =================
[17:15:32] ===================== [PASSED] guc_dbm =====================
[17:15:32] =================== guc_idm (6 subtests) ===================
[17:15:32] [PASSED] bad_init
[17:15:32] [PASSED] no_init
[17:15:32] [PASSED] init_fini
[17:15:32] [PASSED] check_used
[17:15:32] [PASSED] check_quota
[17:15:32] [PASSED] check_all
[17:15:32] ===================== [PASSED] guc_idm =====================
[17:15:32] ================== no_relay (3 subtests) ===================
[17:15:32] [PASSED] xe_drops_guc2pf_if_not_ready
[17:15:32] [PASSED] xe_drops_guc2vf_if_not_ready
[17:15:32] [PASSED] xe_rejects_send_if_not_ready
[17:15:32] ==================== [PASSED] no_relay =====================
[17:15:32] ================== pf_relay (14 subtests) ==================
[17:15:32] [PASSED] pf_rejects_guc2pf_too_short
[17:15:32] [PASSED] pf_rejects_guc2pf_too_long
[17:15:32] [PASSED] pf_rejects_guc2pf_no_payload
[17:15:32] [PASSED] pf_fails_no_payload
[17:15:32] [PASSED] pf_fails_bad_origin
[17:15:32] [PASSED] pf_fails_bad_type
[17:15:32] [PASSED] pf_txn_reports_error
[17:15:32] [PASSED] pf_txn_sends_pf2guc
[17:15:32] [PASSED] pf_sends_pf2guc
[17:15:32] [SKIPPED] pf_loopback_nop
[17:15:32] [SKIPPED] pf_loopback_echo
[17:15:32] [SKIPPED] pf_loopback_fail
[17:15:32] [SKIPPED] pf_loopback_busy
[17:15:32] [SKIPPED] pf_loopback_retry
[17:15:32] ==================== [PASSED] pf_relay =====================
[17:15:32] ================== vf_relay (3 subtests) ===================
[17:15:32] [PASSED] vf_rejects_guc2vf_too_short
[17:15:32] [PASSED] vf_rejects_guc2vf_too_long
[17:15:32] [PASSED] vf_rejects_guc2vf_no_payload
[17:15:32] ==================== [PASSED] vf_relay =====================
[17:15:32] ================= pf_service (11 subtests) =================
[17:15:32] [PASSED] pf_negotiate_any
[17:15:32] [PASSED] pf_negotiate_base_match
[17:15:32] [PASSED] pf_negotiate_base_newer
[17:15:32] [PASSED] pf_negotiate_base_next
[17:15:32] [SKIPPED] pf_negotiate_base_older
[17:15:32] [PASSED] pf_negotiate_base_prev
[17:15:32] [PASSED] pf_negotiate_latest_match
[17:15:32] [PASSED] pf_negotiate_latest_newer
[17:15:32] [PASSED] pf_negotiate_latest_next
[17:15:32] [SKIPPED] pf_negotiate_latest_older
[17:15:32] [SKIPPED] pf_negotiate_latest_prev
[17:15:32] =================== [PASSED] pf_service ====================
[17:15:32] ===================== lmtt (1 subtest) =====================
[17:15:32] ======================== test_ops  =========================
[17:15:32] [PASSED] 2-level
[17:15:32] [PASSED] multi-level
[17:15:32] ==================== [PASSED] test_ops =====================
[17:15:32] ====================== [PASSED] lmtt =======================
[17:15:32] =================== xe_mocs (2 subtests) ===================
[17:15:32] ================ xe_live_mocs_kernel_kunit  ================
[17:15:32] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[17:15:32] ================ xe_live_mocs_reset_kunit  =================
[17:15:32] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[17:15:32] ==================== [SKIPPED] xe_mocs =====================
[17:15:32] ================= xe_migrate (2 subtests) ==================
[17:15:32] ================= xe_migrate_sanity_kunit  =================
[17:15:32] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[17:15:32] ================== xe_validate_ccs_kunit  ==================
[17:15:32] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[17:15:32] =================== [SKIPPED] xe_migrate ===================
[17:15:32] ================== xe_dma_buf (1 subtest) ==================
[17:15:32] ==================== xe_dma_buf_kunit  =====================
[17:15:32] ================ [SKIPPED] xe_dma_buf_kunit ================
[17:15:32] =================== [SKIPPED] xe_dma_buf ===================
[17:15:32] ================= xe_bo_shrink (1 subtest) =================
[17:15:32] =================== xe_bo_shrink_kunit  ====================
[17:15:32] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[17:15:32] ================== [SKIPPED] xe_bo_shrink ==================
[17:15:32] ==================== xe_bo (2 subtests) ====================
[17:15:32] ================== xe_ccs_migrate_kunit  ===================
[17:15:32] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[17:15:32] ==================== xe_bo_evict_kunit  ====================
[17:15:32] =============== [SKIPPED] xe_bo_evict_kunit ================
[17:15:32] ===================== [SKIPPED] xe_bo ======================
[17:15:32] ==================== args (11 subtests) ====================
[17:15:32] [PASSED] count_args_test
[17:15:32] [PASSED] call_args_example
[17:15:32] [PASSED] call_args_test
[17:15:32] [PASSED] drop_first_arg_example
[17:15:32] [PASSED] drop_first_arg_test
[17:15:32] [PASSED] first_arg_example
[17:15:32] [PASSED] first_arg_test
[17:15:32] [PASSED] last_arg_example
[17:15:32] [PASSED] last_arg_test
[17:15:32] [PASSED] pick_arg_example
[17:15:32] [PASSED] sep_comma_example
[17:15:32] ====================== [PASSED] args =======================
[17:15:32] =================== xe_pci (2 subtests) ====================
[17:15:32] [PASSED] xe_gmdid_graphics_ip
[17:15:32] [PASSED] xe_gmdid_media_ip
[17:15:32] ===================== [PASSED] xe_pci ======================
[17:15:32] =================== xe_rtp (2 subtests) ====================
[17:15:32] =============== xe_rtp_process_to_sr_tests  ================
[17:15:32] [PASSED] coalesce-same-reg
[17:15:32] [PASSED] no-match-no-add
[17:15:32] [PASSED] match-or
[17:15:32] [PASSED] match-or-xfail
[17:15:32] [PASSED] no-match-no-add-multiple-rules
[17:15:32] [PASSED] two-regs-two-entries
[17:15:32] [PASSED] clr-one-set-other
[17:15:32] [PASSED] set-field
[17:15:32] [PASSED] conflict-duplicate
[17:15:32] [PASSED] conflict-not-disjoint
stty: 'standard input': Inappropriate ioctl for device
[17:15:32] [PASSED] conflict-reg-type
[17:15:32] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[17:15:32] ================== xe_rtp_process_tests  ===================
[17:15:32] [PASSED] active1
[17:15:32] [PASSED] active2
[17:15:32] [PASSED] active-inactive
[17:15:32] [PASSED] inactive-active
[17:15:32] [PASSED] inactive-1st_or_active-inactive
[17:15:32] [PASSED] inactive-2nd_or_active-inactive
[17:15:32] [PASSED] inactive-last_or_active-inactive
[17:15:32] [PASSED] inactive-no_or_active-inactive
[17:15:32] ============== [PASSED] xe_rtp_process_tests ===============
[17:15:32] ===================== [PASSED] xe_rtp ======================
[17:15:32] ==================== xe_wa (1 subtest) =====================
[17:15:32] ======================== xe_wa_gt  =========================
[17:15:32] [PASSED] TIGERLAKE (B0)
[17:15:32] [PASSED] DG1 (A0)
[17:15:32] [PASSED] DG1 (B0)
[17:15:32] [PASSED] ALDERLAKE_S (A0)
[17:15:32] [PASSED] ALDERLAKE_S (B0)
[17:15:32] [PASSED] ALDERLAKE_S (C0)
[17:15:32] [PASSED] ALDERLAKE_S (D0)
[17:15:32] [PASSED] ALDERLAKE_P (A0)
[17:15:32] [PASSED] ALDERLAKE_P (B0)
[17:15:32] [PASSED] ALDERLAKE_P (C0)
[17:15:32] [PASSED] ALDERLAKE_S_RPLS (D0)
[17:15:32] [PASSED] ALDERLAKE_P_RPLU (E0)
[17:15:32] [PASSED] DG2_G10 (C0)
[17:15:32] [PASSED] DG2_G11 (B1)
[17:15:32] [PASSED] DG2_G12 (A1)
[17:15:32] [PASSED] METEORLAKE (g:A0, m:A0)
[17:15:32] [PASSED] METEORLAKE (g:A0, m:A0)
[17:15:32] [PASSED] METEORLAKE (g:A0, m:A0)
[17:15:32] [PASSED] LUNARLAKE (g:A0, m:A0)
[17:15:32] [PASSED] LUNARLAKE (g:B0, m:A0)
[17:15:32] [PASSED] BATTLEMAGE (g:A0, m:A1)
[17:15:32] ==================== [PASSED] xe_wa_gt =====================
[17:15:32] ====================== [PASSED] xe_wa ======================
[17:15:32] ============================================================
[17:15:32] Testing complete. Ran 133 tests: passed: 117, skipped: 16
[17:15:32] Elapsed time: 31.474s total, 4.195s configuring, 26.962s building, 0.304s running

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

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

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



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

* ✓ Xe.CI.BAT: success for drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
  2025-06-13 15:18 [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Thomas Hellström
                   ` (4 preceding siblings ...)
  2025-06-13 17:16 ` ✓ CI.KUnit: success " Patchwork
@ 2025-06-13 18:19 ` Patchwork
  2025-06-15 14:51 ` ✓ Xe.CI.Full: " Patchwork
  6 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2025-06-13 18:19 UTC (permalink / raw)
  To: Thomas Hellström; +Cc: intel-xe

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

== Series Details ==

Series: drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
URL   : https://patchwork.freedesktop.org/series/150242/
State : success

== Summary ==

CI Bug Log - changes from xe-3252-4d016d6e602638e0ebc3895331224e057508c07a_BAT -> xe-pw-150242v1_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (8 -> 8)
------------------------------

  No changes in participating hosts


Changes
-------

  No changes found


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

  * Linux: xe-3252-4d016d6e602638e0ebc3895331224e057508c07a -> xe-pw-150242v1

  IGT_8411: d5b5d2bb4f8795a98ea58376a128b74f654b7ec1 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-3252-4d016d6e602638e0ebc3895331224e057508c07a: 4d016d6e602638e0ebc3895331224e057508c07a
  xe-pw-150242v1: 150242v1

== Logs ==

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

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

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

* Re: [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration
  2025-06-13 15:18 ` [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration Thomas Hellström
@ 2025-06-13 18:39   ` kernel test robot
  2025-06-16 13:23   ` Christian König
  2025-06-18 17:43   ` Dan Carpenter
  2 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2025-06-13 18:39 UTC (permalink / raw)
  To: Thomas Hellström, intel-xe
  Cc: llvm, oe-kbuild-all, Thomas Hellström, dri-devel, airlied,
	Matthew Brost, Matthew Auld, Christian König

Hi Thomas,

kernel test robot noticed the following build warnings:

[auto build test WARNING on drm-xe/drm-xe-next]
[also build test WARNING on linus/master v6.16-rc1 next-20250613]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Thomas-Hellstr-m/drm-ttm-Use-a-struct-for-the-common-part-of-struct-ttm_lru_walk-and-struct-ttm_bo_lru_cursor/20250613-232106
base:   https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-next
patch link:    https://lore.kernel.org/r/20250613151824.178650-4-thomas.hellstrom%40linux.intel.com
patch subject: [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration
config: i386-buildonly-randconfig-005-20250613 (https://download.01.org/0day-ci/archive/20250614/202506140238.KCnSVmrU-lkp@intel.com/config)
compiler: clang version 20.1.2 (https://github.com/llvm/llvm-project 58df0ef89dd64126512e4ee27b4ac3fd8ddf6247)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250614/202506140238.KCnSVmrU-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202506140238.KCnSVmrU-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/ttm/ttm_bo_util.c:965:7: warning: variable 'ret' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
     965 |                 if (!bo_locked)
         |                     ^~~~~~~~~~
   drivers/gpu/drm/ttm/ttm_bo_util.c:975:8: note: uninitialized use occurs here
     975 |                 if (!ret && bo->resource && bo->resource->mem_type == mem_type)
         |                      ^~~
   drivers/gpu/drm/ttm/ttm_bo_util.c:965:3: note: remove the 'if' if its condition is always true
     965 |                 if (!bo_locked)
         |                 ^~~~~~~~~~~~~~~
     966 |                         ret = ttm_lru_walk_ticketlock(arg, bo, &curs->needs_unlock);
   drivers/gpu/drm/ttm/ttm_bo_util.c:939:20: note: initialize the variable 'ret' to silence this warning
     939 |                 int mem_type, ret;
         |                                  ^
         |                                   = 0
   1 warning generated.


vim +965 drivers/gpu/drm/ttm/ttm_bo_util.c

   926	
   927	static struct ttm_buffer_object *
   928	__ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs, bool first)
   929	{
   930		spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
   931		struct ttm_resource *res = NULL;
   932		struct ttm_buffer_object *bo;
   933		struct ttm_lru_walk_arg *arg = curs->arg;
   934	
   935		ttm_bo_lru_cursor_cleanup_bo(curs);
   936	
   937		spin_lock(lru_lock);
   938		for (;;) {
   939			int mem_type, ret;
   940			bool bo_locked = false;
   941	
   942			if (first) {
   943				res = ttm_resource_manager_first(&curs->res_curs);
   944				first = false;
   945			} else {
   946				res = ttm_resource_manager_next(&curs->res_curs);
   947			}
   948			if (!res)
   949				break;
   950	
   951			bo = res->bo;
   952			if (ttm_lru_walk_trylock(arg, bo, &curs->needs_unlock))
   953				bo_locked = true;
   954			else if (!arg->ticket || arg->ctx->no_wait_gpu || arg->trylock_only)
   955				continue;
   956	
   957			if (!ttm_bo_get_unless_zero(bo)) {
   958				if (curs->needs_unlock)
   959					dma_resv_unlock(bo->base.resv);
   960				continue;
   961			}
   962	
   963			mem_type = res->mem_type;
   964			spin_unlock(lru_lock);
 > 965			if (!bo_locked)
   966				ret = ttm_lru_walk_ticketlock(arg, bo, &curs->needs_unlock);
   967			/*
   968			 * Note that in between the release of the lru lock and the
   969			 * ticketlock, the bo may have switched resource,
   970			 * and also memory type, since the resource may have been
   971			 * freed and allocated again with a different memory type.
   972			 * In that case, just skip it.
   973			 */
   974			curs->bo = bo;
   975			if (!ret && bo->resource && bo->resource->mem_type == mem_type)
   976				return bo;
   977	
   978			ttm_bo_lru_cursor_cleanup_bo(curs);
   979			if (ret)
   980				return ERR_PTR(ret);
   981	
   982			spin_lock(lru_lock);
   983		}
   984	
   985		spin_unlock(lru_lock);
   986		return res ? bo : NULL;
   987	}
   988	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

* ✓ Xe.CI.Full: success for drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
  2025-06-13 15:18 [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Thomas Hellström
                   ` (5 preceding siblings ...)
  2025-06-13 18:19 ` ✓ Xe.CI.BAT: " Patchwork
@ 2025-06-15 14:51 ` Patchwork
  6 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2025-06-15 14:51 UTC (permalink / raw)
  To: Thomas Hellström; +Cc: intel-xe

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

== Series Details ==

Series: drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks
URL   : https://patchwork.freedesktop.org/series/150242/
State : success

== Summary ==

CI Bug Log - changes from xe-3252-4d016d6e602638e0ebc3895331224e057508c07a_FULL -> xe-pw-150242v1_FULL
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

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

  No changes in participating hosts

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

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

### IGT changes ###

#### Issues hit ####

  * igt@kms_big_fb@4-tiled-64bpp-rotate-90:
    - shard-dg2-set2:     NOTRUN -> [SKIP][1] ([Intel XE#316]) +1 other test skip
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_big_fb@4-tiled-64bpp-rotate-90.html

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

  * igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
    - shard-adlp:         [PASS][3] -> [DMESG-FAIL][4] ([Intel XE#4543])
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-8/igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-1/igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html

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

  * igt@kms_big_fb@y-tiled-addfb-size-overflow:
    - shard-bmg:          NOTRUN -> [SKIP][6] ([Intel XE#610])
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_big_fb@y-tiled-addfb-size-overflow.html

  * igt@kms_big_fb@yf-tiled-8bpp-rotate-270:
    - shard-dg2-set2:     NOTRUN -> [SKIP][7] ([Intel XE#1124]) +1 other test skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@kms_big_fb@yf-tiled-8bpp-rotate-270.html

  * igt@kms_bw@connected-linear-tiling-3-displays-1920x1080p:
    - shard-bmg:          NOTRUN -> [SKIP][8] ([Intel XE#2314] / [Intel XE#2894])
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_bw@connected-linear-tiling-3-displays-1920x1080p.html

  * igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][9] ([Intel XE#2191])
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p.html

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][10] ([Intel XE#2887]) +4 other tests skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs-cc.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2:
    - shard-bmg:          NOTRUN -> [SKIP][11] ([Intel XE#2652] / [Intel XE#787]) +3 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][12] ([Intel XE#3432])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@crc-sprite-planes-basic-y-tiled-ccs@pipe-c-dp-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][13] ([Intel XE#787]) +27 other tests skip
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_ccs@crc-sprite-planes-basic-y-tiled-ccs@pipe-c-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-c-hdmi-a-6:
    - shard-dg2-set2:     [PASS][14] -> [INCOMPLETE][15] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124]) +1 other test incomplete
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-c-hdmi-a-6.html
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-c-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-dp-4:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][16] ([Intel XE#3124])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [DMESG-WARN][17] ([Intel XE#1727] / [Intel XE#3113])
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-y-tiled-gen12-rc-ccs-cc:
    - shard-dg2-set2:     NOTRUN -> [SKIP][18] ([Intel XE#455] / [Intel XE#787]) +7 other tests skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_ccs@random-ccs-data-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_cdclk@mode-transition-all-outputs:
    - shard-bmg:          NOTRUN -> [SKIP][19] ([Intel XE#2724])
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_cdclk@mode-transition-all-outputs.html

  * igt@kms_cdclk@mode-transition@pipe-a-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][20] ([Intel XE#4417]) +2 other tests skip
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_cdclk@mode-transition@pipe-a-hdmi-a-1.html

  * igt@kms_chamelium_color@ctm-blue-to-red:
    - shard-bmg:          NOTRUN -> [SKIP][21] ([Intel XE#2325])
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_chamelium_color@ctm-blue-to-red.html

  * igt@kms_chamelium_hpd@dp-hpd-with-enabled-mode:
    - shard-bmg:          NOTRUN -> [SKIP][22] ([Intel XE#2252]) +3 other tests skip
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_chamelium_hpd@dp-hpd-with-enabled-mode.html

  * igt@kms_chamelium_hpd@hdmi-hpd-enable-disable-mode:
    - shard-dg2-set2:     NOTRUN -> [SKIP][23] ([Intel XE#373])
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_chamelium_hpd@hdmi-hpd-enable-disable-mode.html

  * igt@kms_content_protection@srm@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][24] ([Intel XE#1178])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_content_protection@srm@pipe-a-dp-2.html

  * igt@kms_content_protection@uevent:
    - shard-dg2-set2:     NOTRUN -> [FAIL][25] ([Intel XE#1188]) +1 other test fail
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_content_protection@uevent.html

  * igt@kms_cursor_crc@cursor-onscreen-32x32:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#2320]) +1 other test skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_cursor_crc@cursor-onscreen-32x32.html

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

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

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
    - shard-bmg:          NOTRUN -> [SKIP][30] ([Intel XE#2286])
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html

  * igt@kms_dp_link_training@non-uhbr-sst:
    - shard-bmg:          [PASS][31] -> [SKIP][32] ([Intel XE#4354])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-3/igt@kms_dp_link_training@non-uhbr-sst.html
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_dp_link_training@non-uhbr-sst.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][33] ([Intel XE#4156])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible:
    - shard-bmg:          [PASS][34] -> [SKIP][35] ([Intel XE#2316]) +2 other tests skip
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-3/igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible.html
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][36] -> [FAIL][37] ([Intel XE#301] / [Intel XE#3321])
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-436/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-hdmi-a6-dp4.html
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-464/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][38] -> [FAIL][39] ([Intel XE#301]) +15 other tests fail
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-436/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4.html
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-464/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4.html

  * igt@kms_flip@2x-wf_vblank-ts-check-interruptible:
    - shard-bmg:          NOTRUN -> [SKIP][40] ([Intel XE#2316])
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_flip@2x-wf_vblank-ts-check-interruptible.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank:
    - shard-lnl:          [PASS][41] -> [FAIL][42] ([Intel XE#3098] / [Intel XE#886])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-lnl-1/igt@kms_flip@flip-vs-absolute-wf_vblank.html
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-lnl-6/igt@kms_flip@flip-vs-absolute-wf_vblank.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank@a-edp1:
    - shard-lnl:          [PASS][43] -> [FAIL][44] ([Intel XE#3098])
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-lnl-1/igt@kms_flip@flip-vs-absolute-wf_vblank@a-edp1.html
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-lnl-6/igt@kms_flip@flip-vs-absolute-wf_vblank@a-edp1.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank@a-hdmi-a1:
    - shard-adlp:         [PASS][45] -> [FAIL][46] ([Intel XE#2882]) +3 other tests fail
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-3/igt@kms_flip@flip-vs-absolute-wf_vblank@a-hdmi-a1.html
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-4/igt@kms_flip@flip-vs-absolute-wf_vblank@a-hdmi-a1.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank@c-edp1:
    - shard-lnl:          [PASS][47] -> [FAIL][48] ([Intel XE#886]) +1 other test fail
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-lnl-1/igt@kms_flip@flip-vs-absolute-wf_vblank@c-edp1.html
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-lnl-6/igt@kms_flip@flip-vs-absolute-wf_vblank@c-edp1.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-bmg:          [PASS][49] -> [INCOMPLETE][50] ([Intel XE#2049] / [Intel XE#2597]) +1 other test incomplete
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-2/igt@kms_flip@flip-vs-suspend-interruptible.html
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-3/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_flip@flip-vs-suspend@d-hdmi-a1:
    - shard-adlp:         [PASS][51] -> [DMESG-WARN][52] ([Intel XE#2953] / [Intel XE#4173]) +1 other test dmesg-warn
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-3/igt@kms_flip@flip-vs-suspend@d-hdmi-a1.html
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-4/igt@kms_flip@flip-vs-suspend@d-hdmi-a1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode:
    - shard-adlp:         NOTRUN -> [SKIP][53] ([Intel XE#455]) +3 other tests skip
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling:
    - shard-bmg:          NOTRUN -> [SKIP][54] ([Intel XE#2293] / [Intel XE#2380]) +1 other test skip
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode:
    - shard-bmg:          NOTRUN -> [SKIP][55] ([Intel XE#2293]) +1 other test skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-plflip-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][56] ([Intel XE#651]) +9 other tests skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-plflip-blt.html

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

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][58] ([Intel XE#2312]) +4 other tests skip
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][59] ([Intel XE#2311]) +8 other tests skip
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-linear:
    - shard-dg2-set2:     NOTRUN -> [SKIP][60] ([Intel XE#653]) +8 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_frontbuffer_tracking@fbcpsr-tiling-linear.html

  * igt@kms_frontbuffer_tracking@psr-rgb565-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][61] ([Intel XE#2313]) +8 other tests skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_frontbuffer_tracking@psr-rgb565-draw-mmap-wc.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-dg2-set2:     NOTRUN -> [SKIP][62] ([Intel XE#455]) +3 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-bmg:          [PASS][63] -> [SKIP][64] ([Intel XE#1503])
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-3/igt@kms_hdr@invalid-metadata-sizes.html
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_hdr@invalid-metadata-sizes.html

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

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

  * igt@kms_plane_multiple@2x-tiling-y:
    - shard-bmg:          NOTRUN -> [SKIP][67] ([Intel XE#4596])
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-y.html

  * igt@kms_pm_dc@dc5-retention-flops:
    - shard-bmg:          NOTRUN -> [SKIP][68] ([Intel XE#3309])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_pm_dc@dc5-retention-flops.html

  * igt@kms_psr2_sf@pr-overlay-plane-update-sf-dmg-area:
    - shard-bmg:          NOTRUN -> [SKIP][69] ([Intel XE#1489]) +2 other tests skip
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_psr2_sf@pr-overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr2_su@page_flip-xrgb8888:
    - shard-dg2-set2:     NOTRUN -> [SKIP][70] ([Intel XE#1122])
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@kms_psr2_su@page_flip-xrgb8888.html

  * igt@kms_psr@fbc-psr2-primary-blt:
    - shard-bmg:          NOTRUN -> [SKIP][71] ([Intel XE#2234] / [Intel XE#2850]) +3 other tests skip
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_psr@fbc-psr2-primary-blt.html

  * igt@kms_psr@pr-sprite-plane-onoff:
    - shard-dg2-set2:     NOTRUN -> [SKIP][72] ([Intel XE#2850] / [Intel XE#929]) +1 other test skip
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@kms_psr@pr-sprite-plane-onoff.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-bmg:          NOTRUN -> [SKIP][73] ([Intel XE#2414])
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-0:
    - shard-dg2-set2:     NOTRUN -> [SKIP][74] ([Intel XE#1127])
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@kms_rotation_crc@primary-y-tiled-reflect-x-0.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-270:
    - shard-bmg:          NOTRUN -> [SKIP][75] ([Intel XE#3414] / [Intel XE#3904]) +1 other test skip
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_rotation_crc@primary-y-tiled-reflect-x-270.html

  * igt@kms_setmode@basic-clone-single-crtc:
    - shard-bmg:          NOTRUN -> [SKIP][76] ([Intel XE#1435])
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_setmode@basic-clone-single-crtc.html

  * igt@xe_ccs@suspend-resume@linear-compressed-compfmt0-system-vram01:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][77] ([Intel XE#4358]) +1 other test incomplete
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@xe_ccs@suspend-resume@linear-compressed-compfmt0-system-vram01.html

  * igt@xe_compute_preempt@compute-preempt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][78] ([Intel XE#1280] / [Intel XE#455]) +1 other test skip
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@xe_compute_preempt@compute-preempt.html

  * igt@xe_eudebug@basic-vm-bind:
    - shard-bmg:          NOTRUN -> [SKIP][79] ([Intel XE#4837]) +2 other tests skip
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@xe_eudebug@basic-vm-bind.html

  * igt@xe_eudebug@basic-vm-bind-extended-discovery:
    - shard-dg2-set2:     NOTRUN -> [SKIP][80] ([Intel XE#4837]) +3 other tests skip
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@xe_eudebug@basic-vm-bind-extended-discovery.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr:
    - shard-bmg:          NOTRUN -> [SKIP][81] ([Intel XE#2322]) +4 other tests skip
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr.html

  * igt@xe_exec_basic@twice-bindexecqueue-rebind:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][82] ([Intel XE#2594])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@xe_exec_basic@twice-bindexecqueue-rebind.html

  * igt@xe_exec_fault_mode@twice-invalid-fault:
    - shard-dg2-set2:     NOTRUN -> [SKIP][83] ([Intel XE#288]) +3 other tests skip
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@xe_exec_fault_mode@twice-invalid-fault.html

  * igt@xe_exec_system_allocator@threads-many-large-mmap-shared-remap-dontunmap-eocheck:
    - shard-dg2-set2:     NOTRUN -> [SKIP][84] ([Intel XE#4915]) +67 other tests skip
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@xe_exec_system_allocator@threads-many-large-mmap-shared-remap-dontunmap-eocheck.html

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

  * igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-new-bo-map-nomemset:
    - shard-lnl:          [PASS][86] -> [FAIL][87] ([Intel XE#4937])
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-lnl-6/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-new-bo-map-nomemset.html
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-lnl-3/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-new-bo-map-nomemset.html

  * igt@xe_oa@polling-small-buf:
    - shard-dg2-set2:     NOTRUN -> [SKIP][88] ([Intel XE#2541] / [Intel XE#3573]) +2 other tests skip
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@xe_oa@polling-small-buf.html

  * igt@xe_pm@d3cold-basic-exec:
    - shard-dg2-set2:     NOTRUN -> [SKIP][89] ([Intel XE#2284] / [Intel XE#366]) +1 other test skip
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@xe_pm@d3cold-basic-exec.html

  * igt@xe_pmu@gt-frequency:
    - shard-adlp:         NOTRUN -> [ABORT][90] ([Intel XE#5214]) +2 other tests abort
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-1/igt@xe_pmu@gt-frequency.html

  * igt@xe_pxp@pxp-termination-key-update-post-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][91] ([Intel XE#4733]) +2 other tests skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@xe_pxp@pxp-termination-key-update-post-suspend.html

  * igt@xe_sriov_flr@flr-vf1-clear:
    - shard-bmg:          NOTRUN -> [SKIP][92] ([Intel XE#3342]) +1 other test skip
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@xe_sriov_flr@flr-vf1-clear.html

  
#### Possible fixes ####

  * igt@kms_addfb_basic@bad-pitch-63:
    - shard-adlp:         [SKIP][93] ([Intel XE#4950]) -> [PASS][94] +10 other tests pass
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_addfb_basic@bad-pitch-63.html
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_addfb_basic@bad-pitch-63.html

  * igt@kms_async_flips@invalid-async-flip-atomic@pipe-b-hdmi-a-1:
    - shard-adlp:         [DMESG-WARN][95] ([Intel XE#4543]) -> [PASS][96] +1 other test pass
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_async_flips@invalid-async-flip-atomic@pipe-b-hdmi-a-1.html
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_async_flips@invalid-async-flip-atomic@pipe-b-hdmi-a-1.html

  * igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p:
    - shard-bmg:          [SKIP][97] ([Intel XE#2314] / [Intel XE#2894]) -> [PASS][98]
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
    - shard-dg2-set2:     [INCOMPLETE][99] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124]) -> [PASS][100] +1 other test pass
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [INCOMPLETE][101] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4345] / [Intel XE#4522]) -> [PASS][102]
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-hdmi-a-6.html
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-hdmi-a-6.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size:
    - shard-bmg:          [SKIP][103] ([Intel XE#2291]) -> [PASS][104] +3 other tests pass
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible:
    - shard-bmg:          [SKIP][105] ([Intel XE#2316]) -> [PASS][106] +4 other tests pass
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-2/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-dg2-set2:     [INCOMPLETE][107] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][108] +1 other test pass
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-436/igt@kms_flip@flip-vs-suspend-interruptible.html
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-1p-rte:
    - shard-adlp:         [SKIP][109] ([Intel XE#4947]) -> [PASS][110] +2 other tests pass
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_frontbuffer_tracking@fbc-1p-rte.html
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_frontbuffer_tracking@fbc-1p-rte.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt:
    - shard-dg2-set2:     [INCOMPLETE][111] ([Intel XE#4842]) -> [PASS][112]
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-433/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt.html
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-433/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_setmode@invalid-clone-single-crtc-stealing:
    - shard-bmg:          [SKIP][113] ([Intel XE#1435]) -> [PASS][114]
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_setmode@invalid-clone-single-crtc-stealing.html

  * {igt@xe_compute_preempt@compute-preempt-many-vram-evict@engine-drm_xe_engine_class_compute}:
    - shard-bmg:          [ABORT][115] ([Intel XE#3970]) -> [PASS][116] +1 other test pass
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@xe_compute_preempt@compute-preempt-many-vram-evict@engine-drm_xe_engine_class_compute.html
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-4/igt@xe_compute_preempt@compute-preempt-many-vram-evict@engine-drm_xe_engine_class_compute.html

  * igt@xe_exec_basic@many-execqueues-basic-defer-mmap:
    - shard-adlp:         [SKIP][117] ([Intel XE#4945]) -> [PASS][118] +9 other tests pass
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_exec_basic@many-execqueues-basic-defer-mmap.html
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_exec_basic@many-execqueues-basic-defer-mmap.html

  * igt@xe_exec_system_allocator@threads-many-stride-malloc-bo-unmap-nomemset:
    - shard-bmg:          [FAIL][119] -> [PASS][120]
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-7/igt@xe_exec_system_allocator@threads-many-stride-malloc-bo-unmap-nomemset.html
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-2/igt@xe_exec_system_allocator@threads-many-stride-malloc-bo-unmap-nomemset.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-large-new-bo-map-nomemset:
    - shard-lnl:          [FAIL][121] ([Intel XE#5018]) -> [PASS][122]
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-lnl-3/igt@xe_exec_system_allocator@threads-shared-vm-many-large-new-bo-map-nomemset.html
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-lnl-2/igt@xe_exec_system_allocator@threads-shared-vm-many-large-new-bo-map-nomemset.html

  * igt@xe_exec_threads@threads-mixed-fd-userptr-invalidate:
    - shard-dg2-set2:     [INCOMPLETE][123] -> [PASS][124]
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-435/igt@xe_exec_threads@threads-mixed-fd-userptr-invalidate.html
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-464/igt@xe_exec_threads@threads-mixed-fd-userptr-invalidate.html

  * igt@xe_module_load@load:
    - shard-adlp:         ([SKIP][125], [PASS][126], [PASS][127], [PASS][128], [PASS][129], [PASS][130], [PASS][131], [PASS][132], [PASS][133], [PASS][134], [PASS][135], [PASS][136], [PASS][137], [PASS][138], [PASS][139], [PASS][140], [PASS][141], [PASS][142], [PASS][143], [PASS][144], [PASS][145], [PASS][146], [PASS][147], [PASS][148], [PASS][149], [PASS][150]) ([Intel XE#378]) -> ([PASS][151], [PASS][152], [PASS][153], [PASS][154], [PASS][155], [PASS][156], [PASS][157], [PASS][158], [PASS][159], [PASS][160], [PASS][161], [PASS][162], [PASS][163], [PASS][164], [PASS][165], [PASS][166], [PASS][167], [PASS][168], [PASS][169], [PASS][170], [PASS][171], [PASS][172], [PASS][173], [PASS][174], [PASS][175])
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_module_load@load.html
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-1/igt@xe_module_load@load.html
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-9/igt@xe_module_load@load.html
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-2/igt@xe_module_load@load.html
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-9/igt@xe_module_load@load.html
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-1/igt@xe_module_load@load.html
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-9/igt@xe_module_load@load.html
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-9/igt@xe_module_load@load.html
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-3/igt@xe_module_load@load.html
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-8/igt@xe_module_load@load.html
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-8/igt@xe_module_load@load.html
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_module_load@load.html
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_module_load@load.html
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_module_load@load.html
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-8/igt@xe_module_load@load.html
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-6/igt@xe_module_load@load.html
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-6/igt@xe_module_load@load.html
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_module_load@load.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-6/igt@xe_module_load@load.html
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-2/igt@xe_module_load@load.html
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-1/igt@xe_module_load@load.html
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-2/igt@xe_module_load@load.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-2/igt@xe_module_load@load.html
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-3/igt@xe_module_load@load.html
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-3/igt@xe_module_load@load.html
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-6/igt@xe_module_load@load.html
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-2/igt@xe_module_load@load.html
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-2/igt@xe_module_load@load.html
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-2/igt@xe_module_load@load.html
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-2/igt@xe_module_load@load.html
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-3/igt@xe_module_load@load.html
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_module_load@load.html
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-4/igt@xe_module_load@load.html
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-4/igt@xe_module_load@load.html
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-6/igt@xe_module_load@load.html
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-6/igt@xe_module_load@load.html
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-8/igt@xe_module_load@load.html
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-8/igt@xe_module_load@load.html
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_module_load@load.html
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-3/igt@xe_module_load@load.html
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-8/igt@xe_module_load@load.html
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-8/igt@xe_module_load@load.html
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-3/igt@xe_module_load@load.html
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-6/igt@xe_module_load@load.html
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-6/igt@xe_module_load@load.html
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-1/igt@xe_module_load@load.html
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-1/igt@xe_module_load@load.html
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-8/igt@xe_module_load@load.html
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_module_load@load.html
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-1/igt@xe_module_load@load.html
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-4/igt@xe_module_load@load.html

  * igt@xe_pm@s2idle-basic:
    - shard-adlp:         [DMESG-WARN][176] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][177]
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-3/igt@xe_pm@s2idle-basic.html
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-4/igt@xe_pm@s2idle-basic.html

  * igt@xe_pm@s3-vm-bind-userptr:
    - shard-bmg:          [INCOMPLETE][178] ([Intel XE#569]) -> [PASS][179]
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@xe_pm@s3-vm-bind-userptr.html
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@xe_pm@s3-vm-bind-userptr.html

  * igt@xe_pmu@gt-frequency:
    - shard-dg2-set2:     [FAIL][180] ([Intel XE#4835]) -> [PASS][181] +1 other test pass
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-435/igt@xe_pmu@gt-frequency.html
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-464/igt@xe_pmu@gt-frequency.html

  
#### Warnings ####

  * igt@kms_big_fb@yf-tiled-addfb-size-overflow:
    - shard-adlp:         [SKIP][182] ([Intel XE#4947]) -> [SKIP][183] ([Intel XE#610])
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_big_fb@yf-tiled-addfb-size-overflow.html
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_big_fb@yf-tiled-addfb-size-overflow.html

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

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs:
    - shard-dg2-set2:     [INCOMPLETE][186] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4345] / [Intel XE#4522]) -> [INCOMPLETE][187] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124] / [Intel XE#4345])
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html

  * igt@kms_cdclk@mode-transition:
    - shard-adlp:         [SKIP][188] ([Intel XE#4947]) -> [SKIP][189] ([Intel XE#4417] / [Intel XE#455])
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_cdclk@mode-transition.html
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_cdclk@mode-transition.html

  * igt@kms_chamelium_hpd@dp-hpd-for-each-pipe:
    - shard-adlp:         [SKIP][190] ([Intel XE#4950]) -> [SKIP][191] ([Intel XE#373])
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_chamelium_hpd@dp-hpd-for-each-pipe.html
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_chamelium_hpd@dp-hpd-for-each-pipe.html

  * igt@kms_content_protection@srm:
    - shard-bmg:          [SKIP][192] ([Intel XE#2341]) -> [FAIL][193] ([Intel XE#1178])
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@kms_content_protection@srm.html
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_content_protection@srm.html

  * igt@kms_content_protection@uevent:
    - shard-bmg:          [FAIL][194] ([Intel XE#1188]) -> [SKIP][195] ([Intel XE#2341])
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-3/igt@kms_content_protection@uevent.html
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_content_protection@uevent.html

  * igt@kms_flip@2x-blocking-wf_vblank:
    - shard-bmg:          [FAIL][196] ([Intel XE#2882]) -> [SKIP][197] ([Intel XE#2316])
   [196]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-3/igt@kms_flip@2x-blocking-wf_vblank.html
   [197]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_flip@2x-blocking-wf_vblank.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling:
    - shard-adlp:         [SKIP][198] ([Intel XE#2351] / [Intel XE#4947]) -> [SKIP][199] ([Intel XE#455])
   [198]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html
   [199]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling:
    - shard-adlp:         [SKIP][200] ([Intel XE#4947]) -> [SKIP][201] ([Intel XE#455]) +1 other test skip
   [200]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling.html
   [201]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling.html

  * igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw:
    - shard-bmg:          [SKIP][202] ([Intel XE#2311]) -> [SKIP][203] ([Intel XE#2312]) +10 other tests skip
   [202]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw.html
   [203]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][204] ([Intel XE#4141]) -> [SKIP][205] ([Intel XE#2312]) +4 other tests skip
   [204]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html
   [205]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render:
    - shard-bmg:          [SKIP][206] ([Intel XE#2312]) -> [SKIP][207] ([Intel XE#4141]) +2 other tests skip
   [206]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render.html
   [207]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-blt:
    - shard-adlp:         [SKIP][208] ([Intel XE#2351] / [Intel XE#4947]) -> [SKIP][209] ([Intel XE#651])
   [208]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-blt.html
   [209]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-blt:
    - shard-bmg:          [SKIP][210] ([Intel XE#2312]) -> [SKIP][211] ([Intel XE#2311]) +6 other tests skip
   [210]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-blt.html
   [211]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render:
    - shard-bmg:          [SKIP][212] ([Intel XE#2313]) -> [SKIP][213] ([Intel XE#2312]) +11 other tests skip
   [212]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html
   [213]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc:
    - shard-adlp:         [SKIP][214] ([Intel XE#4947]) -> [SKIP][215] ([Intel XE#656]) +2 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc.html
   [215]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-blt:
    - shard-adlp:         [SKIP][216] ([Intel XE#4947]) -> [SKIP][217] ([Intel XE#653]) +1 other test skip
   [216]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-blt.html
   [217]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][218] ([Intel XE#2312]) -> [SKIP][219] ([Intel XE#2313]) +7 other tests skip
   [218]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [219]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-bmg-2/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_plane_scaling@intel-max-src-size:
    - shard-adlp:         [SKIP][220] ([Intel XE#4950]) -> [SKIP][221] ([Intel XE#455]) +1 other test skip
   [220]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_plane_scaling@intel-max-src-size.html
   [221]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_plane_scaling@intel-max-src-size.html

  * igt@kms_psr@pr-cursor-render:
    - shard-adlp:         [SKIP][222] ([Intel XE#4947]) -> [SKIP][223] ([Intel XE#2850] / [Intel XE#929]) +1 other test skip
   [222]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_psr@pr-cursor-render.html
   [223]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_psr@pr-cursor-render.html

  * igt@kms_rotation_crc@primary-4-tiled-reflect-x-180:
    - shard-adlp:         [SKIP][224] ([Intel XE#4950]) -> [SKIP][225] ([Intel XE#1127])
   [224]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@kms_rotation_crc@primary-4-tiled-reflect-x-180.html
   [225]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@kms_rotation_crc@primary-4-tiled-reflect-x-180.html

  * igt@xe_ccs@suspend-resume:
    - shard-adlp:         [SKIP][226] ([Intel XE#4945]) -> [SKIP][227] ([Intel XE#455] / [Intel XE#488])
   [226]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_ccs@suspend-resume.html
   [227]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_ccs@suspend-resume.html

  * igt@xe_evict@evict-large-cm:
    - shard-adlp:         [SKIP][228] ([Intel XE#4945]) -> [SKIP][229] ([Intel XE#261] / [Intel XE#688])
   [228]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_evict@evict-large-cm.html
   [229]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_evict@evict-large-cm.html

  * igt@xe_exec_fault_mode@many-bindexecqueue-rebind:
    - shard-adlp:         [SKIP][230] ([Intel XE#4945]) -> [SKIP][231] ([Intel XE#288]) +1 other test skip
   [230]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_exec_fault_mode@many-bindexecqueue-rebind.html
   [231]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_exec_fault_mode@many-bindexecqueue-rebind.html

  * igt@xe_exec_system_allocator@many-large-execqueues-mmap-remap-dontunmap-eocheck:
    - shard-adlp:         [SKIP][232] ([Intel XE#4945]) -> [SKIP][233] ([Intel XE#4915]) +30 other tests skip
   [232]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_exec_system_allocator@many-large-execqueues-mmap-remap-dontunmap-eocheck.html
   [233]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_exec_system_allocator@many-large-execqueues-mmap-remap-dontunmap-eocheck.html

  * igt@xe_oa@syncs-ufence-wait-cfg:
    - shard-adlp:         [SKIP][234] ([Intel XE#4945]) -> [SKIP][235] ([Intel XE#2541] / [Intel XE#3573] / [Intel XE#4501])
   [234]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_oa@syncs-ufence-wait-cfg.html
   [235]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_oa@syncs-ufence-wait-cfg.html

  * igt@xe_pm@d3cold-mmap-vram:
    - shard-adlp:         [SKIP][236] ([Intel XE#4945]) -> [SKIP][237] ([Intel XE#2284] / [Intel XE#366])
   [236]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_pm@d3cold-mmap-vram.html
   [237]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_pm@d3cold-mmap-vram.html

  * igt@xe_pm@s4-vm-bind-unbind-all:
    - shard-adlp:         [SKIP][238] ([Intel XE#4945]) -> [ABORT][239] ([Intel XE#1794])
   [238]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_pm@s4-vm-bind-unbind-all.html
   [239]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_pm@s4-vm-bind-unbind-all.html

  * igt@xe_pmu@engine-activity-all-load-idle:
    - shard-adlp:         [DMESG-WARN][240] ([Intel XE#5214]) -> [ABORT][241] ([Intel XE#5214]) +4 other tests abort
   [240]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-9/igt@xe_pmu@engine-activity-all-load-idle.html
   [241]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-6/igt@xe_pmu@engine-activity-all-load-idle.html

  * igt@xe_pmu@engine-activity-single-load-idle:
    - shard-adlp:         [ABORT][242] ([Intel XE#5214]) -> [DMESG-WARN][243] ([Intel XE#5214]) +1 other test dmesg-warn
   [242]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_pmu@engine-activity-single-load-idle.html
   [243]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-6/igt@xe_pmu@engine-activity-single-load-idle.html

  * igt@xe_query@multigpu-query-gt-list:
    - shard-adlp:         [SKIP][244] ([Intel XE#4945]) -> [SKIP][245] ([Intel XE#944])
   [244]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3252-4d016d6e602638e0ebc3895331224e057508c07a/shard-adlp-4/igt@xe_query@multigpu-query-gt-list.html
   [245]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-150242v1/shard-adlp-9/igt@xe_query@multigpu-query-gt-list.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [Intel XE#1122]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1122
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1127]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1127
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1188]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1188
  [Intel XE#1280]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1280
  [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
  [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#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1794]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1794
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [Intel XE#2286]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2286
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2293
  [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#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
  [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#2351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2351
  [Intel XE#2380]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2380
  [Intel XE#2414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2414
  [Intel XE#2541]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2541
  [Intel XE#2594]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2594
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#261]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/261
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2705
  [Intel XE#2724]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2724
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2882]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2882
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
  [Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
  [Intel XE#2925]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2925
  [Intel XE#2927]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2927
  [Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#3124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3124
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#3309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3309
  [Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
  [Intel XE#3342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3342
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#3970]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3970
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4156]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4156
  [Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
  [Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
  [Intel XE#4358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4358
  [Intel XE#4417]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4417
  [Intel XE#4501]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4501
  [Intel XE#4522]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4522
  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4835]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4835
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#4842]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4842
  [Intel XE#488]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/488
  [Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
  [Intel XE#4937]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4937
  [Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
  [Intel XE#4945]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4945
  [Intel XE#4947]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4947
  [Intel XE#4950]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4950
  [Intel XE#5018]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5018
  [Intel XE#5172]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5172
  [Intel XE#5214]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5214
  [Intel XE#569]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/569
  [Intel XE#610]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/610
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/886
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


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

  * Linux: xe-3252-4d016d6e602638e0ebc3895331224e057508c07a -> xe-pw-150242v1

  IGT_8411: d5b5d2bb4f8795a98ea58376a128b74f654b7ec1 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-3252-4d016d6e602638e0ebc3895331224e057508c07a: 4d016d6e602638e0ebc3895331224e057508c07a
  xe-pw-150242v1: 150242v1

== Logs ==

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

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

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

* Re: [PATCH 1/3] drm/ttm: Use a struct for the common part of struct ttm_lru_walk and struct ttm_bo_lru_cursor.
  2025-06-13 15:18 ` [PATCH 1/3] drm/ttm: Use a struct for the common part of struct ttm_lru_walk and struct ttm_bo_lru_cursor Thomas Hellström
@ 2025-06-16 13:04   ` Christian König
  0 siblings, 0 replies; 14+ messages in thread
From: Christian König @ 2025-06-16 13:04 UTC (permalink / raw)
  To: Thomas Hellström, intel-xe
  Cc: dri-devel, airlied, Matthew Brost, Matthew Auld

On 6/13/25 17:18, Thomas Hellström wrote:
> Let the locking functions take the new struct ttm_lru_walk_arg
> as argument in order for them to be easily used from both
> types of walk.
> 
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>

We could even clean that up further I think, but for now Reviewed-by: Christian König <christian.koenig@amd.com>

Regards,
Christian.

> ---
>  drivers/gpu/drm/ttm/ttm_bo.c      | 24 ++++++++++++++----------
>  drivers/gpu/drm/ttm/ttm_bo_util.c | 26 ++++++++++++++------------
>  include/drm/ttm/ttm_bo.h          | 23 ++++++++++++++---------
>  3 files changed, 42 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 0f874f1e2526..eca486dff976 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -525,11 +525,11 @@ static s64 ttm_bo_evict_cb(struct ttm_lru_walk *walk, struct ttm_buffer_object *
>  		return 0;
>  
>  	if (bo->deleted) {
> -		lret = ttm_bo_wait_ctx(bo, walk->ctx);
> +		lret = ttm_bo_wait_ctx(bo, walk->arg.ctx);
>  		if (!lret)
>  			ttm_bo_cleanup_memtype_use(bo);
>  	} else {
> -		lret = ttm_bo_evict(bo, walk->ctx);
> +		lret = ttm_bo_evict(bo, walk->arg.ctx);
>  	}
>  
>  	if (lret)
> @@ -565,8 +565,10 @@ static int ttm_bo_evict_alloc(struct ttm_device *bdev,
>  	struct ttm_bo_evict_walk evict_walk = {
>  		.walk = {
>  			.ops = &ttm_evict_walk_ops,
> -			.ctx = ctx,
> -			.ticket = ticket,
> +			.arg = {
> +				.ctx = ctx,
> +				.ticket = ticket,
> +			}
>  		},
>  		.place = place,
>  		.evictor = evictor,
> @@ -575,7 +577,7 @@ static int ttm_bo_evict_alloc(struct ttm_device *bdev,
>  	};
>  	s64 lret;
>  
> -	evict_walk.walk.trylock_only = true;
> +	evict_walk.walk.arg.trylock_only = true;
>  	lret = ttm_lru_walk_for_evict(&evict_walk.walk, bdev, man, 1);
>  
>  	/* One more attempt if we hit low limit? */
> @@ -589,12 +591,12 @@ static int ttm_bo_evict_alloc(struct ttm_device *bdev,
>  	/* Reset low limit */
>  	evict_walk.try_low = evict_walk.hit_low = false;
>  	/* If ticket-locking, repeat while making progress. */
> -	evict_walk.walk.trylock_only = false;
> +	evict_walk.walk.arg.trylock_only = false;
>  
>  retry:
>  	do {
>  		/* The walk may clear the evict_walk.walk.ticket field */
> -		evict_walk.walk.ticket = ticket;
> +		evict_walk.walk.arg.ticket = ticket;
>  		evict_walk.evicted = 0;
>  		lret = ttm_lru_walk_for_evict(&evict_walk.walk, bdev, man, 1);
>  	} while (!lret && evict_walk.evicted);
> @@ -1105,7 +1107,7 @@ ttm_bo_swapout_cb(struct ttm_lru_walk *walk, struct ttm_buffer_object *bo)
>  	struct ttm_place place = {.mem_type = bo->resource->mem_type};
>  	struct ttm_bo_swapout_walk *swapout_walk =
>  		container_of(walk, typeof(*swapout_walk), walk);
> -	struct ttm_operation_ctx *ctx = walk->ctx;
> +	struct ttm_operation_ctx *ctx = walk->arg.ctx;
>  	s64 ret;
>  
>  	/*
> @@ -1216,8 +1218,10 @@ s64 ttm_bo_swapout(struct ttm_device *bdev, struct ttm_operation_ctx *ctx,
>  	struct ttm_bo_swapout_walk swapout_walk = {
>  		.walk = {
>  			.ops = &ttm_swap_ops,
> -			.ctx = ctx,
> -			.trylock_only = true,
> +			.arg = {
> +				.ctx = ctx,
> +				.trylock_only = true,
> +			},
>  		},
>  		.gfp_flags = gfp_flags,
>  	};
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index b78365dc1fed..600145cdeb9c 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -771,10 +771,12 @@ int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
>  	return ret;
>  }
>  
> -static bool ttm_lru_walk_trylock(struct ttm_operation_ctx *ctx,
> +static bool ttm_lru_walk_trylock(struct ttm_lru_walk_arg *arg,
>  				 struct ttm_buffer_object *bo,
>  				 bool *needs_unlock)
>  {
> +	struct ttm_operation_ctx *ctx = arg->ctx;
> +
>  	*needs_unlock = false;
>  
>  	if (dma_resv_trylock(bo->base.resv)) {
> @@ -790,17 +792,17 @@ static bool ttm_lru_walk_trylock(struct ttm_operation_ctx *ctx,
>  	return false;
>  }
>  
> -static int ttm_lru_walk_ticketlock(struct ttm_lru_walk *walk,
> +static int ttm_lru_walk_ticketlock(struct ttm_lru_walk_arg *arg,
>  				   struct ttm_buffer_object *bo,
>  				   bool *needs_unlock)
>  {
>  	struct dma_resv *resv = bo->base.resv;
>  	int ret;
>  
> -	if (walk->ctx->interruptible)
> -		ret = dma_resv_lock_interruptible(resv, walk->ticket);
> +	if (arg->ctx->interruptible)
> +		ret = dma_resv_lock_interruptible(resv, arg->ticket);
>  	else
> -		ret = dma_resv_lock(resv, walk->ticket);
> +		ret = dma_resv_lock(resv, arg->ticket);
>  
>  	if (!ret) {
>  		*needs_unlock = true;
> @@ -810,7 +812,7 @@ static int ttm_lru_walk_ticketlock(struct ttm_lru_walk *walk,
>  		 * after waiting for the ticketlock, revert back to
>  		 * trylocking for this walk.
>  		 */
> -		walk->ticket = NULL;
> +		arg->ticket = NULL;
>  	} else if (ret == -EDEADLK) {
>  		/* Caller needs to exit the ww transaction. */
>  		ret = -ENOSPC;
> @@ -877,10 +879,10 @@ s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
>  		 * since if we do it the other way around, and the trylock fails,
>  		 * we need to drop the lru lock to put the bo.
>  		 */
> -		if (ttm_lru_walk_trylock(walk->ctx, bo, &bo_needs_unlock))
> +		if (ttm_lru_walk_trylock(&walk->arg, bo, &bo_needs_unlock))
>  			bo_locked = true;
> -		else if (!walk->ticket || walk->ctx->no_wait_gpu ||
> -			 walk->trylock_only)
> +		else if (!walk->arg.ticket || walk->arg.ctx->no_wait_gpu ||
> +			 walk->arg.trylock_only)
>  			continue;
>  
>  		if (!ttm_bo_get_unless_zero(bo)) {
> @@ -893,7 +895,7 @@ s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
>  
>  		lret = 0;
>  		if (!bo_locked)
> -			lret = ttm_lru_walk_ticketlock(walk, bo, &bo_needs_unlock);
> +			lret = ttm_lru_walk_ticketlock(&walk->arg, bo, &bo_needs_unlock);
>  
>  		/*
>  		 * Note that in between the release of the lru lock and the
> @@ -970,7 +972,7 @@ ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
>  {
>  	memset(curs, 0, sizeof(*curs));
>  	ttm_resource_cursor_init(&curs->res_curs, man);
> -	curs->ctx = ctx;
> +	curs->arg.ctx = ctx;
>  
>  	return curs;
>  }
> @@ -981,7 +983,7 @@ ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *cur
>  {
>  	struct ttm_buffer_object *bo = res->bo;
>  
> -	if (!ttm_lru_walk_trylock(curs->ctx, bo, &curs->needs_unlock))
> +	if (!ttm_lru_walk_trylock(&curs->arg, bo, &curs->needs_unlock))
>  		return NULL;
>  
>  	if (!ttm_bo_get_unless_zero(bo)) {
> diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
> index 8ad6e2713625..4e52283e5db1 100644
> --- a/include/drm/ttm/ttm_bo.h
> +++ b/include/drm/ttm/ttm_bo.h
> @@ -207,11 +207,9 @@ struct ttm_lru_walk_ops {
>  };
>  
>  /**
> - * struct ttm_lru_walk - Structure describing a LRU walk.
> + * struct ttm_lru_walk_arg - Common part for the variants of BO LRU walk.
>   */
> -struct ttm_lru_walk {
> -	/** @ops: Pointer to the ops structure. */
> -	const struct ttm_lru_walk_ops *ops;
> +struct ttm_lru_walk_arg {
>  	/** @ctx: Pointer to the struct ttm_operation_ctx. */
>  	struct ttm_operation_ctx *ctx;
>  	/** @ticket: The struct ww_acquire_ctx if any. */
> @@ -219,6 +217,16 @@ struct ttm_lru_walk {
>  	/** @trylock_only: Only use trylock for locking. */
>  	bool trylock_only;
>  };
> +	
> +/**
> + * struct ttm_lru_walk - Structure describing a LRU walk.
> + */
> +struct ttm_lru_walk {
> +	/** @ops: Pointer to the ops structure. */
> +	const struct ttm_lru_walk_ops *ops;
> +	/** @arg: Common bo LRU walk arguments. */
> +	struct ttm_lru_walk_arg arg;
> +};
>  
>  s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
>  			   struct ttm_resource_manager *man, s64 target);
> @@ -466,11 +474,6 @@ int ttm_bo_populate(struct ttm_buffer_object *bo,
>  struct ttm_bo_lru_cursor {
>  	/** @res_curs: Embedded struct ttm_resource_cursor. */
>  	struct ttm_resource_cursor res_curs;
> -	/**
> -	 * @ctx: The struct ttm_operation_ctx used while looping.
> -	 * governs the locking mode.
> -	 */
> -	struct ttm_operation_ctx *ctx;
>  	/**
>  	 * @bo: Buffer object pointer if a buffer object is refcounted,
>  	 * NULL otherwise.
> @@ -481,6 +484,8 @@ struct ttm_bo_lru_cursor {
>  	 * unlock before the next iteration or after loop exit.
>  	 */
>  	bool needs_unlock;
> +	/** @arg: Common BO LRU walk arguments. */
> +	struct ttm_lru_walk_arg arg;
>  };
>  
>  void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);


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

* Re: [PATCH 2/3] drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor initialization
  2025-06-13 15:18 ` [PATCH 2/3] drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor initialization Thomas Hellström
@ 2025-06-16 13:15   ` Christian König
  0 siblings, 0 replies; 14+ messages in thread
From: Christian König @ 2025-06-16 13:15 UTC (permalink / raw)
  To: Thomas Hellström, intel-xe
  Cc: dri-devel, airlied, Matthew Brost, Matthew Auld

On 6/13/25 17:18, Thomas Hellström wrote:
> Instead of the struct ttm_operation_ctx, Pass a struct ttm_lru_walk_arg
> to enable us to easily extend the walk functionality, and to
> implement ttm_lru_walk_for_evict() using the guarded LRU iteration.
> 
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>

Reviewed-by: Christian König <christian.koenig@amd.com>

> ---
>  drivers/gpu/drm/ttm/ttm_bo_util.c | 10 +++++-----
>  drivers/gpu/drm/xe/xe_shrinker.c  |  3 ++-
>  include/drm/ttm/ttm_bo.h          | 16 ++++++++--------
>  3 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 600145cdeb9c..62b76abac578 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -956,11 +956,11 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
>   * ttm_bo_lru_cursor_init() - Initialize a struct ttm_bo_lru_cursor
>   * @curs: The ttm_bo_lru_cursor to initialize.
>   * @man: The ttm resource_manager whose LRU lists to iterate over.
> - * @ctx: The ttm_operation_ctx to govern the locking.
> + * @arg: The ttm_lru_walk_arg to govern the walk.
>   *
>   * Initialize a struct ttm_bo_lru_cursor. Currently only trylocking
>   * or prelocked buffer objects are available as detailed by
> - * @ctx::resv and @ctx::allow_res_evict. Ticketlocking is not
> + * @arg->ctx.resv and @arg->ctx.allow_res_evict. Ticketlocking is not
>   * supported.
>   *
>   * Return: Pointer to @curs. The function does not fail.
> @@ -968,11 +968,11 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
>  struct ttm_bo_lru_cursor *
>  ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
>  		       struct ttm_resource_manager *man,
> -		       struct ttm_operation_ctx *ctx)
> +		       struct ttm_lru_walk_arg *arg)
>  {
>  	memset(curs, 0, sizeof(*curs));
>  	ttm_resource_cursor_init(&curs->res_curs, man);
> -	curs->arg.ctx = ctx;
> +	curs->arg = arg;
>  
>  	return curs;
>  }
> @@ -983,7 +983,7 @@ ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *cur
>  {
>  	struct ttm_buffer_object *bo = res->bo;
>  
> -	if (!ttm_lru_walk_trylock(&curs->arg, bo, &curs->needs_unlock))
> +	if (!ttm_lru_walk_trylock(curs->arg, bo, &curs->needs_unlock))
>  		return NULL;
>  
>  	if (!ttm_bo_get_unless_zero(bo)) {
> diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
> index 125c836e0ee4..f8a1129da2c3 100644
> --- a/drivers/gpu/drm/xe/xe_shrinker.c
> +++ b/drivers/gpu/drm/xe/xe_shrinker.c
> @@ -66,11 +66,12 @@ static s64 xe_shrinker_walk(struct xe_device *xe,
>  		struct ttm_resource_manager *man = ttm_manager_type(&xe->ttm, mem_type);
>  		struct ttm_bo_lru_cursor curs;
>  		struct ttm_buffer_object *ttm_bo;
> +		struct ttm_lru_walk_arg arg = {.ctx = ctx};
>  
>  		if (!man || !man->use_tt)
>  			continue;
>  
> -		ttm_bo_lru_for_each_reserved_guarded(&curs, man, ctx, ttm_bo) {
> +		ttm_bo_lru_for_each_reserved_guarded(&curs, man, &arg, ttm_bo) {
>  			if (!ttm_bo_shrink_suitable(ttm_bo, ctx))
>  				continue;
>  
> diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
> index 4e52283e5db1..8f04fa48b332 100644
> --- a/include/drm/ttm/ttm_bo.h
> +++ b/include/drm/ttm/ttm_bo.h
> @@ -484,8 +484,8 @@ struct ttm_bo_lru_cursor {
>  	 * unlock before the next iteration or after loop exit.
>  	 */
>  	bool needs_unlock;
> -	/** @arg: Common BO LRU walk arguments. */
> -	struct ttm_lru_walk_arg arg;
> +	/** @arg: Pointer to common BO LRU walk arguments. */
> +	struct ttm_lru_walk_arg *arg;
>  };
>  
>  void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);
> @@ -493,7 +493,7 @@ void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);
>  struct ttm_bo_lru_cursor *
>  ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
>  		       struct ttm_resource_manager *man,
> -		       struct ttm_operation_ctx *ctx);
> +		       struct ttm_lru_walk_arg *arg);
>  
>  struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs);
>  
> @@ -504,9 +504,9 @@ struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs)
>   */
>  DEFINE_CLASS(ttm_bo_lru_cursor, struct ttm_bo_lru_cursor *,
>  	     if (_T) {ttm_bo_lru_cursor_fini(_T); },
> -	     ttm_bo_lru_cursor_init(curs, man, ctx),
> +	     ttm_bo_lru_cursor_init(curs, man, arg),
>  	     struct ttm_bo_lru_cursor *curs, struct ttm_resource_manager *man,
> -	     struct ttm_operation_ctx *ctx);
> +	     struct ttm_lru_walk_arg *arg);
>  static inline void *
>  class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
>  { return *_T; }
> @@ -517,7 +517,7 @@ class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
>   * resources on LRU lists.
>   * @_cursor: struct ttm_bo_lru_cursor to use for the iteration.
>   * @_man: The resource manager whose LRU lists to iterate over.
> - * @_ctx: The struct ttm_operation_context to govern the @_bo locking.
> + * @_arg: The struct ttm_lru_walk_arg to govern the LRU walk.
>   * @_bo: The struct ttm_buffer_object pointer pointing to the buffer object
>   * for the current iteration.
>   *
> @@ -530,8 +530,8 @@ class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
>   * example a return or break statement. Exiting the loop will also unlock
>   * (if needed) and unreference @_bo.
>   */
> -#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _ctx, _bo)	\
> -	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _ctx)		\
> +#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg, _bo)	\
> +	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _arg)		\
>  		for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo);	\
>  		     (_bo) = ttm_bo_lru_cursor_next(_cursor))
>  


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

* Re: [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration
  2025-06-13 15:18 ` [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration Thomas Hellström
  2025-06-13 18:39   ` kernel test robot
@ 2025-06-16 13:23   ` Christian König
  2025-06-16 15:29     ` Thomas Hellström
  2025-06-18 17:43   ` Dan Carpenter
  2 siblings, 1 reply; 14+ messages in thread
From: Christian König @ 2025-06-16 13:23 UTC (permalink / raw)
  To: Thomas Hellström, intel-xe
  Cc: dri-devel, airlied, Matthew Brost, Matthew Auld

On 6/13/25 17:18, Thomas Hellström wrote:
> To avoid duplicating the tricky bo locking implementation,
> Implement ttm_lru_walk_for_evict() using the guarded bo LRU iteration.
> 
> To facilitate this, support ticketlocking from the guarded bo LRU
> iteration.

That looks mostly identical to a patch I have in my drm_exec branch.

A few questions below.

> 
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> ---
>  drivers/gpu/drm/ttm/ttm_bo_util.c | 166 ++++++++++++------------------
>  drivers/gpu/drm/xe/xe_shrinker.c  |   7 +-
>  include/drm/ttm/ttm_bo.h          |   9 +-
>  3 files changed, 76 insertions(+), 106 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 62b76abac578..9bc17ea1adb2 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -821,12 +821,6 @@ static int ttm_lru_walk_ticketlock(struct ttm_lru_walk_arg *arg,
>  	return ret;
>  }
>  
> -static void ttm_lru_walk_unlock(struct ttm_buffer_object *bo, bool locked)
> -{
> -	if (locked)
> -		dma_resv_unlock(bo->base.resv);
> -}
> -
>  /**
>   * ttm_lru_walk_for_evict() - Perform a LRU list walk, with actions taken on
>   * valid items.
> @@ -861,64 +855,21 @@ static void ttm_lru_walk_unlock(struct ttm_buffer_object *bo, bool locked)
>  s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
>  			   struct ttm_resource_manager *man, s64 target)
>  {
> -	struct ttm_resource_cursor cursor;
> -	struct ttm_resource *res;
> +	struct ttm_bo_lru_cursor cursor;
> +	struct ttm_buffer_object *bo;
>  	s64 progress = 0;
>  	s64 lret;
>  
> -	spin_lock(&bdev->lru_lock);
> -	ttm_resource_cursor_init(&cursor, man);
> -	ttm_resource_manager_for_each_res(&cursor, res) {
> -		struct ttm_buffer_object *bo = res->bo;
> -		bool bo_needs_unlock = false;
> -		bool bo_locked = false;
> -		int mem_type;
> -
> -		/*
> -		 * Attempt a trylock before taking a reference on the bo,
> -		 * since if we do it the other way around, and the trylock fails,
> -		 * we need to drop the lru lock to put the bo.
> -		 */
> -		if (ttm_lru_walk_trylock(&walk->arg, bo, &bo_needs_unlock))
> -			bo_locked = true;
> -		else if (!walk->arg.ticket || walk->arg.ctx->no_wait_gpu ||
> -			 walk->arg.trylock_only)
> -			continue;
> -
> -		if (!ttm_bo_get_unless_zero(bo)) {
> -			ttm_lru_walk_unlock(bo, bo_needs_unlock);
> -			continue;
> -		}
> -
> -		mem_type = res->mem_type;
> -		spin_unlock(&bdev->lru_lock);
> -
> -		lret = 0;
> -		if (!bo_locked)
> -			lret = ttm_lru_walk_ticketlock(&walk->arg, bo, &bo_needs_unlock);
> -
> -		/*
> -		 * Note that in between the release of the lru lock and the
> -		 * ticketlock, the bo may have switched resource,
> -		 * and also memory type, since the resource may have been
> -		 * freed and allocated again with a different memory type.
> -		 * In that case, just skip it.
> -		 */
> -		if (!lret && bo->resource && bo->resource->mem_type == mem_type)
> -			lret = walk->ops->process_bo(walk, bo);
> -
> -		ttm_lru_walk_unlock(bo, bo_needs_unlock);
> -		ttm_bo_put(bo);
> +	ttm_bo_lru_for_each_reserved_guarded(&cursor, man, &walk->arg, bo) {
> +		lret = walk->ops->process_bo(walk, bo);
>  		if (lret == -EBUSY || lret == -EALREADY)
>  			lret = 0;
>  		progress = (lret < 0) ? lret : progress + lret;
> -
> -		spin_lock(&bdev->lru_lock);
>  		if (progress < 0 || progress >= target)
>  			break;
>  	}
> -	ttm_resource_cursor_fini(&cursor);
> -	spin_unlock(&bdev->lru_lock);
> +	if (IS_ERR(bo))
> +		return PTR_ERR(bo);
>  
>  	return progress;
>  }
> @@ -958,10 +909,7 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
>   * @man: The ttm resource_manager whose LRU lists to iterate over.
>   * @arg: The ttm_lru_walk_arg to govern the walk.
>   *
> - * Initialize a struct ttm_bo_lru_cursor. Currently only trylocking
> - * or prelocked buffer objects are available as detailed by
> - * @arg->ctx.resv and @arg->ctx.allow_res_evict. Ticketlocking is not
> - * supported.
> + * Initialize a struct ttm_bo_lru_cursor.
>   *
>   * Return: Pointer to @curs. The function does not fail.
>   */
> @@ -979,21 +927,65 @@ ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
>  EXPORT_SYMBOL(ttm_bo_lru_cursor_init);
>  
>  static struct ttm_buffer_object *
> -ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *curs)
> +__ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs, bool first)

Giving first as bool parameter here looks really ugly. Isn't there any other way to do this?

>  {
> -	struct ttm_buffer_object *bo = res->bo;
> +	spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
> +	struct ttm_resource *res = NULL;
> +	struct ttm_buffer_object *bo;
> +	struct ttm_lru_walk_arg *arg = curs->arg;
>  
> -	if (!ttm_lru_walk_trylock(curs->arg, bo, &curs->needs_unlock))
> -		return NULL;
> +	ttm_bo_lru_cursor_cleanup_bo(curs);
>  
> -	if (!ttm_bo_get_unless_zero(bo)) {
> -		if (curs->needs_unlock)
> -			dma_resv_unlock(bo->base.resv);
> -		return NULL;
> +	spin_lock(lru_lock);
> +	for (;;) {
> +		int mem_type, ret;
> +		bool bo_locked = false;
> +
> +		if (first) {
> +			res = ttm_resource_manager_first(&curs->res_curs);
> +			first = false;
> +		} else {
> +			res = ttm_resource_manager_next(&curs->res_curs);
> +		}
> +		if (!res)
> +			break;
> +
> +		bo = res->bo;
> +		if (ttm_lru_walk_trylock(arg, bo, &curs->needs_unlock))

Could/should we move needs_unlock into arg as well?

Apart from that looks good to me.

Regards,
Christian.

> +			bo_locked = true;
> +		else if (!arg->ticket || arg->ctx->no_wait_gpu || arg->trylock_only)
> +			continue;
> +
> +		if (!ttm_bo_get_unless_zero(bo)) {
> +			if (curs->needs_unlock)
> +				dma_resv_unlock(bo->base.resv);
> +			continue;
> +		}
> +
> +		mem_type = res->mem_type;
> +		spin_unlock(lru_lock);
> +		if (!bo_locked)
> +			ret = ttm_lru_walk_ticketlock(arg, bo, &curs->needs_unlock);
> +		/*
> +		 * Note that in between the release of the lru lock and the
> +		 * ticketlock, the bo may have switched resource,
> +		 * and also memory type, since the resource may have been
> +		 * freed and allocated again with a different memory type.
> +		 * In that case, just skip it.
> +		 */
> +		curs->bo = bo;
> +		if (!ret && bo->resource && bo->resource->mem_type == mem_type)
> +			return bo;
> +
> +		ttm_bo_lru_cursor_cleanup_bo(curs);
> +		if (ret)
> +			return ERR_PTR(ret);
> +
> +		spin_lock(lru_lock);
>  	}
>  
> -	curs->bo = bo;
> -	return bo;
> +	spin_unlock(lru_lock);
> +	return res ? bo : NULL;
>  }
>  
>  /**
> @@ -1007,25 +999,7 @@ ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *cur
>   */
>  struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs)
>  {
> -	spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
> -	struct ttm_resource *res = NULL;
> -	struct ttm_buffer_object *bo;
> -
> -	ttm_bo_lru_cursor_cleanup_bo(curs);
> -
> -	spin_lock(lru_lock);
> -	for (;;) {
> -		res = ttm_resource_manager_next(&curs->res_curs);
> -		if (!res)
> -			break;
> -
> -		bo = ttm_bo_from_res_reserved(res, curs);
> -		if (bo)
> -			break;
> -	}
> -
> -	spin_unlock(lru_lock);
> -	return res ? bo : NULL;
> +	return __ttm_bo_lru_cursor_next(curs, false);
>  }
>  EXPORT_SYMBOL(ttm_bo_lru_cursor_next);
>  
> @@ -1039,21 +1013,7 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_next);
>   */
>  struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs)
>  {
> -	spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
> -	struct ttm_buffer_object *bo;
> -	struct ttm_resource *res;
> -
> -	spin_lock(lru_lock);
> -	res = ttm_resource_manager_first(&curs->res_curs);
> -	if (!res) {
> -		spin_unlock(lru_lock);
> -		return NULL;
> -	}
> -
> -	bo = ttm_bo_from_res_reserved(res, curs);
> -	spin_unlock(lru_lock);
> -
> -	return bo ? bo : ttm_bo_lru_cursor_next(curs);
> +	return __ttm_bo_lru_cursor_next(curs, true);
>  }
>  EXPORT_SYMBOL(ttm_bo_lru_cursor_first);
>  
> diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
> index f8a1129da2c3..1c3c04d52f55 100644
> --- a/drivers/gpu/drm/xe/xe_shrinker.c
> +++ b/drivers/gpu/drm/xe/xe_shrinker.c
> @@ -66,7 +66,10 @@ static s64 xe_shrinker_walk(struct xe_device *xe,
>  		struct ttm_resource_manager *man = ttm_manager_type(&xe->ttm, mem_type);
>  		struct ttm_bo_lru_cursor curs;
>  		struct ttm_buffer_object *ttm_bo;
> -		struct ttm_lru_walk_arg arg = {.ctx = ctx};
> +		struct ttm_lru_walk_arg arg = {
> +			.ctx = ctx,
> +			.trylock_only = true,
> +		};
>  
>  		if (!man || !man->use_tt)
>  			continue;
> @@ -83,6 +86,8 @@ static s64 xe_shrinker_walk(struct xe_device *xe,
>  			if (*scanned >= to_scan)
>  				break;
>  		}
> +		/* Trylocks should never error, just fail. */
> +		xe_assert(xe, !IS_ERR(ttm_bo));
>  	}
>  
>  	return freed;
> diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
> index 8f04fa48b332..d3a85d76aaff 100644
> --- a/include/drm/ttm/ttm_bo.h
> +++ b/include/drm/ttm/ttm_bo.h
> @@ -529,10 +529,15 @@ class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
>   * up at looping termination, even if terminated prematurely by, for
>   * example a return or break statement. Exiting the loop will also unlock
>   * (if needed) and unreference @_bo.
> + *
> + * Return: If locking of a bo returns an error, then iteration is terminated
> + * and @_bo is set to a corresponding error pointer. It's illegal to
> + * dereference @_bo after loop exit.
>   */
>  #define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg, _bo)	\
>  	scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _arg)		\
> -		for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo);	\
> -		     (_bo) = ttm_bo_lru_cursor_next(_cursor))
> +		for ((_bo) = ttm_bo_lru_cursor_first(_cursor);		\
> +		       !IS_ERR_OR_NULL(_bo);				\
> +		       (_bo) = ttm_bo_lru_cursor_next(_cursor))
>  
>  #endif


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

* Re: [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration
  2025-06-16 13:23   ` Christian König
@ 2025-06-16 15:29     ` Thomas Hellström
  0 siblings, 0 replies; 14+ messages in thread
From: Thomas Hellström @ 2025-06-16 15:29 UTC (permalink / raw)
  To: Christian König, intel-xe
  Cc: dri-devel, airlied, Matthew Brost, Matthew Auld

On Mon, 2025-06-16 at 15:23 +0200, Christian König wrote:
> On 6/13/25 17:18, Thomas Hellström wrote:
> > To avoid duplicating the tricky bo locking implementation,
> > Implement ttm_lru_walk_for_evict() using the guarded bo LRU
> > iteration.
> > 
> > To facilitate this, support ticketlocking from the guarded bo LRU
> > iteration.
> 
> That looks mostly identical to a patch I have in my drm_exec branch.
> 
> A few questions below.
> 
> > 
> > Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> > ---
> >  drivers/gpu/drm/ttm/ttm_bo_util.c | 166 ++++++++++++--------------
> > ----
> >  drivers/gpu/drm/xe/xe_shrinker.c  |   7 +-
> >  include/drm/ttm/ttm_bo.h          |   9 +-
> >  3 files changed, 76 insertions(+), 106 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c
> > b/drivers/gpu/drm/ttm/ttm_bo_util.c
> > index 62b76abac578..9bc17ea1adb2 100644
> > --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> > +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> > @@ -821,12 +821,6 @@ static int ttm_lru_walk_ticketlock(struct
> > ttm_lru_walk_arg *arg,
> >  	return ret;
> >  }
> >  
> > -static void ttm_lru_walk_unlock(struct ttm_buffer_object *bo, bool
> > locked)
> > -{
> > -	if (locked)
> > -		dma_resv_unlock(bo->base.resv);
> > -}
> > -
> >  /**
> >   * ttm_lru_walk_for_evict() - Perform a LRU list walk, with
> > actions taken on
> >   * valid items.
> > @@ -861,64 +855,21 @@ static void ttm_lru_walk_unlock(struct
> > ttm_buffer_object *bo, bool locked)
> >  s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct
> > ttm_device *bdev,
> >  			   struct ttm_resource_manager *man, s64
> > target)
> >  {
> > -	struct ttm_resource_cursor cursor;
> > -	struct ttm_resource *res;
> > +	struct ttm_bo_lru_cursor cursor;
> > +	struct ttm_buffer_object *bo;
> >  	s64 progress = 0;
> >  	s64 lret;
> >  
> > -	spin_lock(&bdev->lru_lock);
> > -	ttm_resource_cursor_init(&cursor, man);
> > -	ttm_resource_manager_for_each_res(&cursor, res) {
> > -		struct ttm_buffer_object *bo = res->bo;
> > -		bool bo_needs_unlock = false;
> > -		bool bo_locked = false;
> > -		int mem_type;
> > -
> > -		/*
> > -		 * Attempt a trylock before taking a reference on
> > the bo,
> > -		 * since if we do it the other way around, and the
> > trylock fails,
> > -		 * we need to drop the lru lock to put the bo.
> > -		 */
> > -		if (ttm_lru_walk_trylock(&walk->arg, bo,
> > &bo_needs_unlock))
> > -			bo_locked = true;
> > -		else if (!walk->arg.ticket || walk->arg.ctx-
> > >no_wait_gpu ||
> > -			 walk->arg.trylock_only)
> > -			continue;
> > -
> > -		if (!ttm_bo_get_unless_zero(bo)) {
> > -			ttm_lru_walk_unlock(bo, bo_needs_unlock);
> > -			continue;
> > -		}
> > -
> > -		mem_type = res->mem_type;
> > -		spin_unlock(&bdev->lru_lock);
> > -
> > -		lret = 0;
> > -		if (!bo_locked)
> > -			lret = ttm_lru_walk_ticketlock(&walk->arg,
> > bo, &bo_needs_unlock);
> > -
> > -		/*
> > -		 * Note that in between the release of the lru
> > lock and the
> > -		 * ticketlock, the bo may have switched resource,
> > -		 * and also memory type, since the resource may
> > have been
> > -		 * freed and allocated again with a different
> > memory type.
> > -		 * In that case, just skip it.
> > -		 */
> > -		if (!lret && bo->resource && bo->resource-
> > >mem_type == mem_type)
> > -			lret = walk->ops->process_bo(walk, bo);
> > -
> > -		ttm_lru_walk_unlock(bo, bo_needs_unlock);
> > -		ttm_bo_put(bo);
> > +	ttm_bo_lru_for_each_reserved_guarded(&cursor, man, &walk-
> > >arg, bo) {
> > +		lret = walk->ops->process_bo(walk, bo);
> >  		if (lret == -EBUSY || lret == -EALREADY)
> >  			lret = 0;
> >  		progress = (lret < 0) ? lret : progress + lret;
> > -
> > -		spin_lock(&bdev->lru_lock);
> >  		if (progress < 0 || progress >= target)
> >  			break;
> >  	}
> > -	ttm_resource_cursor_fini(&cursor);
> > -	spin_unlock(&bdev->lru_lock);
> > +	if (IS_ERR(bo))
> > +		return PTR_ERR(bo);
> >  
> >  	return progress;
> >  }
> > @@ -958,10 +909,7 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
> >   * @man: The ttm resource_manager whose LRU lists to iterate over.
> >   * @arg: The ttm_lru_walk_arg to govern the walk.
> >   *
> > - * Initialize a struct ttm_bo_lru_cursor. Currently only
> > trylocking
> > - * or prelocked buffer objects are available as detailed by
> > - * @arg->ctx.resv and @arg->ctx.allow_res_evict. Ticketlocking is
> > not
> > - * supported.
> > + * Initialize a struct ttm_bo_lru_cursor.
> >   *
> >   * Return: Pointer to @curs. The function does not fail.
> >   */
> > @@ -979,21 +927,65 @@ ttm_bo_lru_cursor_init(struct
> > ttm_bo_lru_cursor *curs,
> >  EXPORT_SYMBOL(ttm_bo_lru_cursor_init);
> >  
> >  static struct ttm_buffer_object *
> > -ttm_bo_from_res_reserved(struct ttm_resource *res, struct
> > ttm_bo_lru_cursor *curs)
> > +__ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs, bool
> > first)
> 
> Giving first as bool parameter here looks really ugly. Isn't there
> any other way to do this?

I agree. The previous way of doing this with a bo_from_res() isn't a
good fit since if ticketlocking, we'd like to return without the
spinlock held, and be called with the spinlock held. That's really
confusing both to readers and static analyzers so rather avoided.

We could look at curs->bo and see if it's NULL, but then I think the
bool argument is more readable. But if you have a better idea, I'm of
course open to changing this.

> 
> >  {
> > -	struct ttm_buffer_object *bo = res->bo;
> > +	spinlock_t *lru_lock = &curs->res_curs.man->bdev-
> > >lru_lock;
> > +	struct ttm_resource *res = NULL;
> > +	struct ttm_buffer_object *bo;
> > +	struct ttm_lru_walk_arg *arg = curs->arg;
> >  
> > -	if (!ttm_lru_walk_trylock(curs->arg, bo, &curs-
> > >needs_unlock))
> > -		return NULL;
> > +	ttm_bo_lru_cursor_cleanup_bo(curs);
> >  
> > -	if (!ttm_bo_get_unless_zero(bo)) {
> > -		if (curs->needs_unlock)
> > -			dma_resv_unlock(bo->base.resv);
> > -		return NULL;
> > +	spin_lock(lru_lock);
> > +	for (;;) {
> > +		int mem_type, ret;
> > +		bool bo_locked = false;
> > +
> > +		if (first) {
> > +			res = ttm_resource_manager_first(&curs-
> > >res_curs);
> > +			first = false;
> > +		} else {
> > +			res = ttm_resource_manager_next(&curs-
> > >res_curs);
> > +		}
> > +		if (!res)
> > +			break;
> > +
> > +		bo = res->bo;
> > +		if (ttm_lru_walk_trylock(arg, bo, &curs-
> > >needs_unlock))
> 
> Could/should we move needs_unlock into arg as well?

They are different in that arg is state that governs the whole loop but
needs_unlock is local to a single iteration. We could of course pass
the cursor to the various locking functions to eliminate one argument
now that walk_for_evict() also uses the cursor.

Thoughts?
/Thomas



> 
> Apart from that looks good to me.
> 
> Regards,
> Christian.
> 
> > +			bo_locked = true;
> > +		else if (!arg->ticket || arg->ctx->no_wait_gpu ||
> > arg->trylock_only)
> > +			continue;
> > +
> > +		if (!ttm_bo_get_unless_zero(bo)) {
> > +			if (curs->needs_unlock)
> > +				dma_resv_unlock(bo->base.resv);
> > +			continue;
> > +		}
> > +
> > +		mem_type = res->mem_type;
> > +		spin_unlock(lru_lock);
> > +		if (!bo_locked)
> > +			ret = ttm_lru_walk_ticketlock(arg, bo,
> > &curs->needs_unlock);
> > +		/*
> > +		 * Note that in between the release of the lru
> > lock and the
> > +		 * ticketlock, the bo may have switched resource,
> > +		 * and also memory type, since the resource may
> > have been
> > +		 * freed and allocated again with a different
> > memory type.
> > +		 * In that case, just skip it.
> > +		 */
> > +		curs->bo = bo;
> > +		if (!ret && bo->resource && bo->resource->mem_type
> > == mem_type)
> > +			return bo;
> > +
> > +		ttm_bo_lru_cursor_cleanup_bo(curs);
> > +		if (ret)
> > +			return ERR_PTR(ret);
> > +
> > +		spin_lock(lru_lock);
> >  	}
> >  
> > -	curs->bo = bo;
> > -	return bo;
> > +	spin_unlock(lru_lock);
> > +	return res ? bo : NULL;
> >  }
> >  
> >  /**
> > @@ -1007,25 +999,7 @@ ttm_bo_from_res_reserved(struct ttm_resource
> > *res, struct ttm_bo_lru_cursor *cur
> >   */
> >  struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct
> > ttm_bo_lru_cursor *curs)
> >  {
> > -	spinlock_t *lru_lock = &curs->res_curs.man->bdev-
> > >lru_lock;
> > -	struct ttm_resource *res = NULL;
> > -	struct ttm_buffer_object *bo;
> > -
> > -	ttm_bo_lru_cursor_cleanup_bo(curs);
> > -
> > -	spin_lock(lru_lock);
> > -	for (;;) {
> > -		res = ttm_resource_manager_next(&curs->res_curs);
> > -		if (!res)
> > -			break;
> > -
> > -		bo = ttm_bo_from_res_reserved(res, curs);
> > -		if (bo)
> > -			break;
> > -	}
> > -
> > -	spin_unlock(lru_lock);
> > -	return res ? bo : NULL;
> > +	return __ttm_bo_lru_cursor_next(curs, false);
> >  }
> >  EXPORT_SYMBOL(ttm_bo_lru_cursor_next);
> >  
> > @@ -1039,21 +1013,7 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_next);
> >   */
> >  struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct
> > ttm_bo_lru_cursor *curs)
> >  {
> > -	spinlock_t *lru_lock = &curs->res_curs.man->bdev-
> > >lru_lock;
> > -	struct ttm_buffer_object *bo;
> > -	struct ttm_resource *res;
> > -
> > -	spin_lock(lru_lock);
> > -	res = ttm_resource_manager_first(&curs->res_curs);
> > -	if (!res) {
> > -		spin_unlock(lru_lock);
> > -		return NULL;
> > -	}
> > -
> > -	bo = ttm_bo_from_res_reserved(res, curs);
> > -	spin_unlock(lru_lock);
> > -
> > -	return bo ? bo : ttm_bo_lru_cursor_next(curs);
> > +	return __ttm_bo_lru_cursor_next(curs, true);
> >  }
> >  EXPORT_SYMBOL(ttm_bo_lru_cursor_first);
> >  
> > diff --git a/drivers/gpu/drm/xe/xe_shrinker.c
> > b/drivers/gpu/drm/xe/xe_shrinker.c
> > index f8a1129da2c3..1c3c04d52f55 100644
> > --- a/drivers/gpu/drm/xe/xe_shrinker.c
> > +++ b/drivers/gpu/drm/xe/xe_shrinker.c
> > @@ -66,7 +66,10 @@ static s64 xe_shrinker_walk(struct xe_device
> > *xe,
> >  		struct ttm_resource_manager *man =
> > ttm_manager_type(&xe->ttm, mem_type);
> >  		struct ttm_bo_lru_cursor curs;
> >  		struct ttm_buffer_object *ttm_bo;
> > -		struct ttm_lru_walk_arg arg = {.ctx = ctx};
> > +		struct ttm_lru_walk_arg arg = {
> > +			.ctx = ctx,
> > +			.trylock_only = true,
> > +		};
> >  
> >  		if (!man || !man->use_tt)
> >  			continue;
> > @@ -83,6 +86,8 @@ static s64 xe_shrinker_walk(struct xe_device *xe,
> >  			if (*scanned >= to_scan)
> >  				break;
> >  		}
> > +		/* Trylocks should never error, just fail. */
> > +		xe_assert(xe, !IS_ERR(ttm_bo));
> >  	}
> >  
> >  	return freed;
> > diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
> > index 8f04fa48b332..d3a85d76aaff 100644
> > --- a/include/drm/ttm/ttm_bo.h
> > +++ b/include/drm/ttm/ttm_bo.h
> > @@ -529,10 +529,15 @@
> > class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
> >   * up at looping termination, even if terminated prematurely by,
> > for
> >   * example a return or break statement. Exiting the loop will also
> > unlock
> >   * (if needed) and unreference @_bo.
> > + *
> > + * Return: If locking of a bo returns an error, then iteration is
> > terminated
> > + * and @_bo is set to a corresponding error pointer. It's illegal
> > to
> > + * dereference @_bo after loop exit.
> >   */
> >  #define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg,
> > _bo)	\
> >  	scoped_guard(ttm_bo_lru_cursor, _cursor, _man,
> > _arg)		\
> > -		for ((_bo) = ttm_bo_lru_cursor_first(_cursor);
> > (_bo);	\
> > -		     (_bo) = ttm_bo_lru_cursor_next(_cursor))
> > +		for ((_bo) =
> > ttm_bo_lru_cursor_first(_cursor);		\
> > +		      
> > !IS_ERR_OR_NULL(_bo);				\
> > +		       (_bo) = ttm_bo_lru_cursor_next(_cursor))
> >  
> >  #endif
> 


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

* Re: [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration
  2025-06-13 15:18 ` [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration Thomas Hellström
  2025-06-13 18:39   ` kernel test robot
  2025-06-16 13:23   ` Christian König
@ 2025-06-18 17:43   ` Dan Carpenter
  2 siblings, 0 replies; 14+ messages in thread
From: Dan Carpenter @ 2025-06-18 17:43 UTC (permalink / raw)
  To: oe-kbuild, Thomas Hellström, intel-xe
  Cc: lkp, oe-kbuild-all, Thomas Hellström, dri-devel, airlied,
	Matthew Brost, Matthew Auld, Christian König

Hi Thomas,

kernel test robot noticed the following build warnings:

https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Thomas-Hellstr-m/drm-ttm-Use-a-struct-for-the-common-part-of-struct-ttm_lru_walk-and-struct-ttm_bo_lru_cursor/20250613-232106
base:   https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-next
patch link:    https://lore.kernel.org/r/20250613151824.178650-4-thomas.hellstrom%40linux.intel.com
patch subject: [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration
config: i386-randconfig-141-20250614 (https://download.01.org/0day-ci/archive/20250614/202506141727.FtEuY8xN-lkp@intel.com/config)
compiler: clang version 20.1.2 (https://github.com/llvm/llvm-project 58df0ef89dd64126512e4ee27b4ac3fd8ddf6247)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202506141727.FtEuY8xN-lkp@intel.com/

smatch warnings:
drivers/gpu/drm/ttm/ttm_bo_util.c:975 __ttm_bo_lru_cursor_next() error: uninitialized symbol 'ret'.

vim +/ret +975 drivers/gpu/drm/ttm/ttm_bo_util.c

f3bcfd04a52fb1 Thomas Hellström 2025-03-05  927  static struct ttm_buffer_object *
a9654c8f32d9f4 Thomas Hellström 2025-06-13  928  __ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs, bool first)
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  929  {
a9654c8f32d9f4 Thomas Hellström 2025-06-13  930  	spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  931  	struct ttm_resource *res = NULL;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  932  	struct ttm_buffer_object *bo;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  933  	struct ttm_lru_walk_arg *arg = curs->arg;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  934  
a9654c8f32d9f4 Thomas Hellström 2025-06-13  935  	ttm_bo_lru_cursor_cleanup_bo(curs);
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  936  
a9654c8f32d9f4 Thomas Hellström 2025-06-13  937  	spin_lock(lru_lock);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  938  	for (;;) {
a9654c8f32d9f4 Thomas Hellström 2025-06-13  939  		int mem_type, ret;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  940  		bool bo_locked = false;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  941  
a9654c8f32d9f4 Thomas Hellström 2025-06-13  942  		if (first) {
a9654c8f32d9f4 Thomas Hellström 2025-06-13  943  			res = ttm_resource_manager_first(&curs->res_curs);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  944  			first = false;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  945  		} else {
a9654c8f32d9f4 Thomas Hellström 2025-06-13  946  			res = ttm_resource_manager_next(&curs->res_curs);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  947  		}
a9654c8f32d9f4 Thomas Hellström 2025-06-13  948  		if (!res)
a9654c8f32d9f4 Thomas Hellström 2025-06-13  949  			break;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  950  
a9654c8f32d9f4 Thomas Hellström 2025-06-13  951  		bo = res->bo;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  952  		if (ttm_lru_walk_trylock(arg, bo, &curs->needs_unlock))
a9654c8f32d9f4 Thomas Hellström 2025-06-13  953  			bo_locked = true;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  954  		else if (!arg->ticket || arg->ctx->no_wait_gpu || arg->trylock_only)
a9654c8f32d9f4 Thomas Hellström 2025-06-13  955  			continue;
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  956  
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  957  		if (!ttm_bo_get_unless_zero(bo)) {
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  958  			if (curs->needs_unlock)
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  959  				dma_resv_unlock(bo->base.resv);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  960  			continue;
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  961  		}
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  962  
a9654c8f32d9f4 Thomas Hellström 2025-06-13  963  		mem_type = res->mem_type;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  964  		spin_unlock(lru_lock);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  965  		if (!bo_locked)
a9654c8f32d9f4 Thomas Hellström 2025-06-13  966  			ret = ttm_lru_walk_ticketlock(arg, bo, &curs->needs_unlock);

ret is uninitialized on else path

a9654c8f32d9f4 Thomas Hellström 2025-06-13  967  		/*
a9654c8f32d9f4 Thomas Hellström 2025-06-13  968  		 * Note that in between the release of the lru lock and the
a9654c8f32d9f4 Thomas Hellström 2025-06-13  969  		 * ticketlock, the bo may have switched resource,
a9654c8f32d9f4 Thomas Hellström 2025-06-13  970  		 * and also memory type, since the resource may have been
a9654c8f32d9f4 Thomas Hellström 2025-06-13  971  		 * freed and allocated again with a different memory type.
a9654c8f32d9f4 Thomas Hellström 2025-06-13  972  		 * In that case, just skip it.
a9654c8f32d9f4 Thomas Hellström 2025-06-13  973  		 */
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  974  		curs->bo = bo;
a9654c8f32d9f4 Thomas Hellström 2025-06-13 @975  		if (!ret && bo->resource && bo->resource->mem_type == mem_type)
                                                                    ^^^^
warning

f3bcfd04a52fb1 Thomas Hellström 2025-03-05  976  			return bo;
a9654c8f32d9f4 Thomas Hellström 2025-06-13  977  
a9654c8f32d9f4 Thomas Hellström 2025-06-13  978  		ttm_bo_lru_cursor_cleanup_bo(curs);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  979  		if (ret)
a9654c8f32d9f4 Thomas Hellström 2025-06-13  980  			return ERR_PTR(ret);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  981  
a9654c8f32d9f4 Thomas Hellström 2025-06-13  982  		spin_lock(lru_lock);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  983  	}
a9654c8f32d9f4 Thomas Hellström 2025-06-13  984  
a9654c8f32d9f4 Thomas Hellström 2025-06-13  985  	spin_unlock(lru_lock);
a9654c8f32d9f4 Thomas Hellström 2025-06-13  986  	return res ? bo : NULL;
f3bcfd04a52fb1 Thomas Hellström 2025-03-05  987  }

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


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

end of thread, other threads:[~2025-06-18 17:43 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-13 15:18 [PATCH 0/3] drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Thomas Hellström
2025-06-13 15:18 ` [PATCH 1/3] drm/ttm: Use a struct for the common part of struct ttm_lru_walk and struct ttm_bo_lru_cursor Thomas Hellström
2025-06-16 13:04   ` Christian König
2025-06-13 15:18 ` [PATCH 2/3] drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor initialization Thomas Hellström
2025-06-16 13:15   ` Christian König
2025-06-13 15:18 ` [PATCH 3/3] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration Thomas Hellström
2025-06-13 18:39   ` kernel test robot
2025-06-16 13:23   ` Christian König
2025-06-16 15:29     ` Thomas Hellström
2025-06-18 17:43   ` Dan Carpenter
2025-06-13 17:15 ` ✗ CI.checkpatch: warning for drm/ttm, drm/xe: Consolidate the Buffer Object LRU walks Patchwork
2025-06-13 17:16 ` ✓ CI.KUnit: success " Patchwork
2025-06-13 18:19 ` ✓ Xe.CI.BAT: " Patchwork
2025-06-15 14:51 ` ✓ 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