Skip to contentSkip to conversation

drm/xe: Adjust the bo shrinker batch size

PATCH Superseded Thomas Hellström 4 participants 21 messages Oct 16 – Oct 19

Subsystems (3)

v4 of 5 Superseded Latest is v5 →

lore
Share & tools
lore

Thomas Hellström

author maintainer
#0 lore raw

v4 cover drm/xe: Adjust the bo shrinker batch size

Shamelessly stolen from i915, To avoid gpu stalls for small shrinker request, Set the shrinker batch size to the average size of system buffer objects. Use the number of populated struct ttm_tts to compute the average size.

Sashiko AI review of the v2 posting flagged two issues:

- [High] a pre-existing shrinker accounting double-subtraction bug on nested external pins (plus a related underflow for imported dma-bufs, found while fixing it). This has since been fixed and merged upstream as its own, separate fixes series, so it is no longer carried as a patch here.

- [Medium] a data race on the unsynchronized read-modify-write of the shrinker batch size. Fixed in v3 below.

Sashiko AI review of the v3 posting flagged, among others:

- [High] a pre-existing shrinker accounting underflow when the purgeable state of a pinned bo changes. This is fixed by a separately posted patch, "drm/xe: Don't transfer shrinker pages for pinned bos on purgeable state change".

- [High] the standalone purgeable shrinker aborting its LRU walk at the first non-purgeable object. This turned out to be a pre-existing bug affecting also the non-purge walk, for example at imported dma-bufs. Fixed in patch 1/4, placed first so that it can be backported independently.

v2:
- Fix the average object size estimate to account for the full shrinkable and purgeable population.

v3:
- Drop the shrinker accounting double-subtraction fix from this series; it has been fixed and merged upstream separately.
- Patch 3/4: new patch, splitting the bo shrinker into purgeable and non-purgeable shrinkers, per a suggestion from Matthew Brost.
- Patch 4/4: reworked on top of the shrinker split, and the batch size update is now performed under the existing shrinker lock, fixing the data race caught by Sashiko AI review.

v4:
- Patch 1/4: new patch, skipping objects for which xe_bo_shrink() returns -EBUSY rather than aborting the shrinker walk. (Sashiko)

Thomas Hellström (4):
drm/xe: Don't abort the shrinker walk on -EBUSY
drm/xe: Track number of populated ttm_tts in the shrinker drm/xe: Split the bo shrinker into purgeable and non-purgeable
shrinkers
drm/xe: Update non-purgeable shrinker batch size based on average BO
size

 drivers/gpu/drm/xe/xe_bo.c       |  12 +--
 drivers/gpu/drm/xe/xe_shrinker.c | 175 ++++++++++++++++++++++---------
 drivers/gpu/drm/xe/xe_shrinker.h |   3 +-
 3 files changed, 132 insertions(+), 58 deletions(-)
Signature · 1 line
2.56.0
author maintainer
#1 lore raw

PATCH v4 1/4 drm/xe: Don't abort the shrinker walk on -EBUSY

xe_bo_shrink() returns -EBUSY for bos that can't currently be shrunk, for example imported dma-bufs, bos whose vm is currently validating, bos that are still busy after the wait timeout, or bos whose backup fails. The shrinker LRU walk treats any negative return value as fatal and aborts, which also skips the remaining shrinker passes.

As a result, a single such bo, like an imported dma-buf on the XE_PL_TT LRU, prevents reclaim of all bos behind it on the LRU.

Skip bos for which xe_bo_shrink() returns -EBUSY and continue the walk, like the TTM LRU walk does.

v4:
- Patch introduced.

Fixes 00c8efc3180f ("drm/xe: Add a shrinker for xe bos")
Cc Christian König <[email protected]>
Cc Matthew Brost <[email protected]>
Cc Rodrigo Vivi <[email protected]>
Cc <[email protected]> # v6.15+
Assisted-by LLM
---
 drivers/gpu/drm/xe/xe_shrinker.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/gpu/drm/xe/xe_shrinker.c +3 -0
index deb4378c1ec1..4e4da76936f4 100644
@@ -113,6 +113,9 @@ static int __xe_shrinker_walk(struct xe_shrinker *shrinker,
 				continue;
 
 			lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned);
+			/* Like the TTM LRU walk, skip bos we can't shrink now. */
+			if (lret == -EBUSY)
+				continue;
 			if (lret < 0) {
 				ret = lret;
 				goto out;
Signature · 1 line
2.56.0
#2 lore raw

Re: [PATCH v4 1/4] drm/xe: Don't abort the shrinker walk on -EBUSY

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Medium] xe: loop termination check bypassed on -EBUSY causing unbounded shrinker scan --

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] xe: loop termination check bypassed on -EBUSY causing unbounded shrinker scan --

commit a9661e97694161cd803806ccc4ad309e99a9f298
Author: Thomas Hellström <[email protected]>

drm/xe: Don't abort the shrinker walk on -EBUSY

xe_bo_shrink() returns -EBUSY for bos that can't currently be shrunk. The shrinker LRU walk treated any negative return value as fatal and aborted. This commit changes it to skip bos for which xe_bo_shrink() returns -EBUSY and continues the walk.

drivers/gpu/drm/xe/xe_shrinker.c static int __xe_shrinker_walk(struct xe_shrinker *shrinker, · line 118

Quoted 11 lines
drivers/gpu/drm/xe/xe_shrinker.c +3 -0
index deb4378c1ec15..4e4da76936f49 100644
@@ -113,6 +113,9 @@ static int __xe_shrinker_walk(struct xe_shrinker *shrinker,
 				continue;
 
 			lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned);
+			/* Like the TTM LRU walk, skip bos we can't shrink now. */
+			if (lret == -EBUSY)
+				continue;

[Severity: Medium]
Does this continue statement inadvertently bypass the loop termination check?

In xe_bo_shrink(), the scanned counter is incremented before potentially returning -EBUSY:

xe_bo_shrink() {
	...
	*scanned += tt->num_pages;
	lret = ttm_bo_shrink(ctx, bo, ...);
	...
	return lret;
}

If a sequence of buffer objects return -EBUSY from ttm_bo_shrink(), could this introduce a regression where the shrinker performs an unbounded scan over the list because the *scanned >= to_scan check at the bottom of the loop body is bypassed?

Quoted 3 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
 			if (lret < 0) {
 				ret = lret;
 				goto out;
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=1
maintainer Reviewed-by on v4 1/4
#3 lore raw

Re: [PATCH v4 1/4] drm/xe: Don't abort the shrinker walk on -EBUSY

In reply to Thomas Hellström
Quoted 12 lines · Thomas Hellström

xe_bo_shrink() returns -EBUSY for bos that can't currently be shrunk, for example imported dma-bufs, bos whose vm is currently validating, bos that are still busy after the wait timeout, or bos whose backup fails. The shrinker LRU walk treats any negative return value as fatal and aborts, which also skips the remaining shrinker passes.

As a result, a single such bo, like an imported dma-buf on the XE_PL_TT LRU, prevents reclaim of all bos behind it on the LRU.

Skip bos for which xe_bo_shrink() returns -EBUSY and continue the walk, like the TTM LRU walk does.

Quoted 6 lines

v4:
- Patch introduced.

Fixes 00c8efc3180f ("drm/xe: Add a shrinker for xe bos")
Cc Christian König <[email protected]>
Cc Matthew Brost <[email protected]>

I noticed this on as well.

Quoted 26 lines
Cc Rodrigo Vivi <[email protected]>
Cc <[email protected]> # v6.15+
Assisted-by LLM
---
 drivers/gpu/drm/xe/xe_shrinker.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/gpu/drm/xe/xe_shrinker.c +3 -0
index deb4378c1ec1..4e4da76936f4 100644
@@ -113,6 +113,9 @@ static int __xe_shrinker_walk(struct xe_shrinker *shrinker,
 				continue;
 
 			lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned);
+			/* Like the TTM LRU walk, skip bos we can't shrink now. */
+			if (lret == -EBUSY)
+				continue;
 			if (lret < 0) {
 				ret = lret;
 				goto out;
Signature · 1 line
2.56.0
author maintainer
#4 lore raw

PATCH v4 2/4 drm/xe: Track number of populated ttm_tts in the shrinker

In reply to Thomas Hellström

Add a populated_tts counter to struct xe_shrinker to track how many ttm_tts are currently populated and on the LRU (i.e., shrinkable or purgeable). This mirrors the existing per-pages accounting but counts objects rather than pages.

The counter is incremented in xe_ttm_tt_account_add() and decremented in xe_ttm_tt_account_subtract(), which are already called at the exact points where pages enter and leave the shrinker's jurisdiction (populate, unpopulate, pin, and unpin). Purgeable state transfers, which move pages between the shrinkable and purgeable buckets without changing the total object count, pass tts=0.

Extend xe_shrinker_mod_pages() with a tts delta parameter so that page and object accounting can be updated atomically under the same lock.

Assert that populated_tts reaches zero at device teardown, alongside the existing assertions for shrinkable_pages and purgeable_pages.

No functional change intended; the new field is unused until a follow-up commit wires it into shrinker batch sizing.

Assisted-by LLM
---
 drivers/gpu/drm/xe/xe_bo.c       | 12 ++++++------
 drivers/gpu/drm/xe/xe_shrinker.c | 15 +++++++++++----
 drivers/gpu/drm/xe/xe_shrinker.h |  3 ++-
 3 files changed, 19 insertions(+), 11 deletions(-)
drivers/gpu/drm/xe/xe_bo.c +6 -6
index 12e523c61c1f..1b74331b15ec 100644
@@ -456,9 +456,9 @@ static void xe_ttm_tt_account_add(struct xe_device *xe, struct ttm_tt *tt)
 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
 
 	if (xe_tt->purgeable)
-		xe_shrinker_mod_pages(xe->mem.shrinker, 0, tt->num_pages);
+		xe_shrinker_mod_pages(xe->mem.shrinker, 0, tt->num_pages, 1);
 	else
-		xe_shrinker_mod_pages(xe->mem.shrinker, tt->num_pages, 0);
+		xe_shrinker_mod_pages(xe->mem.shrinker, tt->num_pages, 0, 1);
 }
 
 static void xe_ttm_tt_account_subtract(struct xe_device *xe, struct ttm_tt *tt)
@@ -466,9 +466,9 @@ static void xe_ttm_tt_account_subtract(struct xe_device *xe, struct ttm_tt *tt)
 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
 
 	if (xe_tt->purgeable)
-		xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt->num_pages);
+		xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt->num_pages, -1);
 	else
-		xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0);
+		xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0, -1);
 }
 
 static bool xe_ttm_bo_is_imported(struct ttm_buffer_object *tbo)
@@ -984,11 +984,11 @@ static void xe_bo_set_purgeable_shrinker(struct xe_bo *bo,
 	if (!xe_tt->purgeable && new_state == XE_MADV_PURGEABLE_DONTNEED) {
 		xe_tt->purgeable = true;
 		/* Transfer pages from shrinkable to purgeable count */
-		xe_shrinker_mod_pages(xe->mem.shrinker, -tt_pages, tt_pages);
+		xe_shrinker_mod_pages(xe->mem.shrinker, -tt_pages, tt_pages, 0);
 	} else if (xe_tt->purgeable && new_state == XE_MADV_PURGEABLE_WILLNEED) {
 		xe_tt->purgeable = false;
 		/* Transfer pages from purgeable to shrinkable count */
-		xe_shrinker_mod_pages(xe->mem.shrinker, tt_pages, -tt_pages);
+		xe_shrinker_mod_pages(xe->mem.shrinker, tt_pages, -tt_pages, 0);
 	}
 }
 
drivers/gpu/drm/xe/xe_shrinker.c +11 -4
index 4e4da76936f4..378022c37a57 100644
@@ -20,6 +20,7 @@
  * @lock: Lock protecting accounting.
  * @shrinkable_pages: Number of pages that are currently shrinkable.
  * @purgeable_pages: Number of pages that are currently purgeable.
+ * @populated_tts: Number of populated ttm_tts currently shrinkable or purgeable.
  * @shrink: Pointer to the mm shrinker.
  * @pm_worker: Worker to wake up the device if required.
  */
@@ -28,6 +29,7 @@ struct xe_shrinker {
 	rwlock_t lock;
 	long shrinkable_pages;
 	long purgeable_pages;
+	long populated_tts;
 	struct shrinker *shrink;
 	struct work_struct pm_worker;
 };
@@ -38,19 +40,23 @@ static struct xe_shrinker *to_xe_shrinker(struct shrinker *shrink)
 }
 
 /**
- * xe_shrinker_mod_pages() - Modify shrinker page accounting
+ * xe_shrinker_mod_pages() - Modify shrinker page and object accounting
  * @shrinker: Pointer to the struct xe_shrinker.
  * @shrinkable: Shrinkable pages delta. May be negative.
- * @purgeable: Purgeable page delta. May be negative.
+ * @purgeable: Purgeable pages delta. May be negative.
+ * @tts: Populated ttm_tt count delta. May be negative.
  *
- * Modifies the shrinkable and purgeable pages accounting.
+ * Updates the shrinkable and purgeable page counts and the populated
+ * ttm_tt count.
  */
 void
-xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable)
+xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable,
+		      long tts)
 {
 	write_lock(&shrinker->lock);
 	shrinker->shrinkable_pages += shrinkable;
 	shrinker->purgeable_pages += purgeable;
+	shrinker->populated_tts += tts;
 	write_unlock(&shrinker->lock);
 }
 
@@ -286,6 +292,7 @@ static void xe_shrinker_fini(struct drm_device *drm, void *arg)
 
 	xe_assert(shrinker->xe, !shrinker->shrinkable_pages);
 	xe_assert(shrinker->xe, !shrinker->purgeable_pages);
+	xe_assert(shrinker->xe, !shrinker->populated_tts);
 	shrinker_free(shrinker->shrink);
 	flush_work(&shrinker->pm_worker);
 	kfree(shrinker);
drivers/gpu/drm/xe/xe_shrinker.h +2 -1
index 5132ae5192e1..9c63e22b3b73 100644
@@ -9,7 +9,8 @@
 struct xe_shrinker;
 struct xe_device;
 
-void xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable);
+void xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable,
+			   long tts);
 
 int xe_shrinker_create(struct xe_device *xe);
 
Signature · 1 line
2.56.0
maintainer Reviewed-by on v4 2/4
#5 lore raw

Re: [PATCH v4 2/4] drm/xe: Track number of populated ttm_tts in the shrinker

Quoted 15 lines · Thomas Hellström

Add a populated_tts counter to struct xe_shrinker to track how many ttm_tts are currently populated and on the LRU (i.e., shrinkable or purgeable). This mirrors the existing per-pages accounting but counts objects rather than pages.

The counter is incremented in xe_ttm_tt_account_add() and decremented in xe_ttm_tt_account_subtract(), which are already called at the exact points where pages enter and leave the shrinker's jurisdiction (populate, unpopulate, pin, and unpin). Purgeable state transfers, which move pages between the shrinkable and purgeable buckets without changing the total object count, pass tts=0.

Extend xe_shrinker_mod_pages() with a tts delta parameter so that page and object accounting can be updated atomically under the same lock.

Quoted 8 lines

Assert that populated_tts reaches zero at device teardown, alongside the existing assertions for shrinkable_pages and purgeable_pages.

No functional change intended; the new field is unused until a follow-up commit wires it into shrinker batch sizing.

Assisted-by LLM
Quoted 121 lines
---
 drivers/gpu/drm/xe/xe_bo.c       | 12 ++++++------
 drivers/gpu/drm/xe/xe_shrinker.c | 15 +++++++++++----
 drivers/gpu/drm/xe/xe_shrinker.h |  3 ++-
 3 files changed, 19 insertions(+), 11 deletions(-)
drivers/gpu/drm/xe/xe_bo.c +6 -6
index 12e523c61c1f..1b74331b15ec 100644
@@ -456,9 +456,9 @@ static void xe_ttm_tt_account_add(struct xe_device *xe, struct ttm_tt *tt)
 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
 
 	if (xe_tt->purgeable)
-		xe_shrinker_mod_pages(xe->mem.shrinker, 0, tt->num_pages);
+		xe_shrinker_mod_pages(xe->mem.shrinker, 0, tt->num_pages, 1);
 	else
-		xe_shrinker_mod_pages(xe->mem.shrinker, tt->num_pages, 0);
+		xe_shrinker_mod_pages(xe->mem.shrinker, tt->num_pages, 0, 1);
 }
 
 static void xe_ttm_tt_account_subtract(struct xe_device *xe, struct ttm_tt *tt)
@@ -466,9 +466,9 @@ static void xe_ttm_tt_account_subtract(struct xe_device *xe, struct ttm_tt *tt)
 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
 
 	if (xe_tt->purgeable)
-		xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt->num_pages);
+		xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt->num_pages, -1);
 	else
-		xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0);
+		xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0, -1);
 }
 
 static bool xe_ttm_bo_is_imported(struct ttm_buffer_object *tbo)
@@ -984,11 +984,11 @@ static void xe_bo_set_purgeable_shrinker(struct xe_bo *bo,
 	if (!xe_tt->purgeable && new_state == XE_MADV_PURGEABLE_DONTNEED) {
 		xe_tt->purgeable = true;
 		/* Transfer pages from shrinkable to purgeable count */
-		xe_shrinker_mod_pages(xe->mem.shrinker, -tt_pages, tt_pages);
+		xe_shrinker_mod_pages(xe->mem.shrinker, -tt_pages, tt_pages, 0);
 	} else if (xe_tt->purgeable && new_state == XE_MADV_PURGEABLE_WILLNEED) {
 		xe_tt->purgeable = false;
 		/* Transfer pages from purgeable to shrinkable count */
-		xe_shrinker_mod_pages(xe->mem.shrinker, tt_pages, -tt_pages);
+		xe_shrinker_mod_pages(xe->mem.shrinker, tt_pages, -tt_pages, 0);
 	}
 }
 
drivers/gpu/drm/xe/xe_shrinker.c +11 -4
index 4e4da76936f4..378022c37a57 100644
@@ -20,6 +20,7 @@
  * @lock: Lock protecting accounting.
  * @shrinkable_pages: Number of pages that are currently shrinkable.
  * @purgeable_pages: Number of pages that are currently purgeable.
+ * @populated_tts: Number of populated ttm_tts currently shrinkable or purgeable.
  * @shrink: Pointer to the mm shrinker.
  * @pm_worker: Worker to wake up the device if required.
  */
@@ -28,6 +29,7 @@ struct xe_shrinker {
 	rwlock_t lock;
 	long shrinkable_pages;
 	long purgeable_pages;
+	long populated_tts;
 	struct shrinker *shrink;
 	struct work_struct pm_worker;
 };
@@ -38,19 +40,23 @@ static struct xe_shrinker *to_xe_shrinker(struct shrinker *shrink)
 }
 
 /**
- * xe_shrinker_mod_pages() - Modify shrinker page accounting
+ * xe_shrinker_mod_pages() - Modify shrinker page and object accounting
  * @shrinker: Pointer to the struct xe_shrinker.
  * @shrinkable: Shrinkable pages delta. May be negative.
- * @purgeable: Purgeable page delta. May be negative.
+ * @purgeable: Purgeable pages delta. May be negative.
+ * @tts: Populated ttm_tt count delta. May be negative.
  *
- * Modifies the shrinkable and purgeable pages accounting.
+ * Updates the shrinkable and purgeable page counts and the populated
+ * ttm_tt count.
  */
 void
-xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable)
+xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable,
+		      long tts)
 {
 	write_lock(&shrinker->lock);
 	shrinker->shrinkable_pages += shrinkable;
 	shrinker->purgeable_pages += purgeable;
+	shrinker->populated_tts += tts;
 	write_unlock(&shrinker->lock);
 }
 
@@ -286,6 +292,7 @@ static void xe_shrinker_fini(struct drm_device *drm, void *arg)
 
 	xe_assert(shrinker->xe, !shrinker->shrinkable_pages);
 	xe_assert(shrinker->xe, !shrinker->purgeable_pages);
+	xe_assert(shrinker->xe, !shrinker->populated_tts);
 	shrinker_free(shrinker->shrink);
 	flush_work(&shrinker->pm_worker);
 	kfree(shrinker);
drivers/gpu/drm/xe/xe_shrinker.h +2 -1
index 5132ae5192e1..9c63e22b3b73 100644
@@ -9,7 +9,8 @@
 struct xe_shrinker;
 struct xe_device;
 
-void xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable);
+void xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable,
+			   long tts);
 
 int xe_shrinker_create(struct xe_device *xe);
 
Signature · 1 line
2.56.0
author maintainer
#6 lore raw

PATCH v4 3/4 drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

In reply to Thomas Hellström

Purgeable objects are reclaimed by simply discarding their pages, with no writeback required. They are therefore much cheaper to shrink than regular shrinkable (non-purgeable) objects, whose reclaim may need to wait for the GPU or write dirty compressed contents back to a backup store, and whose contents need to be read back on next use.

Split the single xe_shrinker into two independent struct shrinker instances registered against the shrinker core, sharing the same underlying accounting (shrinkable_pages, purgeable_pages, populated_tts) and locking:

- A purgeable shrinker, whose count_objects() reports only purgeable_pages, and whose scan_objects() only purges objects.

- A non-purgeable (shrinkable) shrinker, whose count_objects() reports the shrinkable page count (capped by backup availability) and whose scan_objects() shrinks non-purgeable objects, and also purges any purgeable objects it encounters, waking the device via runtime PM as needed.

Express the cost difference to the shrinker core through the seeks
value: the purgeable shrinker keeps DEFAULT_SEEKS, while the non-purgeable shrinker uses a higher value, XE_SHRINKER_NON_PURGEABLE_SEEKS (8). The core scales each shrinker's scan target inversely with seeks, so purgeable objects receive proportionally more reclaim pressure than non-purgeable ones, without one shrinker's behaviour depending on the other's state.

The standalone purge walk relies on the LRU walk skipping non-purgeable objects, for which xe_bo_shrink() returns -EBUSY, rather than aborting.

v3:
- Patch introduced. (Matt Brost)

v4:
- The purge walk aborting at the first non-purgeable object is now fixed by a separate, preceding patch. (Sashiko)

Assisted-by LLM
---
 drivers/gpu/drm/xe/xe_shrinker.c | 109 +++++++++++++++++++------------
 1 file changed, 68 insertions(+), 41 deletions(-)
drivers/gpu/drm/xe/xe_shrinker.c +68 -41
index 378022c37a57..8e3fe675e0f3 100644
@@ -14,6 +14,15 @@
 #include "xe_pm.h"
 #include "xe_shrinker.h"
 
+/*
+ * Reclaiming non-purgeable objects requires GPU idling and writeback to a
+ * backup store, and restoring them requires reading the contents back.
+ * Tell the shrinker core they're costlier to recreate than purgeable
+ * objects, which use DEFAULT_SEEKS, so that purgeable objects are
+ * preferentially reclaimed.
+ */
+#define XE_SHRINKER_NON_PURGEABLE_SEEKS 8
+
 /**
  * struct xe_shrinker - per-device shrinker
  * @xe: Back pointer to the device.
@@ -21,7 +30,8 @@
  * @shrinkable_pages: Number of pages that are currently shrinkable.
  * @purgeable_pages: Number of pages that are currently purgeable.
  * @populated_tts: Number of populated ttm_tts currently shrinkable or purgeable.
- * @shrink: Pointer to the mm shrinker.
+ * @shrink: Pointer to the mm shrinker handling non-purgeable (shrinkable) objects.
+ * @purge_shrink: Pointer to the mm shrinker handling purgeable objects.
  * @pm_worker: Worker to wake up the device if required.
  */
 struct xe_shrinker {
@@ -31,6 +41,7 @@ struct xe_shrinker {
 	long purgeable_pages;
 	long populated_tts;
 	struct shrinker *shrink;
+	struct shrinker *purge_shrink;
 	struct work_struct pm_worker;
 };
 
@@ -179,6 +190,19 @@ static int xe_shrinker_walk(struct xe_shrinker *shrinker,
 	return ret;
 }
 
+static unsigned long
+xe_shrinker_count_purgeable(struct shrinker *shrink, struct shrink_control *sc)
+{
+	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
+	unsigned long num_pages;
+
+	read_lock(&shrinker->lock);
+	num_pages = shrinker->purgeable_pages;
+	read_unlock(&shrinker->lock);
+
+	return num_pages ? num_pages : SHRINK_EMPTY;
+}
+
 static unsigned long
 xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 {
@@ -194,7 +218,6 @@ xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 	else
 		num_pages = 0;
 
-	num_pages += shrinker->purgeable_pages;
 	read_unlock(&shrinker->lock);
 
 	return num_pages ? num_pages : SHRINK_EMPTY;
@@ -207,8 +230,7 @@ xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
  * If bo shrinking needs an rpm reference and we don't have it (yet),
  * that bo will be skipped anyway.
  */
-static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker, bool force,
-				       unsigned long nr_to_scan, bool can_backup)
+static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker)
 {
 	struct xe_device *xe = shrinker->xe;
 
@@ -216,63 +238,52 @@ static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker, bool force,
 	    !ttm_backup_bytes_avail())
 		return false;
 
-	if (!force) {
-		read_lock(&shrinker->lock);
-		force = (nr_to_scan > shrinker->purgeable_pages && can_backup);
-		read_unlock(&shrinker->lock);
-		if (!force)
-			return false;
-	}
-
 	return __xe_shrinker_runtime_pm_get(shrinker);
 }
 
-static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+static unsigned long xe_shrinker_scan_purgeable(struct shrinker *shrink,
+						struct shrink_control *sc)
 {
 	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
 	struct ttm_operation_ctx ctx = {
 		.interruptible = false,
 		.no_wait_gpu = ttm_bo_shrink_avoid_wait(),
 	};
-	unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0, freed = 0;
 	struct xe_bo_shrink_flags shrink_flags = {
 		.purge = true,
-		/* Don't request writeback without __GFP_IO. */
-		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO),
 	};
-	bool runtime_pm;
-	bool purgeable;
-	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
-
-	nr_to_scan = sc->nr_to_scan;
-
-	read_lock(&shrinker->lock);
-	purgeable = !!shrinker->purgeable_pages;
-	read_unlock(&shrinker->lock);
 
-	/* Might need runtime PM. Try to wake early if it looks like it. */
-	runtime_pm = xe_shrinker_runtime_pm_get(shrinker, false, nr_to_scan, can_backup);
-
-	if (purgeable && nr_scanned < nr_to_scan)
-		xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-				 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan, &nr_scanned, &freed);
 
 	sc->nr_scanned = nr_scanned;
-	if (nr_scanned >= nr_to_scan || !can_backup)
-		goto out;
 
-	/* If we didn't wake before, try to do it now if needed. */
-	if (!runtime_pm)
-		runtime_pm = xe_shrinker_runtime_pm_get(shrinker, true, 0, can_backup);
+	return nr_scanned ? freed : SHRINK_STOP;
+}
 
-	shrink_flags.purge = false;
+static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+{
+	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
+	struct ttm_operation_ctx ctx = {
+		.interruptible = false,
+		.no_wait_gpu = ttm_bo_shrink_avoid_wait(),
+	};
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0, freed = 0;
+	struct xe_bo_shrink_flags shrink_flags = {
+		.purge = false,
+		/* Don't request writeback without __GFP_IO. */
+		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO),
+	};
+	bool runtime_pm;
+
+	/* Might need runtime PM to access backed-up or CCS-compressed data. */
+	runtime_pm = xe_shrinker_runtime_pm_get(shrinker);
 
-	xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-			 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan, &nr_scanned, &freed);
 
 	sc->nr_scanned = nr_scanned;
-out:
 	xe_shrinker_runtime_pm_put(shrinker, runtime_pm);
+
 	return nr_scanned ? freed : SHRINK_STOP;
 }
 
@@ -294,6 +305,7 @@ static void xe_shrinker_fini(struct drm_device *drm, void *arg)
 	xe_assert(shrinker->xe, !shrinker->purgeable_pages);
 	xe_assert(shrinker->xe, !shrinker->populated_tts);
 	shrinker_free(shrinker->shrink);
+	shrinker_free(shrinker->purge_shrink);
 	flush_work(&shrinker->pm_worker);
 	kfree(shrinker);
 }
@@ -311,8 +323,15 @@ int xe_shrinker_create(struct xe_device *xe)
 	if (!shrinker)
 		return -ENOMEM;
 
-	shrinker->shrink = shrinker_alloc(0, "drm-xe_gem:%s", xe->drm.unique);
+	shrinker->purge_shrink = shrinker_alloc(0, "drm-xe_gem-purgeable:%s", xe->drm.unique);
+	if (!shrinker->purge_shrink) {
+		kfree(shrinker);
+		return -ENOMEM;
+	}
+
+	shrinker->shrink = shrinker_alloc(0, "drm-xe_gem-shrinkable:%s", xe->drm.unique);
 	if (!shrinker->shrink) {
+		shrinker_free(shrinker->purge_shrink);
 		kfree(shrinker);
 		return -ENOMEM;
 	}
@@ -320,10 +339,18 @@ int xe_shrinker_create(struct xe_device *xe)
 	INIT_WORK(&shrinker->pm_worker, xe_shrinker_pm);
 	shrinker->xe = xe;
 	rwlock_init(&shrinker->lock);
+
+	shrinker->purge_shrink->count_objects = xe_shrinker_count_purgeable;
+	shrinker->purge_shrink->scan_objects = xe_shrinker_scan_purgeable;
+	shrinker->purge_shrink->private_data = shrinker;
+	shrinker_register(shrinker->purge_shrink);
+
 	shrinker->shrink->count_objects = xe_shrinker_count;
 	shrinker->shrink->scan_objects = xe_shrinker_scan;
 	shrinker->shrink->private_data = shrinker;
+	shrinker->shrink->seeks = XE_SHRINKER_NON_PURGEABLE_SEEKS;
 	shrinker_register(shrinker->shrink);
+
 	xe->mem.shrinker = shrinker;
 
 	return drmm_add_action_or_reset(&xe->drm, xe_shrinker_fini, shrinker);
Signature · 1 line
2.56.0
#7 lore raw

Re: [PATCH v4 3/4] drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [High] drm/xe: Use-After-Free of shrinker during DRM device teardown - [High] drm/xe: O(N^2) CPU lockup…

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] drm/xe: Use-After-Free of shrinker during DRM device teardown
- [High] drm/xe: O(N^2) CPU lockup in purgeable shrinker due to uncounted LRU skips --

commit 1e9348c2fe4768de2cf24e4dd9b6188400c84043
Author: Thomas Hellström <[email protected]>

drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

This commit splits the single xe_shrinker into two independent shrinker
instances: one for purgeable objects and another for non-purgeable (shrinkable) objects. This allows the shrinker core to apply different reclaim pressures based on the varying costs of reclaiming these object types.

Quoted 4 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 378022c37a57c..8e3fe675e0f34 100644

[ ... ]

Quoted 1 line
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -216,63 +238,52 @@ static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker, bool force,

[ ... ]

Quoted 25 lines
drivers/gpu/drm/xe/xe_shrinker.c +3 -13
-static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+static unsigned long xe_shrinker_scan_purgeable(struct shrinker *shrink,
+						struct shrink_control *sc)
 {
 	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
 	struct ttm_operation_ctx ctx = {
 		.interruptible = false,
 		.no_wait_gpu = ttm_bo_shrink_avoid_wait(),
 	};
-	unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0, freed = 0;
 	struct xe_bo_shrink_flags shrink_flags = {
 		.purge = true,
-		/* Don't request writeback without __GFP_IO. */
-		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO),
 	};
-	bool runtime_pm;
-	bool purgeable;
-	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
-
-	nr_to_scan = sc->nr_to_scan;
-
-	read_lock(&shrinker->lock);
-	purgeable = !!shrinker->purgeable_pages;
-	read_unlock(&shrinker->lock);

drivers/gpu/drm/xe/xe_shrinker.c static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker, bool force, · line 259

Quoted 10 lines
drivers/gpu/drm/xe/xe_shrinker.c +1 -6
 
-	/* Might need runtime PM. Try to wake early if it looks like it. */
-	runtime_pm = xe_shrinker_runtime_pm_get(shrinker, false, nr_to_scan, can_backup);
-
-	if (purgeable && nr_scanned < nr_to_scan)
-		xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-				 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan, &nr_scanned, &freed);
 
 	sc->nr_scanned = nr_scanned;

[Severity: High]
Can this cause an O(N^2) CPU lockup in the purgeable shrinker?

When the memory reclaim core (do_shrink_slab) calls this purgeable scan routine under memory pressure, xe_shrinker_walk() iterates the LRU list.

However, non-purgeable BOs return -EBUSY and are skipped without advancing the scanned counter:

drivers/gpu/drm/xe/xe_bo.c:xe_bo_shrink() {
    ...
    if (!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE) ||
        (flags.purge && !xe_tt->purgeable))
        return -EBUSY;
    ...
}
drivers/gpu/drm/xe/xe_shrinker.c:__xe_shrinker_walk() {
    ...
            lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned);
            /* Like the TTM LRU walk, skip bos we can't shrink now. */
            if (lret == -EBUSY)
                continue;
    ...
}

Since the LRU cursor is initialized locally on each call and non-purgeable BOs do not increment nr_scanned, every batch rescans all leading non-purgeable BOs without significantly advancing sc->nr_scanned.

Will this force the shrinker core to repeatedly call this function, processing the same leading non-purgeable BOs over and over again?

Quoted 8 lines
drivers/gpu/drm/xe/xe_shrinker.c +2 -5
-	if (nr_scanned >= nr_to_scan || !can_backup)
-		goto out;
 
-	/* If we didn't wake before, try to do it now if needed. */
-	if (!runtime_pm)
-		runtime_pm = xe_shrinker_runtime_pm_get(shrinker, true, 0, can_backup);
+	return nr_scanned ? freed : SHRINK_STOP;
+}

[ ... ]

drivers/gpu/drm/xe/xe_shrinker.c static void xe_shrinker_fini(struct drm_device *drm, void *arg) · line 311

Quoted 8 lines
drivers/gpu/drm/xe/xe_shrinker.c +1 -0
@@ -294,6 +305,7 @@ static void xe_shrinker_fini(struct drm_device *drm, void *arg)
 	xe_assert(shrinker->xe, !shrinker->purgeable_pages);
 	xe_assert(shrinker->xe, !shrinker->populated_tts);
 	shrinker_free(shrinker->shrink);
+	shrinker_free(shrinker->purge_shrink);
 	flush_work(&shrinker->pm_worker);
 	kfree(shrinker);
 }

[Severity: High]
Does this kfree(shrinker) leave xe->mem.shrinker as a dangling pointer?

Because drmm actions execute in LIFO order upon device release, xe_shrinker_fini() is called before xe_device_destroy().

Later, xe_device_destroy() runs and calls xe_bo_dev_fini() which flushes the async_free workqueue. Pending BOs in the workqueue will have their final references dropped, leading to xe_ttm_tt_account_subtract():

drivers/gpu/drm/xe/xe_bo.c:xe_ttm_tt_account_subtract() {
    ...
    if (xe_tt->purgeable)
        xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt->num_pages, -1);
    else
        xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0, -1);
    ...
}

Can this lead to a use-after-free and memory corruption when driver unloads?

Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=3
author maintainer
#8 lore raw

Re: [PATCH v4 3/4] drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

Quoted 110 lines · On Fri, 2026-10-16 at 13:53 +0000, [email protected] wrote:

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] drm/xe: Use-After-Free of shrinker during DRM device teardown
- [High] drm/xe: O(N^2) CPU lockup in purgeable shrinker due to uncounted LRU skips
--

commit 1e9348c2fe4768de2cf24e4dd9b6188400c84043
Author: Thomas Hellström <[email protected]>

drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

This commit splits the single xe_shrinker into two independent shrinker
instances: one for purgeable objects and another for non-purgeable (shrinkable) objects. This allows the shrinker core to apply different
reclaim pressures based on the varying costs of reclaiming these object
types.

Quoted 5 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 378022c37a57c..8e3fe675e0f34 100644

[ ... ]

Quoted 2 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -216,63 +238,52 @@ static bool xe_shrinker_runtime_pm_get(struct
 xe_shrinker *shrinker, bool force,

[ ... ]

Quoted 40 lines

-static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+static unsigned long xe_shrinker_scan_purgeable(struct shrinker *shrink,

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+						struct

shrink_control *sc)
 {
  struct xe_shrinker *shrinker = to_xe_shrinker(shrink); struct ttm_operation_ctx ctx = { .interruptible = false,
  .no_wait_gpu = ttm_bo_shrink_avoid_wait(), };

drivers/gpu/drm/xe/xe_shrinker.c +1 -1
-	unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0,

freed = 0;
  struct xe_bo_shrink_flags shrink_flags = { .purge = true,

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-		/* Don't request writeback without __GFP_IO. */
-		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask &

__GFP_IO),
  };

drivers/gpu/drm/xe/xe_shrinker.c +0 -9
-	bool runtime_pm;
-	bool purgeable;
-	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
-
-	nr_to_scan = sc->nr_to_scan;
-
-	read_lock(&shrinker->lock);
-	purgeable = !!shrinker->purgeable_pages;
-	read_unlock(&shrinker->lock);

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	/* Might need runtime PM. Try to wake early if it looks

like it. */

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	runtime_pm = xe_shrinker_runtime_pm_get(shrinker, false,

nr_to_scan, can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +1 -4
-
-	if (purgeable && nr_scanned < nr_to_scan)
-		xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-				 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan,
Quoted 3 lines

&nr_scanned, &freed);

  sc->nr_scanned = nr_scanned;

[Severity: High]
Can this cause an O(N^2) CPU lockup in the purgeable shrinker?

When the memory reclaim core (do_shrink_slab) calls this purgeable scan
routine under memory pressure, xe_shrinker_walk() iterates the LRU list.

However, non-purgeable BOs return -EBUSY and are skipped without advancing
the scanned counter:

drivers/gpu/drm/xe/xe_bo.c:xe_bo_shrink() {
    ...
    if (!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE) || (flags.purge && !xe_tt->purgeable))
        return -EBUSY;
    ...
}

drivers/gpu/drm/xe/xe_shrinker.c:__xe_shrinker_walk() {
    ...
            lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned); /* Like the TTM LRU walk, skip bos we can't shrink now. */
            if (lret == -EBUSY)
                continue;
    ...
}

Quoted 7 lines

Since the LRU cursor is initialized locally on each call and non- purgeable
BOs do not increment nr_scanned, every batch rescans all leading non-purgeable BOs without significantly advancing sc->nr_scanned.

Will this force the shrinker core to repeatedly call this function, processing the same leading non-purgeable BOs over and over again?

This can't happen in practice since purgeable bos are always ordered before non-purgeable bos on the list.

/Thomas

Quoted 50 lines
Quoted 11 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (nr_scanned >= nr_to_scan || !can_backup)
-		goto out;

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	/* If we didn't wake before, try to do it now if needed.

*/

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (!runtime_pm)
-		runtime_pm = xe_shrinker_runtime_pm_get(shrinker,

true, 0, can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +2 -0
+	return nr_scanned ? freed : SHRINK_STOP;
+}

[ ... ]

Quoted 9 lines
drivers/gpu/drm/xe/xe_shrinker.c +1 -0
@@ -294,6 +305,7 @@ static void xe_shrinker_fini(struct drm_device
 *drm, void *arg)
  	xe_assert(shrinker->xe, !shrinker->purgeable_pages);
  	xe_assert(shrinker->xe, !shrinker->populated_tts);
  	shrinker_free(shrinker->shrink);
+	shrinker_free(shrinker->purge_shrink);
  	flush_work(&shrinker->pm_worker);
  	kfree(shrinker);

 }

[Severity: High]
Does this kfree(shrinker) leave xe->mem.shrinker as a dangling pointer?

Because drmm actions execute in LIFO order upon device release, xe_shrinker_fini() is called before xe_device_destroy().

Later, xe_device_destroy() runs and calls xe_bo_dev_fini() which flushes
the async_free workqueue. Pending BOs in the workqueue will have their
final references dropped, leading to xe_ttm_tt_account_subtract():

drivers/gpu/drm/xe/xe_bo.c:xe_ttm_tt_account_subtract() {
    ...
    if (xe_tt->purgeable) xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt-

Quoted 1 line

num_pages, -1);

    else
        xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0, -1);
    ...
}

Can this lead to a use-after-free and memory corruption when driver unloads?

maintainer
#9 lore raw

Re: [PATCH v4 3/4] drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

Quoted 116 lines · Thomas Hellström
Quoted 115 lines · On Fri, 2026-10-16 at 13:53 +0000, [email protected] wrote:

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] drm/xe: Use-After-Free of shrinker during DRM device teardown
- [High] drm/xe: O(N^2) CPU lockup in purgeable shrinker due to uncounted LRU skips
--

commit 1e9348c2fe4768de2cf24e4dd9b6188400c84043
Author: Thomas Hellström <[email protected]>

drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

This commit splits the single xe_shrinker into two independent shrinker
instances: one for purgeable objects and another for non-purgeable (shrinkable) objects. This allows the shrinker core to apply different
reclaim pressures based on the varying costs of reclaiming these object
types.

Quoted 5 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 378022c37a57c..8e3fe675e0f34 100644

[ ... ]

Quoted 2 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -216,63 +238,52 @@ static bool xe_shrinker_runtime_pm_get(struct
 xe_shrinker *shrinker, bool force,

[ ... ]

Quoted 40 lines

-static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+static unsigned long xe_shrinker_scan_purgeable(struct shrinker *shrink,

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+						struct

shrink_control *sc)
 {
  struct xe_shrinker *shrinker = to_xe_shrinker(shrink); struct ttm_operation_ctx ctx = { .interruptible = false,
  .no_wait_gpu = ttm_bo_shrink_avoid_wait(), };

drivers/gpu/drm/xe/xe_shrinker.c +1 -1
-	unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0,

freed = 0;
  struct xe_bo_shrink_flags shrink_flags = { .purge = true,

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-		/* Don't request writeback without __GFP_IO. */
-		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask &

__GFP_IO),
  };

drivers/gpu/drm/xe/xe_shrinker.c +0 -9
-	bool runtime_pm;
-	bool purgeable;
-	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
-
-	nr_to_scan = sc->nr_to_scan;
-
-	read_lock(&shrinker->lock);
-	purgeable = !!shrinker->purgeable_pages;
-	read_unlock(&shrinker->lock);

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	/* Might need runtime PM. Try to wake early if it looks

like it. */

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	runtime_pm = xe_shrinker_runtime_pm_get(shrinker, false,

nr_to_scan, can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +1 -4
-
-	if (purgeable && nr_scanned < nr_to_scan)
-		xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-				 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan,
Quoted 3 lines

&nr_scanned, &freed);

  sc->nr_scanned = nr_scanned;

[Severity: High]
Can this cause an O(N^2) CPU lockup in the purgeable shrinker?

When the memory reclaim core (do_shrink_slab) calls this purgeable scan
routine under memory pressure, xe_shrinker_walk() iterates the LRU list.

However, non-purgeable BOs return -EBUSY and are skipped without advancing
the scanned counter:

drivers/gpu/drm/xe/xe_bo.c:xe_bo_shrink() {
    ...
    if (!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE) || (flags.purge && !xe_tt->purgeable))
        return -EBUSY;
    ...
}

drivers/gpu/drm/xe/xe_shrinker.c:__xe_shrinker_walk() {
    ...
            lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned); /* Like the TTM LRU walk, skip bos we can't shrink now. */
            if (lret == -EBUSY)
                continue;
    ...
}

Since the LRU cursor is initialized locally on each call and non- purgeable
BOs do not increment nr_scanned, every batch rescans all leading non-purgeable BOs without significantly advancing sc->nr_scanned.

Quoted 6 lines
Quoted 2 lines

Will this force the shrinker core to repeatedly call this function, processing the same leading non-purgeable BOs over and over again?

This can't happen in practice since purgeable bos are always ordered before non-purgeable bos on the list.

Is this true, though? If a BO is marked as purged on a hot VM and shares the VM's bulk-move structure, it would remain hot in the list. Also, within an individual bulk-move list, I don't think a purgable object is guaranteed to be at the front of the LRU.

So, at a minimum, BOs marked as purged should be moved to a lower priority band, as this patch does [1], and reclaim should only walk the purged-priority band [2].

We can do this in an immediate follow-up after this series merges.

Matt

[1] https://patchwork.freedesktop.org/patch/743454/?series=170454&rev=5
[2] https://patchwork.freedesktop.org/patch/743454/?series=170454&rev=5

Quoted 54 lines

/Thomas

Quoted 50 lines
Quoted 11 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (nr_scanned >= nr_to_scan || !can_backup)
-		goto out;

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	/* If we didn't wake before, try to do it now if needed.

*/

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (!runtime_pm)
-		runtime_pm = xe_shrinker_runtime_pm_get(shrinker,

true, 0, can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +2 -0
+	return nr_scanned ? freed : SHRINK_STOP;
+}

[ ... ]

Quoted 9 lines
drivers/gpu/drm/xe/xe_shrinker.c +1 -0
@@ -294,6 +305,7 @@ static void xe_shrinker_fini(struct drm_device
 *drm, void *arg)
  	xe_assert(shrinker->xe, !shrinker->purgeable_pages);
  	xe_assert(shrinker->xe, !shrinker->populated_tts);
  	shrinker_free(shrinker->shrink);
+	shrinker_free(shrinker->purge_shrink);
  	flush_work(&shrinker->pm_worker);
  	kfree(shrinker);

 }

[Severity: High]
Does this kfree(shrinker) leave xe->mem.shrinker as a dangling pointer?

Because drmm actions execute in LIFO order upon device release, xe_shrinker_fini() is called before xe_device_destroy().

Later, xe_device_destroy() runs and calls xe_bo_dev_fini() which flushes
the async_free workqueue. Pending BOs in the workqueue will have their
final references dropped, leading to xe_ttm_tt_account_subtract():

drivers/gpu/drm/xe/xe_bo.c:xe_ttm_tt_account_subtract() {
    ...
    if (xe_tt->purgeable) xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt-

Quoted 1 line

num_pages, -1);

    else
        xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0, -1);
    ...
}

Can this lead to a use-after-free and memory corruption when driver unloads?

author maintainer
#10 lore raw

Re: [PATCH v4 3/4] drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

Quoted 148 lines · Matthew Brost
Quoted 130 lines · Thomas Hellström
Quoted 129 lines · On Fri, 2026-10-16 at 13:53 +0000, [email protected] wrote:

Thank you for your contribution! Sashiko AI review found 2 potential
issue(s) to consider:
- [High] drm/xe: Use-After-Free of shrinker during DRM device teardown
- [High] drm/xe: O(N^2) CPU lockup in purgeable shrinker due to uncounted LRU skips
--

commit 1e9348c2fe4768de2cf24e4dd9b6188400c84043
Author: Thomas Hellström <[email protected]>

drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

This commit splits the single xe_shrinker into two independent shrinker
instances: one for purgeable objects and another for non- purgeable
(shrinkable) objects. This allows the shrinker core to apply different
reclaim pressures based on the varying costs of reclaiming these object
types.

Quoted 5 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 378022c37a57c..8e3fe675e0f34 100644

[ ... ]

Quoted 3 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -216,63 +238,52 @@ static bool

xe_shrinker_runtime_pm_get(struct
xe_shrinker *shrinker, bool force,

[ ... ]

Quoted 47 lines

-static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+static unsigned long xe_shrinker_scan_purgeable(struct shrinker
*shrink,

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+						struct

shrink_control *sc)
 {
  struct xe_shrinker *shrinker = to_xe_shrinker(shrink); struct ttm_operation_ctx ctx = { .interruptible = false,
  .no_wait_gpu = ttm_bo_shrink_avoid_wait(), };

drivers/gpu/drm/xe/xe_shrinker.c +1 -1
-	unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned

= 0,
freed = 0;
  struct xe_bo_shrink_flags shrink_flags = { .purge = true,

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-		/* Don't request writeback without __GFP_IO.

*/

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask

&
__GFP_IO),
  };

drivers/gpu/drm/xe/xe_shrinker.c +0 -9
-	bool runtime_pm;
-	bool purgeable;
-	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
-
-	nr_to_scan = sc->nr_to_scan;
-
-	read_lock(&shrinker->lock);
-	purgeable = !!shrinker->purgeable_pages;
-	read_unlock(&shrinker->lock);

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	/* Might need runtime PM. Try to wake early if it

looks
like it. */

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	runtime_pm = xe_shrinker_runtime_pm_get(shrinker,

false,
nr_to_scan, can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +0 -4
-
-	if (purgeable && nr_scanned < nr_to_scan)
-		xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-				 nr_to_scan, &nr_scanned,

&freed);

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags,
Quoted 4 lines

nr_to_scan,
&nr_scanned, &freed);

  sc->nr_scanned = nr_scanned;

[Severity: High]
Can this cause an O(N^2) CPU lockup in the purgeable shrinker?

When the memory reclaim core (do_shrink_slab) calls this purgeable
scan
routine under memory pressure, xe_shrinker_walk() iterates the LRU
list.

However, non-purgeable BOs return -EBUSY and are skipped without advancing
the scanned counter:

drivers/gpu/drm/xe/xe_bo.c:xe_bo_shrink() {
    ...
    if (!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE) || (flags.purge && !xe_tt->purgeable))
        return -EBUSY;
    ...
}

drivers/gpu/drm/xe/xe_shrinker.c:__xe_shrinker_walk() {
    ...
            lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned); /* Like the TTM LRU walk, skip bos we can't shrink now.
*/
            if (lret == -EBUSY)
                continue;
    ...
}

Since the LRU cursor is initialized locally on each call and non- purgeable
BOs do not increment nr_scanned, every batch rescans all leading non-purgeable BOs without significantly advancing sc->nr_scanned.

Quoted 9 lines
Quoted 4 lines

Will this force the shrinker core to repeatedly call this function,
processing the same leading non-purgeable BOs over and over again?

This can't happen in practice since purgeable bos are always ordered
before non-purgeable bos on the list.

Is this true, though? If a BO is marked as purged on a hot VM and shares
the VM's bulk-move structure, it would remain hot in the list. Also, within an individual bulk-move list, I don't think a purgable object is
guaranteed to be at the front of the LRU.

Quoted 4 lines

So, at a minimum, BOs marked as purged should be moved to a lower priority band, as this patch does [1], and reclaim should only walk the
purged-priority band [2].

TBH, I thought we already had [1]. But even [2] sounds like a good optimization, although the link seems incorrect.

Quoted 2 lines

We can do this in an immediate follow-up after this series merges.

OK let's do that.
Thanks,

Thomas

Quoted 68 lines

Matt

[1]
https://patchwork.freedesktop.org/patch/743454/?series=170454&rev=5
[2]
https://patchwork.freedesktop.org/patch/743454/?series=170454&rev=5

Quoted 60 lines

/Thomas

Quoted 56 lines
Quoted 13 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (nr_scanned >= nr_to_scan || !can_backup)
-		goto out;

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	/* If we didn't wake before, try to do it now if

needed.
*/

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (!runtime_pm)
-		runtime_pm =

xe_shrinker_runtime_pm_get(shrinker,
true, 0, can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +2 -0
+	return nr_scanned ? freed : SHRINK_STOP;
+}

[ ... ]

Quoted 10 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -294,6 +305,7 @@ static void xe_shrinker_fini(struct

drm_device
*drm, void *arg)
  xe_assert(shrinker->xe, !shrinker->purgeable_pages); xe_assert(shrinker->xe, !shrinker->populated_tts); shrinker_free(shrinker->shrink);

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+	shrinker_free(shrinker->purge_shrink);

  flush_work(&shrinker->pm_worker);
  kfree(shrinker);
 }

[Severity: High]
Does this kfree(shrinker) leave xe->mem.shrinker as a dangling pointer?

Because drmm actions execute in LIFO order upon device release, xe_shrinker_fini() is called before xe_device_destroy().

Later, xe_device_destroy() runs and calls xe_bo_dev_fini() which flushes
the async_free workqueue. Pending BOs in the workqueue will have their
final references dropped, leading to xe_ttm_tt_account_subtract():

drivers/gpu/drm/xe/xe_bo.c:xe_ttm_tt_account_subtract() {
    ...
    if (xe_tt->purgeable) xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt-

Quoted 1 line

num_pages, -1);

    else
        xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt-

Quoted 1 line

num_pages,

0, -1);
    ...
}

Can this lead to a use-after-free and memory corruption when driver
unloads?

maintainer
#11 lore raw

Re: [PATCH v4 3/4] drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

In reply to Thomas Hellström
Quoted 51 lines · Thomas Hellström

Purgeable objects are reclaimed by simply discarding their pages, with no writeback required. They are therefore much cheaper to shrink than regular shrinkable (non-purgeable) objects, whose reclaim may need to wait for the GPU or write dirty compressed contents back to a backup store, and whose contents need to be read back on next use.

Split the single xe_shrinker into two independent struct shrinker instances registered against the shrinker core, sharing the same underlying accounting (shrinkable_pages, purgeable_pages, populated_tts) and locking:

- A purgeable shrinker, whose count_objects() reports only purgeable_pages, and whose scan_objects() only purges objects.

- A non-purgeable (shrinkable) shrinker, whose count_objects() reports the shrinkable page count (capped by backup availability) and whose scan_objects() shrinks non-purgeable objects, and also purges any purgeable objects it encounters, waking the device via runtime PM as needed.

Express the cost difference to the shrinker core through the seeks
value: the purgeable shrinker keeps DEFAULT_SEEKS, while the non-purgeable shrinker uses a higher value, XE_SHRINKER_NON_PURGEABLE_SEEKS (8). The core scales each shrinker's scan target inversely with seeks, so purgeable objects receive proportionally more reclaim pressure than non-purgeable ones, without one shrinker's behaviour depending on the other's state.

The standalone purge walk relies on the LRU walk skipping non-purgeable objects, for which xe_bo_shrink() returns -EBUSY, rather than aborting.

v3:
- Patch introduced. (Matt Brost)

v4:
- The purge walk aborting at the first non-purgeable object is now fixed by a separate, preceding patch. (Sashiko)

Assisted-by LLM
---
 drivers/gpu/drm/xe/xe_shrinker.c | 109 +++++++++++++++++++------------
 1 file changed, 68 insertions(+), 41 deletions(-)
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 378022c37a57..8e3fe675e0f3 100644
@@ -14,6 +14,15 @@
 #include "xe_pm.h"

drivers/gpu/drm/xe/xe_shrinker.c line 24

Quoted 10 lines
drivers/gpu/drm/xe/xe_shrinker.c +8 -0
 #include "xe_shrinker.h"
 
+/*
+ * Reclaiming non-purgeable objects requires GPU idling and writeback to a
+ * backup store, and restoring them requires reading the contents back.
+ * Tell the shrinker core they're costlier to recreate than purgeable
+ * objects, which use DEFAULT_SEEKS, so that purgeable objects are
+ * preferentially reclaimed.
+ */
+#define XE_SHRINKER_NON_PURGEABLE_SEEKS 8

I suggest for full tuning this tied to a Kconfig + plus syfs entry like I have here [1] so customers can play around with various configs.

[1] https://patchwork.freedesktop.org/series/176251/

Most everything every LGTM, but I think the Sashiko comment it somewhat valid, I'll reply there.

Matt

Quoted 196 lines
drivers/gpu/drm/xe/xe_shrinker.c +60 -41
+
 /**
  * struct xe_shrinker - per-device shrinker
  * @xe: Back pointer to the device.
@@ -21,7 +30,8 @@
  * @shrinkable_pages: Number of pages that are currently shrinkable.
  * @purgeable_pages: Number of pages that are currently purgeable.
  * @populated_tts: Number of populated ttm_tts currently shrinkable or purgeable.
- * @shrink: Pointer to the mm shrinker.
+ * @shrink: Pointer to the mm shrinker handling non-purgeable (shrinkable) objects.
+ * @purge_shrink: Pointer to the mm shrinker handling purgeable objects.
  * @pm_worker: Worker to wake up the device if required.
  */
 struct xe_shrinker {
@@ -31,6 +41,7 @@ struct xe_shrinker {
 	long purgeable_pages;
 	long populated_tts;
 	struct shrinker *shrink;
+	struct shrinker *purge_shrink;
 	struct work_struct pm_worker;
 };
 
@@ -179,6 +190,19 @@ static int xe_shrinker_walk(struct xe_shrinker *shrinker,
 	return ret;
 }
 
+static unsigned long
+xe_shrinker_count_purgeable(struct shrinker *shrink, struct shrink_control *sc)
+{
+	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
+	unsigned long num_pages;
+
+	read_lock(&shrinker->lock);
+	num_pages = shrinker->purgeable_pages;
+	read_unlock(&shrinker->lock);
+
+	return num_pages ? num_pages : SHRINK_EMPTY;
+}
+
 static unsigned long
 xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 {
@@ -194,7 +218,6 @@ xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 	else
 		num_pages = 0;
 
-	num_pages += shrinker->purgeable_pages;
 	read_unlock(&shrinker->lock);
 
 	return num_pages ? num_pages : SHRINK_EMPTY;
@@ -207,8 +230,7 @@ xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
  * If bo shrinking needs an rpm reference and we don't have it (yet),
  * that bo will be skipped anyway.
  */
-static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker, bool force,
-				       unsigned long nr_to_scan, bool can_backup)
+static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker)
 {
 	struct xe_device *xe = shrinker->xe;
 
@@ -216,63 +238,52 @@ static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker, bool force,
 	    !ttm_backup_bytes_avail())
 		return false;
 
-	if (!force) {
-		read_lock(&shrinker->lock);
-		force = (nr_to_scan > shrinker->purgeable_pages && can_backup);
-		read_unlock(&shrinker->lock);
-		if (!force)
-			return false;
-	}
-
 	return __xe_shrinker_runtime_pm_get(shrinker);
 }
 
-static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+static unsigned long xe_shrinker_scan_purgeable(struct shrinker *shrink,
+						struct shrink_control *sc)
 {
 	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
 	struct ttm_operation_ctx ctx = {
 		.interruptible = false,
 		.no_wait_gpu = ttm_bo_shrink_avoid_wait(),
 	};
-	unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0, freed = 0;
 	struct xe_bo_shrink_flags shrink_flags = {
 		.purge = true,
-		/* Don't request writeback without __GFP_IO. */
-		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO),
 	};
-	bool runtime_pm;
-	bool purgeable;
-	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
-
-	nr_to_scan = sc->nr_to_scan;
-
-	read_lock(&shrinker->lock);
-	purgeable = !!shrinker->purgeable_pages;
-	read_unlock(&shrinker->lock);
 
-	/* Might need runtime PM. Try to wake early if it looks like it. */
-	runtime_pm = xe_shrinker_runtime_pm_get(shrinker, false, nr_to_scan, can_backup);
-
-	if (purgeable && nr_scanned < nr_to_scan)
-		xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-				 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan, &nr_scanned, &freed);
 
 	sc->nr_scanned = nr_scanned;
-	if (nr_scanned >= nr_to_scan || !can_backup)
-		goto out;
 
-	/* If we didn't wake before, try to do it now if needed. */
-	if (!runtime_pm)
-		runtime_pm = xe_shrinker_runtime_pm_get(shrinker, true, 0, can_backup);
+	return nr_scanned ? freed : SHRINK_STOP;
+}
 
-	shrink_flags.purge = false;
+static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+{
+	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
+	struct ttm_operation_ctx ctx = {
+		.interruptible = false,
+		.no_wait_gpu = ttm_bo_shrink_avoid_wait(),
+	};
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0, freed = 0;
+	struct xe_bo_shrink_flags shrink_flags = {
+		.purge = false,
+		/* Don't request writeback without __GFP_IO. */
+		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO),
+	};
+	bool runtime_pm;
+
+	/* Might need runtime PM to access backed-up or CCS-compressed data. */
+	runtime_pm = xe_shrinker_runtime_pm_get(shrinker);
 
-	xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-			 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan, &nr_scanned, &freed);
 
 	sc->nr_scanned = nr_scanned;
-out:
 	xe_shrinker_runtime_pm_put(shrinker, runtime_pm);
+
 	return nr_scanned ? freed : SHRINK_STOP;
 }
 
@@ -294,6 +305,7 @@ static void xe_shrinker_fini(struct drm_device *drm, void *arg)
 	xe_assert(shrinker->xe, !shrinker->purgeable_pages);
 	xe_assert(shrinker->xe, !shrinker->populated_tts);
 	shrinker_free(shrinker->shrink);
+	shrinker_free(shrinker->purge_shrink);
 	flush_work(&shrinker->pm_worker);
 	kfree(shrinker);
 }
@@ -311,8 +323,15 @@ int xe_shrinker_create(struct xe_device *xe)
 	if (!shrinker)
 		return -ENOMEM;
 
-	shrinker->shrink = shrinker_alloc(0, "drm-xe_gem:%s", xe->drm.unique);
+	shrinker->purge_shrink = shrinker_alloc(0, "drm-xe_gem-purgeable:%s", xe->drm.unique);
+	if (!shrinker->purge_shrink) {
+		kfree(shrinker);
+		return -ENOMEM;
+	}
+
+	shrinker->shrink = shrinker_alloc(0, "drm-xe_gem-shrinkable:%s", xe->drm.unique);
 	if (!shrinker->shrink) {
+		shrinker_free(shrinker->purge_shrink);
 		kfree(shrinker);
 		return -ENOMEM;
 	}
@@ -320,10 +339,18 @@ int xe_shrinker_create(struct xe_device *xe)
 	INIT_WORK(&shrinker->pm_worker, xe_shrinker_pm);
 	shrinker->xe = xe;
 	rwlock_init(&shrinker->lock);
+
+	shrinker->purge_shrink->count_objects = xe_shrinker_count_purgeable;
+	shrinker->purge_shrink->scan_objects = xe_shrinker_scan_purgeable;
+	shrinker->purge_shrink->private_data = shrinker;
+	shrinker_register(shrinker->purge_shrink);
+
 	shrinker->shrink->count_objects = xe_shrinker_count;
 	shrinker->shrink->scan_objects = xe_shrinker_scan;
 	shrinker->shrink->private_data = shrinker;
+	shrinker->shrink->seeks = XE_SHRINKER_NON_PURGEABLE_SEEKS;
 	shrinker_register(shrinker->shrink);
+
 	xe->mem.shrinker = shrinker;
 
 	return drmm_add_action_or_reset(&xe->drm, xe_shrinker_fini, shrinker);
Signature · 1 line
2.56.0
author maintainer
#12 lore raw

Re: [PATCH v4 3/4] drm/xe: Split the bo shrinker into purgeable and non-purgeable shrinkers

Quoted 80 lines · Matthew Brost
Quoted 66 lines · Thomas Hellström

Purgeable objects are reclaimed by simply discarding their pages, with
no writeback required. They are therefore much cheaper to shrink than
regular shrinkable (non-purgeable) objects, whose reclaim may need to
wait for the GPU or write dirty compressed contents back to a backup
store, and whose contents need to be read back on next use.

Split the single xe_shrinker into two independent struct shrinker instances registered against the shrinker core, sharing the same underlying accounting (shrinkable_pages, purgeable_pages, populated_tts) and locking:

 - A purgeable shrinker, whose count_objects() reports only purgeable_pages, and whose scan_objects() only purges objects.

 - A non-purgeable (shrinkable) shrinker, whose count_objects() reports the shrinkable page count (capped by backup availability)
   and whose scan_objects() shrinks non-purgeable objects, and also purges any purgeable objects it encounters, waking the device via
   runtime PM as needed.

Express the cost difference to the shrinker core through the seeks
value: the purgeable shrinker keeps DEFAULT_SEEKS, while the non-purgeable shrinker uses a higher value, XE_SHRINKER_NON_PURGEABLE_SEEKS (8). The core scales each shrinker's
scan target inversely with seeks, so purgeable objects receive proportionally more reclaim pressure than non-purgeable ones, without
one shrinker's behaviour depending on the other's state.

The standalone purge walk relies on the LRU walk skipping non-purgeable objects, for which xe_bo_shrink() returns -EBUSY, rather than aborting.

v3:
- Patch introduced. (Matt Brost)

v4:
- The purge walk aborting at the first non-purgeable object is now fixed by a separate, preceding patch. (Sashiko)

Assisted-by LLM

---
 drivers/gpu/drm/xe/xe_shrinker.c | 109 +++++++++++++++++++--------
----

 1 file changed, 68 insertions(+), 41 deletions(-)
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 378022c37a57..8e3fe675e0f3 100644
@@ -14,6 +14,15 @@
  #include "xe_pm.h"
  #include "xe_shrinker.h"


+/*
+ * Reclaiming non-purgeable objects requires GPU idling and writeback to a

Quoted 8 lines

+ * backup store, and restoring them requires reading the contents back.
+ * Tell the shrinker core they're costlier to recreate than purgeable
+ * objects, which use DEFAULT_SEEKS, so that purgeable objects are
+ * preferentially reclaimed.
+ */
+#define XE_SHRINKER_NON_PURGEABLE_SEEKS 8

I suggest for full tuning this tied to a Kconfig + plus syfs entry like
I have here [1] so customers can play around with various configs.

Quoted 1 line

[1] https://patchwork.freedesktop.org/series/176251/

Thanks for reviewing. I'll take a look at that.
/Thomas

Quoted 240 lines

Most everything every LGTM, but I think the Sashiko comment it somewhat
valid, I'll reply there.

Matt

Quoted 233 lines

+
 /**
  * struct xe_shrinker - per-device shrinker
  * @xe: Back pointer to the device.

drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -21,7 +30,8 @@
   * @shrinkable_pages: Number of pages that are currently

shrinkable.
  * @purgeable_pages: Number of pages that are currently purgeable.
  * @populated_tts: Number of populated ttm_tts currently shrinkable or purgeable.
- * @shrink: Pointer to the mm shrinker.
+ * @shrink: Pointer to the mm shrinker handling non-purgeable (shrinkable) objects.
+ * @purge_shrink: Pointer to the mm shrinker handling purgeable objects.
  * @pm_worker: Worker to wake up the device if required. */
 struct xe_shrinker {

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
@@ -31,6 +41,7 @@ struct xe_shrinker {
  	long purgeable_pages;
  	long populated_tts;
  	struct shrinker *shrink;
+	struct shrinker *purge_shrink;
  	struct work_struct pm_worker;
  };

drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -179,6 +190,19 @@ static int xe_shrinker_walk(struct xe_shrinker
 *shrinker,
  	return ret;
  }

drivers/gpu/drm/xe/xe_shrinker.c +2 -0
+static unsigned long
+xe_shrinker_count_purgeable(struct shrinker *shrink, struct

shrink_control *sc)

drivers/gpu/drm/xe/xe_shrinker.c +11 -0
+{
+	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
+	unsigned long num_pages;
+
+	read_lock(&shrinker->lock);
+	num_pages = shrinker->purgeable_pages;
+	read_unlock(&shrinker->lock);
+
+	return num_pages ? num_pages : SHRINK_EMPTY;
+}
+

 static unsigned long
 xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 {

drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -194,7 +218,6 @@ xe_shrinker_count(struct shrinker *shrink,
 struct shrink_control *sc)

  else
  num_pages = 0;

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	num_pages += shrinker->purgeable_pages;

  read_unlock(&shrinker->lock);

  return num_pages ? num_pages : SHRINK_EMPTY;

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
@@ -207,8 +230,7 @@ xe_shrinker_count(struct shrinker *shrink,
 struct shrink_control *sc)
   * If bo shrinking needs an rpm reference and we don't have it
 (yet),
   * that bo will be skipped anyway.
   */
-static bool xe_shrinker_runtime_pm_get(struct xe_shrinker
 *shrinker, bool force,
-				       unsigned long nr_to_scan,

bool can_backup)
+static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker)
 {
  struct xe_device *xe = shrinker->xe;

drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -216,63 +238,52 @@ static bool xe_shrinker_runtime_pm_get(struct
 xe_shrinker *shrinker, bool force,
  	    !ttm_backup_bytes_avail())
  		return false;

drivers/gpu/drm/xe/xe_shrinker.c +0 -3
-	if (!force) {
-		read_lock(&shrinker->lock);
-		force = (nr_to_scan > shrinker->purgeable_pages &&

can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +0 -5
-		read_unlock(&shrinker->lock);
-		if (!force)
-			return false;
-	}
-

  return __xe_shrinker_runtime_pm_get(shrinker); }

-static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+static unsigned long xe_shrinker_scan_purgeable(struct shrinker *shrink,

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+						struct

shrink_control *sc)
 {
  struct xe_shrinker *shrinker = to_xe_shrinker(shrink); struct ttm_operation_ctx ctx = { .interruptible = false,
  .no_wait_gpu = ttm_bo_shrink_avoid_wait(), };

drivers/gpu/drm/xe/xe_shrinker.c +1 -1
-	unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0,

freed = 0;
  struct xe_bo_shrink_flags shrink_flags = { .purge = true,

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-		/* Don't request writeback without __GFP_IO. */
-		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask &

__GFP_IO),
  };

drivers/gpu/drm/xe/xe_shrinker.c +0 -9
-	bool runtime_pm;
-	bool purgeable;
-	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
-
-	nr_to_scan = sc->nr_to_scan;
-
-	read_lock(&shrinker->lock);
-	purgeable = !!shrinker->purgeable_pages;
-	read_unlock(&shrinker->lock);

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	/* Might need runtime PM. Try to wake early if it looks

like it. */

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	runtime_pm = xe_shrinker_runtime_pm_get(shrinker, false,

nr_to_scan, can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +1 -4
-
-	if (purgeable && nr_scanned < nr_to_scan)
-		xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-				 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan,

&nr_scanned, &freed);

  sc->nr_scanned = nr_scanned;

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (nr_scanned >= nr_to_scan || !can_backup)
-		goto out;

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	/* If we didn't wake before, try to do it now if needed.

*/

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (!runtime_pm)
-		runtime_pm = xe_shrinker_runtime_pm_get(shrinker,

true, 0, can_backup);

drivers/gpu/drm/xe/xe_shrinker.c +2 -0
+	return nr_scanned ? freed : SHRINK_STOP;
+}

drivers/gpu/drm/xe/xe_shrinker.c +1 -1
-	shrink_flags.purge = false;
+static unsigned long xe_shrinker_scan(struct shrinker *shrink,

struct shrink_control *sc)

drivers/gpu/drm/xe/xe_shrinker.c +7 -0
+{
+	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
+	struct ttm_operation_ctx ctx = {
+		.interruptible = false,
+		.no_wait_gpu = ttm_bo_shrink_avoid_wait(),
+	};
+	unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0,

freed = 0;

drivers/gpu/drm/xe/xe_shrinker.c +4 -0
+	struct xe_bo_shrink_flags shrink_flags = {
+		.purge = false,
+		/* Don't request writeback without __GFP_IO. */
+		.writeback = !ctx.no_wait_gpu && (sc->gfp_mask &

__GFP_IO),

drivers/gpu/drm/xe/xe_shrinker.c +4 -0
+	};
+	bool runtime_pm;
+
+	/* Might need runtime PM to access backed-up or CCS-

compressed data. */

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+	runtime_pm = xe_shrinker_runtime_pm_get(shrinker);

drivers/gpu/drm/xe/xe_shrinker.c +1 -2
-	xe_shrinker_walk(shrinker, &ctx, shrink_flags,
-			 nr_to_scan, &nr_scanned, &freed);
+	xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan,

&nr_scanned, &freed);

  sc->nr_scanned = nr_scanned;
-out:
  xe_shrinker_runtime_pm_put(shrinker, runtime_pm); +
  return nr_scanned ? freed : SHRINK_STOP; }

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
@@ -294,6 +305,7 @@ static void xe_shrinker_fini(struct drm_device
 *drm, void *arg)
  	xe_assert(shrinker->xe, !shrinker->purgeable_pages);
  	xe_assert(shrinker->xe, !shrinker->populated_tts);
  	shrinker_free(shrinker->shrink);
+	shrinker_free(shrinker->purge_shrink);
  	flush_work(&shrinker->pm_worker);
  	kfree(shrinker);

 }

drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -311,8 +323,15 @@ int xe_shrinker_create(struct xe_device *xe)
  	if (!shrinker)
  		return -ENOMEM;

drivers/gpu/drm/xe/xe_shrinker.c +0 -1
-	shrinker->shrink = shrinker_alloc(0, "drm-xe_gem:%s", xe-
Quoted 1 line

drm.unique);

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+	shrinker->purge_shrink = shrinker_alloc(0, "drm-xe_gem-

purgeable:%s", xe->drm.unique);

drivers/gpu/drm/xe/xe_shrinker.c +6 -0
+	if (!shrinker->purge_shrink) {
+		kfree(shrinker);
+		return -ENOMEM;
+	}
+
+	shrinker->shrink = shrinker_alloc(0, "drm-xe_gem-

shrinkable:%s", xe->drm.unique);
  if (!shrinker->shrink) {

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+		shrinker_free(shrinker->purge_shrink);

  kfree(shrinker);
  return -ENOMEM;
  }

drivers/gpu/drm/xe/xe_shrinker.c +8 -0
@@ -320,10 +339,18 @@ int xe_shrinker_create(struct xe_device *xe)
  	INIT_WORK(&shrinker->pm_worker, xe_shrinker_pm);
  	shrinker->xe = xe;
  	rwlock_init(&shrinker->lock);
+
+	shrinker->purge_shrink->count_objects =
 xe_shrinker_count_purgeable;
+	shrinker->purge_shrink->scan_objects =
 xe_shrinker_scan_purgeable;
+	shrinker->purge_shrink->private_data = shrinker;
+	shrinker_register(shrinker->purge_shrink);
+
  	shrinker->shrink->count_objects = xe_shrinker_count;
  	shrinker->shrink->scan_objects = xe_shrinker_scan;
  	shrinker->shrink->private_data = shrinker;
+	shrinker->shrink->seeks = XE_SHRINKER_NON_PURGEABLE_SEEKS;
  	shrinker_register(shrinker->shrink);
+
  	xe->mem.shrinker = shrinker;


  return drmm_add_action_or_reset(&xe->drm,
xe_shrinker_fini, shrinker);

Signature · 1 line
2.56.0
author maintainer
#13 lore raw

PATCH v4 4/4 drm/xe: Update non-purgeable shrinker batch size based on average BO size

In reply to Thomas Hellström

Update our preferred vmscan batch size for the non-purgeable shrinker on count passes that allow backup (__GFP_FS), to avoid invoking scan_objects() for requests too small to free even a single average-sized GEM object. Our rough estimate for an effective batch is twice the average number of pages per populated ttm_tt across the full shrinkable and purgeable population. The factor of two provides headroom so that most scan invocations can free at least one GEM object despite variability in object sizes.

The batch value is updated as an exponential moving average, (old_batch + avg) / 2, to smooth out sudden changes in the object population. It is floored at 128 pages, the kernel default SHRINK_BATCH, to ensure the shrinker remains responsive when there are very few objects.

The populated_tts counter introduced in an earlier commit provides the object count needed for the average. We inherit the same justification as the analogous mechanism in i915: shrinking a GEM object has non-trivial per-object overhead, so firing the shrinker for requests smaller than a single object is wasteful.

This is only applied to the non-purgeable shrinker: purgeable objects are reclaimed without writeback or GPU idling, so they're cheap enough that the core default batch size is fine for them.

v3:
- Original patch reworked on top of shrinker split (Matt Brost)

Assisted-by LLM
---
 drivers/gpu/drm/xe/xe_shrinker.c | 48 ++++++++++++++++++++++++++++----
 1 file changed, 42 insertions(+), 6 deletions(-)
drivers/gpu/drm/xe/xe_shrinker.c +42 -6
index 8e3fe675e0f3..955908b3bdf3 100644
@@ -30,6 +30,8 @@
  * @shrinkable_pages: Number of pages that are currently shrinkable.
  * @purgeable_pages: Number of pages that are currently purgeable.
  * @populated_tts: Number of populated ttm_tts currently shrinkable or purgeable.
+ * @batch_avg: Exponential moving average of the preferred non-purgeable
+ * batch size, based on the average populated ttm_tt size.
  * @shrink: Pointer to the mm shrinker handling non-purgeable (shrinkable) objects.
  * @purge_shrink: Pointer to the mm shrinker handling purgeable objects.
  * @pm_worker: Worker to wake up the device if required.
@@ -40,6 +42,7 @@ struct xe_shrinker {
 	long shrinkable_pages;
 	long purgeable_pages;
 	long populated_tts;
+	long batch_avg;
 	struct shrinker *shrink;
 	struct shrinker *purge_shrink;
 	struct work_struct pm_worker;
@@ -203,6 +206,28 @@ xe_shrinker_count_purgeable(struct shrinker *shrink, struct shrink_control *sc)
 	return num_pages ? num_pages : SHRINK_EMPTY;
 }
 
+/**
+ * DOC: Batch size calculation
+ *
+ * Update our preferred vmscan batch size for the non-purgeable shrinker
+ * on count passes that allow backup (__GFP_FS), to avoid invoking
+ * scan_objects() for requests too small to free even a single
+ * average-sized GEM object. Our rough estimate for an effective batch
+ * is twice the average number of pages per populated ttm_tt across
+ * the full shrinkable and purgeable population. The factor of two
+ * provides headroom so that most scan invocations can free at least one
+ * GEM object despite variability in object sizes.
+ *
+ * The batch value is updated as an exponential moving average,
+ * (old_batch + avg) / 2, to smooth out sudden changes in the object
+ * population. It is floored at 128 pages, the kernel default
+ * SHRINK_BATCH, to ensure the shrinker remains responsive when there
+ * are very few objects.
+ *
+ * We only do this for the non-purgeable shrinker: purgeable objects are
+ * reclaimed without writeback or GPU idling, so shrinking them is cheap
+ * enough that the core default batch size is fine.
+ */
 static unsigned long
 xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 {
@@ -210,15 +235,26 @@ xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 	unsigned long num_pages;
 	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
 
+	if (!can_backup)
+		return SHRINK_EMPTY;
+
 	num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
-	read_lock(&shrinker->lock);
+	/* Consistently use write_lock() for simplicity. */
+	write_lock(&shrinker->lock);
 
-	if (can_backup)
-		num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
-	else
-		num_pages = 0;
+	num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
 
-	read_unlock(&shrinker->lock);
+	if (shrinker->populated_tts) {
+		unsigned long avg = 2 * (shrinker->shrinkable_pages +
+					 shrinker->purgeable_pages) /
+				     shrinker->populated_tts;
+
+		shrinker->batch_avg = max((shrinker->batch_avg + (long)avg) >> 1,
+					  128L /* default SHRINK_BATCH */);
+		WRITE_ONCE(shrink->batch, shrinker->batch_avg);
+	}
+
+	write_unlock(&shrinker->lock);
 
 	return num_pages ? num_pages : SHRINK_EMPTY;
 }
Signature · 1 line
2.56.0
#14 lore raw

Re: [PATCH v4 4/4] drm/xe: Update non-purgeable shrinker batch size based on average BO size

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Medium] drm/xe: shrinker count callback serializes direct reclaim via write_lock --

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] drm/xe: shrinker count callback serializes direct reclaim via write_lock --

commit a78bd8842e67f957a2ced6d827e1c4a6430ff29b
Author: Thomas Hellström <[email protected]> drm/xe: Update non-purgeable shrinker batch size based on average BO size

This commit updates the preferred vmscan batch size for the non-purgeable shrinker based on the average buffer object size. It introduces an exponential moving average that is updated during the shrinker count phase.

Quoted 4 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 8e3fe675e0f34..955908b3bdf3e 100644

[ ... ]

drivers/gpu/drm/xe/xe_shrinker.c xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc) · line 243

Quoted 11 lines
drivers/gpu/drm/xe/xe_shrinker.c +5 -1
@@ -210,15 +235,26 @@ xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 	unsigned long num_pages;
 	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
 
+	if (!can_backup)
+		return SHRINK_EMPTY;
+
 	num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
-	read_lock(&shrinker->lock);
+	/* Consistently use write_lock() for simplicity. */
+	write_lock(&shrinker->lock);

[Severity: Medium]
Will this exclusive write lock create a system-wide performance bottleneck during memory reclaim?

The core mm subsystem frequently calls the shrinker's count_objects callback (xe_shrinker_count) from do_shrink_slab() during direct reclaim. This occurs concurrently across multiple allocating tasks and CPUs when under memory pressure.

By changing read_lock() to write_lock() to update the batch_avg heuristic, this forces all concurrent direct reclaimers system-wide to serialize on this single lock, which could lead to severe lock contention and performance degradation.

Quoted 22 lines
drivers/gpu/drm/xe/xe_shrinker.c +12 -5
-	if (can_backup)
-		num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
-	else
-		num_pages = 0;
+	num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
 
-	read_unlock(&shrinker->lock);
+	if (shrinker->populated_tts) {
+		unsigned long avg = 2 * (shrinker->shrinkable_pages +
+					 shrinker->purgeable_pages) /
+				     shrinker->populated_tts;
+
+		shrinker->batch_avg = max((shrinker->batch_avg + (long)avg) >> 1,
+					  128L /* default SHRINK_BATCH */);
+		WRITE_ONCE(shrink->batch, shrinker->batch_avg);
+	}
+
+	write_unlock(&shrinker->lock);
 
 	return num_pages ? num_pages : SHRINK_EMPTY;
 }
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=4
author maintainer
#15 lore raw

Re: [PATCH v4 4/4] drm/xe: Update non-purgeable shrinker batch size based on average BO size

Quoted 49 lines · On Fri, 2026-10-16 at 13:45 +0000, [email protected] wrote:

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] drm/xe: shrinker count callback serializes direct reclaim via write_lock
--

commit a78bd8842e67f957a2ced6d827e1c4a6430ff29b
Author: Thomas Hellström <[email protected]> drm/xe: Update non-purgeable shrinker batch size based on average BO size

This commit updates the preferred vmscan batch size for the non- purgeable
shrinker based on the average buffer object size. It introduces an exponential moving average that is updated during the shrinker count phase.

Quoted 5 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 8e3fe675e0f34..955908b3bdf3e 100644

[ ... ]

drivers/gpu/drm/xe/xe_shrinker.c xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc) · line 243

Quoted 12 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -210,15 +235,26 @@ xe_shrinker_count(struct shrinker *shrink,
 struct shrink_control *sc)
  	unsigned long num_pages;
  	bool can_backup = !!(sc->gfp_mask & __GFP_FS);

drivers/gpu/drm/xe/xe_shrinker.c +3 -0
+	if (!can_backup)
+		return SHRINK_EMPTY;
+

  num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;

drivers/gpu/drm/xe/xe_shrinker.c +2 -1
-	read_lock(&shrinker->lock);
+	/* Consistently use write_lock() for simplicity. */
+	write_lock(&shrinker->lock);

[Severity: Medium]
Will this exclusive write lock create a system-wide performance bottleneck
during memory reclaim?

The core mm subsystem frequently calls the shrinker's count_objects callback
(xe_shrinker_count) from do_shrink_slab() during direct reclaim. This occurs
concurrently across multiple allocating tasks and CPUs when under memory
pressure.

Quoted 7 lines

By changing read_lock() to write_lock() to update the batch_avg heuristic,
this forces all concurrent direct reclaimers system-wide to serialize on this
single lock, which could lead to severe lock contention and performance
degradation.

This is grossly overstated. False positive.

/Thomas

Quoted 29 lines
Quoted 29 lines

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (can_backup)
-		num_pages = min_t(unsigned long, num_pages,

shrinker->shrinkable_pages);

drivers/gpu/drm/xe/xe_shrinker.c +1 -2
-	else
-		num_pages = 0;
+	num_pages = min_t(unsigned long, num_pages, shrinker-
Quoted 1 line

shrinkable_pages);

drivers/gpu/drm/xe/xe_shrinker.c +2 -1
-	read_unlock(&shrinker->lock);
+	if (shrinker->populated_tts) {
+		unsigned long avg = 2 * (shrinker-
Quoted 1 line

shrinkable_pages +

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+					 shrinker-
Quoted 1 line

purgeable_pages) /

drivers/gpu/drm/xe/xe_shrinker.c +3 -0
+				     shrinker->populated_tts;
+
+		shrinker->batch_avg = max((shrinker->batch_avg +

(long)avg) >> 1,

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+					  128L /* default

SHRINK_BATCH */);

drivers/gpu/drm/xe/xe_shrinker.c +4 -0
+		WRITE_ONCE(shrink->batch, shrinker->batch_avg);
+	}
+
+	write_unlock(&shrinker->lock);


  return num_pages ? num_pages : SHRINK_EMPTY; }

maintainer
#16 lore raw

Re: [PATCH v4 4/4] drm/xe: Update non-purgeable shrinker batch size based on average BO size

Quoted 58 lines · Thomas Hellström
Quoted 49 lines · On Fri, 2026-10-16 at 13:45 +0000, [email protected] wrote:

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] drm/xe: shrinker count callback serializes direct reclaim via write_lock
--

commit a78bd8842e67f957a2ced6d827e1c4a6430ff29b
Author: Thomas Hellström <[email protected]> drm/xe: Update non-purgeable shrinker batch size based on average BO size

This commit updates the preferred vmscan batch size for the non- purgeable
shrinker based on the average buffer object size. It introduces an exponential moving average that is updated during the shrinker count phase.

Quoted 5 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
index 8e3fe675e0f34..955908b3bdf3e 100644

[ ... ]

drivers/gpu/drm/xe/xe_shrinker.c xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc) · line 243

Quoted 12 lines
drivers/gpu/drm/xe/xe_shrinker.c +0 -0
@@ -210,15 +235,26 @@ xe_shrinker_count(struct shrinker *shrink,
 struct shrink_control *sc)
  	unsigned long num_pages;
  	bool can_backup = !!(sc->gfp_mask & __GFP_FS);

drivers/gpu/drm/xe/xe_shrinker.c +3 -0
+	if (!can_backup)
+		return SHRINK_EMPTY;
+

  num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;

drivers/gpu/drm/xe/xe_shrinker.c +2 -1
-	read_lock(&shrinker->lock);
+	/* Consistently use write_lock() for simplicity. */
+	write_lock(&shrinker->lock);

[Severity: Medium]
Will this exclusive write lock create a system-wide performance bottleneck
during memory reclaim?

The core mm subsystem frequently calls the shrinker's count_objects callback
(xe_shrinker_count) from do_shrink_slab() during direct reclaim. This occurs
concurrently across multiple allocating tasks and CPUs when under memory
pressure.

Quoted 7 lines

By changing read_lock() to write_lock() to update the batch_avg heuristic,
this forces all concurrent direct reclaimers system-wide to serialize on this
single lock, which could lead to severe lock contention and performance
degradation.

Quoted 2 lines

This is grossly overstated. False positive.

Agree.

Matt

Quoted 33 lines

/Thomas

Quoted 29 lines
Quoted 29 lines

drivers/gpu/drm/xe/xe_shrinker.c +0 -2
-	if (can_backup)
-		num_pages = min_t(unsigned long, num_pages,

shrinker->shrinkable_pages);

drivers/gpu/drm/xe/xe_shrinker.c +1 -2
-	else
-		num_pages = 0;
+	num_pages = min_t(unsigned long, num_pages, shrinker-
Quoted 1 line

shrinkable_pages);

drivers/gpu/drm/xe/xe_shrinker.c +2 -1
-	read_unlock(&shrinker->lock);
+	if (shrinker->populated_tts) {
+		unsigned long avg = 2 * (shrinker-
Quoted 1 line

shrinkable_pages +

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+					 shrinker-
Quoted 1 line

purgeable_pages) /

drivers/gpu/drm/xe/xe_shrinker.c +3 -0
+				     shrinker->populated_tts;
+
+		shrinker->batch_avg = max((shrinker->batch_avg +

(long)avg) >> 1,

drivers/gpu/drm/xe/xe_shrinker.c +1 -0
+					  128L /* default

SHRINK_BATCH */);

drivers/gpu/drm/xe/xe_shrinker.c +4 -0
+		WRITE_ONCE(shrink->batch, shrinker->batch_avg);
+	}
+
+	write_unlock(&shrinker->lock);


  return num_pages ? num_pages : SHRINK_EMPTY; }

maintainer Reviewed-by on v4 4/4
#17 lore raw

Re: [PATCH v4 4/4] drm/xe: Update non-purgeable shrinker batch size based on average BO size

In reply to Thomas Hellström
Quoted 25 lines · Thomas Hellström

Update our preferred vmscan batch size for the non-purgeable shrinker on count passes that allow backup (__GFP_FS), to avoid invoking scan_objects() for requests too small to free even a single average-sized GEM object. Our rough estimate for an effective batch is twice the average number of pages per populated ttm_tt across the full shrinkable and purgeable population. The factor of two provides headroom so that most scan invocations can free at least one GEM object despite variability in object sizes.

The batch value is updated as an exponential moving average, (old_batch + avg) / 2, to smooth out sudden changes in the object population. It is floored at 128 pages, the kernel default SHRINK_BATCH, to ensure the shrinker remains responsive when there are very few objects.

The populated_tts counter introduced in an earlier commit provides the object count needed for the average. We inherit the same justification as the analogous mechanism in i915: shrinking a GEM object has non-trivial per-object overhead, so firing the shrinker for requests smaller than a single object is wasteful.

This is only applied to the non-purgeable shrinker: purgeable objects are reclaimed without writeback or GPU idling, so they're cheap enough that the core default batch size is fine for them.

Quoted 5 lines

v3:
- Original patch reworked on top of shrinker split (Matt Brost)

Assisted-by LLM
Quoted 90 lines
---
 drivers/gpu/drm/xe/xe_shrinker.c | 48 ++++++++++++++++++++++++++++----
 1 file changed, 42 insertions(+), 6 deletions(-)
drivers/gpu/drm/xe/xe_shrinker.c +42 -6
index 8e3fe675e0f3..955908b3bdf3 100644
@@ -30,6 +30,8 @@
  * @shrinkable_pages: Number of pages that are currently shrinkable.
  * @purgeable_pages: Number of pages that are currently purgeable.
  * @populated_tts: Number of populated ttm_tts currently shrinkable or purgeable.
+ * @batch_avg: Exponential moving average of the preferred non-purgeable
+ * batch size, based on the average populated ttm_tt size.
  * @shrink: Pointer to the mm shrinker handling non-purgeable (shrinkable) objects.
  * @purge_shrink: Pointer to the mm shrinker handling purgeable objects.
  * @pm_worker: Worker to wake up the device if required.
@@ -40,6 +42,7 @@ struct xe_shrinker {
 	long shrinkable_pages;
 	long purgeable_pages;
 	long populated_tts;
+	long batch_avg;
 	struct shrinker *shrink;
 	struct shrinker *purge_shrink;
 	struct work_struct pm_worker;
@@ -203,6 +206,28 @@ xe_shrinker_count_purgeable(struct shrinker *shrink, struct shrink_control *sc)
 	return num_pages ? num_pages : SHRINK_EMPTY;
 }
 
+/**
+ * DOC: Batch size calculation
+ *
+ * Update our preferred vmscan batch size for the non-purgeable shrinker
+ * on count passes that allow backup (__GFP_FS), to avoid invoking
+ * scan_objects() for requests too small to free even a single
+ * average-sized GEM object. Our rough estimate for an effective batch
+ * is twice the average number of pages per populated ttm_tt across
+ * the full shrinkable and purgeable population. The factor of two
+ * provides headroom so that most scan invocations can free at least one
+ * GEM object despite variability in object sizes.
+ *
+ * The batch value is updated as an exponential moving average,
+ * (old_batch + avg) / 2, to smooth out sudden changes in the object
+ * population. It is floored at 128 pages, the kernel default
+ * SHRINK_BATCH, to ensure the shrinker remains responsive when there
+ * are very few objects.
+ *
+ * We only do this for the non-purgeable shrinker: purgeable objects are
+ * reclaimed without writeback or GPU idling, so shrinking them is cheap
+ * enough that the core default batch size is fine.
+ */
 static unsigned long
 xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 {
@@ -210,15 +235,26 @@ xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 	unsigned long num_pages;
 	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
 
+	if (!can_backup)
+		return SHRINK_EMPTY;
+
 	num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
-	read_lock(&shrinker->lock);
+	/* Consistently use write_lock() for simplicity. */
+	write_lock(&shrinker->lock);
 
-	if (can_backup)
-		num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
-	else
-		num_pages = 0;
+	num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
 
-	read_unlock(&shrinker->lock);
+	if (shrinker->populated_tts) {
+		unsigned long avg = 2 * (shrinker->shrinkable_pages +
+					 shrinker->purgeable_pages) /
+				     shrinker->populated_tts;
+
+		shrinker->batch_avg = max((shrinker->batch_avg + (long)avg) >> 1,
+					  128L /* default SHRINK_BATCH */);
+		WRITE_ONCE(shrink->batch, shrinker->batch_avg);
+	}
+
+	write_unlock(&shrinker->lock);
 
 	return num_pages ? num_pages : SHRINK_EMPTY;
 }
Signature · 1 line
2.56.0
#18 lore raw

✓ CI.KUnit: success for drm/xe: Adjust the bo shrinker batch size (rev4)

In reply to Thomas Hellström
== Series Details ==

== Series Details ==

Series: drm/xe: Adjust the bo shrinker batch size (rev4)
URL : https://patchwork.freedesktop.org/series/166426/
State : success

== Summary ==

+ trap cleanup EXIT
+ kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig')
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig
[13:43:13] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:

$ make ARCH=um O=.kunit olddefconfig
[13:43:17] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:43:38] Starting KUnit Kernel (1/1)...
[13:43:38] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:43:38] ================= gpu_buddy (14 subtests) ==================
[13:43:38] [PASSED] gpu_test_buddy_alloc_limit
[13:43:38] [PASSED] gpu_test_buddy_alloc_optimistic
[13:43:38] [PASSED] gpu_test_buddy_alloc_pessimistic
[13:43:38] [PASSED] gpu_test_buddy_alloc_pathological
[13:43:38] [PASSED] gpu_test_buddy_alloc_contiguous
[13:43:38] [PASSED] gpu_test_buddy_alloc_clear
[13:43:38] [PASSED] gpu_test_buddy_alloc_range
[13:43:39] [PASSED] gpu_test_buddy_alloc_range_bias
[13:43:40] [PASSED] gpu_test_buddy_fragmentation_performance
[13:43:40] [PASSED] gpu_test_buddy_dirty_tracker_performance
[13:43:40] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[13:43:40] [PASSED] gpu_test_buddy_offset_aligned_allocation
[13:43:40] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[13:43:40] [PASSED] gpu_test_buddy_addr_to_block
[13:43:40] ==================== [PASSED] gpu_buddy ====================
[13:43:40] ============================================================
[13:43:40] Testing complete. Ran 14 tests: passed: 14
[13:43:40] Elapsed time: 27.731s total, 4.498s configuring, 21.065s building, 2.128s running

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig [13:43:41] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:

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

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig [13:44:22] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:

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

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig [13:44:50] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:

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

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig [13:45:02] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:

$ make ARCH=um O=.kunit olddefconfig
[13:45:04] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:45:13] Starting KUnit Kernel (1/1)...
[13:45:13] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:45:13] =============== dma-buf-fence (12 subtests) ================
[13:45:13] [PASSED] test_sanitycheck
[13:45:13] [PASSED] test_signaling
[13:45:13] [PASSED] test_add_callback
[13:45:13] [PASSED] test_late_add_callback
[13:45:13] [PASSED] test_rm_callback
[13:45:13] [PASSED] test_late_rm_callback
[13:45:13] [PASSED] test_status
[13:45:13] [PASSED] test_error
[13:45:13] [PASSED] test_wait
[13:45:13] [PASSED] test_wait_timeout
[13:45:13] [PASSED] test_stub
[13:45:13] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[13:45:13] ================== [PASSED] dma-buf-fence ==================
[13:45:13] ============ dma-buf-fence-chain (11 subtests) =============
[13:45:13] [PASSED] test_sanitycheck
[13:45:13] [PASSED] test_find_seqno
[13:45:13] [PASSED] test_find_signaled
[13:45:13] [PASSED] test_find_out_of_order
[13:45:18] [PASSED] test_find_gap
[13:45:18] [PASSED] test_find_race
[13:45:18] [PASSED] test_signal_forward
[13:45:18] [PASSED] test_signal_backward
[13:45:18] [PASSED] test_wait_forward
[13:45:18] [PASSED] test_wait_backward
[13:45:18] [PASSED] test_wait_random
[13:45:18] =============== [PASSED] dma-buf-fence-chain ===============
[13:45:18] ============ dma-buf-fence-unwrap (11 subtests) ============
[13:45:18] [PASSED] test_sanitycheck
[13:45:18] [PASSED] test_unwrap_array
[13:45:18] [PASSED] test_unwrap_chain
[13:45:18] [PASSED] test_unwrap_chain_array
[13:45:18] [PASSED] test_unwrap_merge
[13:45:18] [PASSED] test_unwrap_merge_duplicate
[13:45:18] [PASSED] test_unwrap_merge_seqno
[13:45:18] [PASSED] test_unwrap_merge_order
[13:45:18] [PASSED] test_unwrap_merge_complex
[13:45:18] [PASSED] test_unwrap_merge_complex_seqno
[13:45:18] [PASSED] test_dedup_empty
[13:45:18] ============== [PASSED] dma-buf-fence-unwrap ===============
[13:45:18] ================ dma-buf-resv (5 subtests) =================
[13:45:18] [PASSED] test_sanitycheck
[13:45:18] ===================== test_signaling  ======================
[13:45:18] [PASSED] kernel
[13:45:18] [PASSED] write
[13:45:18] [PASSED] read
[13:45:18] [PASSED] bookkeep
[13:45:18] ================= [PASSED] test_signaling ==================
[13:45:18] ====================== test_for_each  ======================
[13:45:18] [PASSED] kernel
[13:45:18] [PASSED] write
[13:45:18] [PASSED] read
[13:45:18] [PASSED] bookkeep
[13:45:18] ================== [PASSED] test_for_each ==================
[13:45:18] ================= test_for_each_unlocked  ==================
[13:45:18] [PASSED] kernel
[13:45:18] [PASSED] write
[13:45:18] [PASSED] read
[13:45:18] [PASSED] bookkeep
[13:45:18] ============= [PASSED] test_for_each_unlocked ==============
[13:45:18] ===================== test_get_fences  =====================
[13:45:18] [PASSED] kernel
[13:45:18] [PASSED] write
[13:45:18] [PASSED] read
[13:45:18] [PASSED] bookkeep
[13:45:18] ================= [PASSED] test_get_fences =================
[13:45:18] ================== [PASSED] dma-buf-resv ===================
[13:45:18] ============================================================
[13:45:18] Testing complete. Ran 51 tests: passed: 50, skipped: 1
[13:45:18] Elapsed time: 15.857s total, 1.893s configuring, 8.692s building, 5.266s running

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

#19 lore raw

✓ Xe.CI.BAT: success for drm/xe: Adjust the bo shrinker batch size (rev4)

In reply to Thomas Hellström
== Series Details ==

== Series Details ==

Series: drm/xe: Adjust the bo shrinker batch size (rev4)
URL : https://patchwork.freedesktop.org/series/166426/
State : success

== Summary ==

CI Bug Log - changes from xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39_BAT -> xe-pw-166426v4_BAT
====================================================

Summary
-------

**SUCCESS**

No regressions found.

Participating hosts (15 -> 15)
------------------------------

No changes in participating hosts

Changes
-------

No changes found

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

* Linux: xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39 -> xe-pw-166426v4

IGT_9150: 18811c476bfde62ffbb4c0af55cd6f57e36e0dca @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39: 728ba1de4cb617e37b0f04258bdd0fc3248bdb39
xe-pw-166426v4: 166426v4

== Logs ==

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

#20 lore raw

✓ Xe.CI.FULL: success for drm/xe: Adjust the bo shrinker batch size (rev4)

In reply to Thomas Hellström
== Series Details ==

== Series Details ==

Series: drm/xe: Adjust the bo shrinker batch size (rev4)
URL : https://patchwork.freedesktop.org/series/166426/
State : success

== Summary ==

CI Bug Log - changes from xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39_FULL -> xe-pw-166426v4_FULL
====================================================

Summary
-------

**SUCCESS**

No regressions found.

Participating hosts (3 -> 3)
------------------------------

No changes in participating hosts

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

Here are the changes found in xe-pw-166426v4_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

* igt@kms_atomic_transition@plane-all-modeset-transition-fencing:
- shard-lnl: NOTRUN -> [SKIP][1] ([Intel XE#3279])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_big_fb@linear-16bpp-rotate-90:
- shard-ptl: NOTRUN -> [SKIP][2] ([Intel XE#5901]) +1 other test skip
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_big_fb@x-tiled-8bpp-rotate-270:
- shard-lnl: NOTRUN -> [SKIP][3] ([Intel XE#1407]) +2 other tests skip
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@kms_big_fb@y-tiled-8bpp-rotate-270:
- shard-lnl: NOTRUN -> [SKIP][4] ([Intel XE#1124]) +1 other test skip
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@[email protected]

* igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
- shard-ptl: NOTRUN -> [SKIP][5] ([Intel XE#5808]) +3 other tests skip
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

* igt@kms_bw@connected-linear-tiling-4-displays-target-2560x1440p:
- shard-ptl: NOTRUN -> [SKIP][6] ([Intel XE#7679])
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@kms_bw@linear-tiling-4-displays-target-1920x1080p:
- shard-ptl: NOTRUN -> [SKIP][7] ([Intel XE#367])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs:
- shard-lnl: NOTRUN -> [SKIP][8] ([Intel XE#2887]) +2 other tests skip
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc:
- shard-ptl: NOTRUN -> [SKIP][9] ([Intel XE#5822]) +7 other tests skip
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
- shard-bmg: [PASS][10] -> [ABORT][11] ([Intel XE#9406] / [Intel XE#9422]) +1 other test abort
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-bmg-6/igt@[email protected]
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-bmg-2/igt@[email protected]

* igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs:
- shard-lnl: NOTRUN -> [SKIP][12] ([Intel XE#3432]) +1 other test skip
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_cdclk@mode-transition:
- shard-lnl: NOTRUN -> [SKIP][13] ([Intel XE#9204] / [Intel XE#9205]) +1 other test skip
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_cdclk@mode-transition@pipe-b-edp-1:
- shard-lnl: NOTRUN -> [SKIP][14] ([Intel XE#9205]) +1 other test skip
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_cdclk@[email protected]

* igt@kms_chamelium_color_pipeline@plane-fixed-matrix-yuv-rgb-bt2020:
- shard-lnl: NOTRUN -> [SKIP][15] ([Intel XE#7358])
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_chamelium_color_pipeline@plane-fixed-matrix-yuv-rgb-bt2020.html

* igt@kms_chamelium_color_pipeline@plane-lut3d-green-only:
- shard-ptl: NOTRUN -> [SKIP][16] ([Intel XE#8391])
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_chamelium_edid@hdmi-edid-change-during-hibernate:
- shard-lnl: NOTRUN -> [SKIP][17] ([Intel XE#373]) +3 other tests skip
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_chamelium_hpd@dp-hpd-with-enabled-mode:
- shard-ptl: NOTRUN -> [SKIP][18] ([Intel XE#2252]) +1 other test skip
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_color_pipeline@plane-lut1d-post-ctm3x4@pipe-a-plane-4:
- shard-lnl: NOTRUN -> [SKIP][19] ([Intel XE#6969]) +5 other tests skip
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_color_pipeline@[email protected]

* igt@kms_content_protection@atomic-dpms-hdcp14@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][20] ([Intel XE#3304] / [Intel XE#7374]) +1 other test fail
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-bmg-8/igt@kms_content_protection@[email protected]

* igt@kms_content_protection@lic-type-0@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][21] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374])
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-bmg-9/igt@kms_content_protection@[email protected]

* igt@kms_content_protection@suspend-resume:
- shard-ptl: NOTRUN -> [SKIP][22] ([Intel XE#7642])
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]
- shard-lnl: NOTRUN -> [SKIP][23] ([Intel XE#7642]) +1 other test skip
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@kms_cursor_crc@cursor-offscreen-32x32:
- shard-ptl: NOTRUN -> [SKIP][24] ([Intel XE#5900]) +1 other test skip
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]

* igt@kms_cursor_crc@cursor-onscreen-512x512:
- shard-lnl: NOTRUN -> [SKIP][25] ([Intel XE#2321] / [Intel XE#7355]) +1 other test skip
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_cursor_crc@cursor-random-max-size:
- shard-lnl: NOTRUN -> [SKIP][26] ([Intel XE#1424]) +1 other test skip
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_cursor_crc@cursor-suspend@pipe-d-edp-1:
- shard-ptl: NOTRUN -> [ABORT][27] ([Intel XE#9375])
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-1/igt@kms_cursor_crc@[email protected]

* igt@kms_cursor_legacy@2x-cursor-vs-flip-legacy:
- shard-lnl: NOTRUN -> [SKIP][28] ([Intel XE#309] / [Intel XE#7343]) +2 other tests skip
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_cursor_legacy@cursorb-vs-flipa-legacy:
- shard-ptl: NOTRUN -> [SKIP][29] ([Intel XE#5962]) +1 other test skip
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@kms_cursor_legacy@cursorb-vs-flipb-varying-size:
- shard-ptl: NOTRUN -> [SKIP][30] ([Intel XE#5962] / [Intel XE#7343])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
- shard-ptl: NOTRUN -> [SKIP][31] ([Intel XE#6035])
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html
- shard-lnl: NOTRUN -> [SKIP][32] ([Intel XE#323] / [Intel XE#6035])
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html

* igt@kms_dp_link_training@uhbr-mst-tbtalt-train:
- shard-ptl: NOTRUN -> [SKIP][33] ([Intel XE#9531])
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@kms_dp_link_training@uhbr-sst:
- shard-lnl: NOTRUN -> [SKIP][34] ([Intel XE#9535])
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@[email protected]

* igt@kms_dsc@dsc-basic-bigjoiner:
- shard-lnl: NOTRUN -> [SKIP][35] ([Intel XE#8265]) +1 other test skip
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@kms_dsc@dsc-with-bpc-formats:
- shard-ptl: NOTRUN -> [SKIP][36] ([Intel XE#5907]) +1 other test skip
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_flip@2x-blocking-absolute-wf_vblank-interruptible:
- shard-lnl: NOTRUN -> [SKIP][37] ([Intel XE#1421]) +2 other tests skip
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_flip@2x-blocking-absolute-wf_vblank-interruptible.html

* igt@kms_flip@2x-flip-vs-blocking-wf-vblank:
- shard-ptl: NOTRUN -> [SKIP][38] ([Intel XE#2316]) +1 other test skip
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_flip@plain-flip-ts-check-interruptible:
- shard-ptl: [PASS][39] -> [FAIL][40] ([Intel XE#3098]) +1 other test fail
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-3/igt@[email protected]
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_flip_scaled_crc@flip-32bpp-linear-to-32bpp-linear-reflect-x:
- shard-ptl: NOTRUN -> [SKIP][41] ([Intel XE#7179])
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@kms_flip_scaled_crc@flip-32bpp-linear-to-32bpp-linear-reflect-x.html

* igt@kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling:
- shard-lnl: NOTRUN -> [SKIP][42] ([Intel XE#1397] / [Intel XE#1745] / [Intel XE#7385] / [Intel XE#9144])
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling.html

* igt@kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling@pipe-a-default-mode:
- shard-lnl: NOTRUN -> [SKIP][43] ([Intel XE#1397] / [Intel XE#7385] / [Intel XE#9144])
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling@pipe-a-default-mode.html

* igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-downscaling:
- shard-lnl: NOTRUN -> [SKIP][44] ([Intel XE#7178] / [Intel XE#7351]) +1 other test skip
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-downscaling.html

* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling:
- shard-ptl: NOTRUN -> [SKIP][45] ([Intel XE#5828]) +1 other test skip
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling.html

* igt@kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-onoff:
- shard-lnl: NOTRUN -> [SKIP][46] ([Intel XE#6312] / [Intel XE#651]) +6 other tests skip
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@kms_frontbuffer_tracking@drrs-1p-primscrn-indfb-plflip-blt:
- shard-ptl: NOTRUN -> [SKIP][47] ([Intel XE#5800] / [Intel XE#6312]) +5 other tests skip
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@kms_frontbuffer_tracking@drrshdr-1p-primscrn-pri-shrfb-draw-blt:
- shard-ptl: NOTRUN -> [SKIP][48] ([Intel XE#6312]) +4 other tests skip
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@kms_frontbuffer_tracking@drrshdr-1p-primscrn-pri-shrfb-draw-blt.html

* igt@kms_frontbuffer_tracking@drrshdr-1p-primscrn-spr-indfb-onoff:
- shard-lnl: NOTRUN -> [SKIP][49] ([Intel XE#6312]) +5 other tests skip
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@kms_frontbuffer_tracking@drrshdr-1p-primscrn-spr-indfb-onoff.html

* igt@kms_frontbuffer_tracking@drrshdr-abgr161616f-draw-render:
- shard-ptl: NOTRUN -> [SKIP][50] ([Intel XE#7061]) +2 other tests skip
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-pgflip-blt:
- shard-ptl: NOTRUN -> [SKIP][51] ([Intel XE#5812]) +28 other tests skip
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-render:
- shard-lnl: NOTRUN -> [SKIP][52] ([Intel XE#656] / [Intel XE#7905]) +8 other tests skip
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-render.html

* igt@kms_frontbuffer_tracking@fbcdrrs-tiling-y:
- shard-ptl: NOTRUN -> [SKIP][53] ([Intel XE#5865] / [Intel XE#7399])
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]
- shard-lnl: NOTRUN -> [SKIP][54] ([Intel XE#1469] / [Intel XE#7399])
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-cur-indfb-draw-render:
- shard-lnl: NOTRUN -> [SKIP][55] ([Intel XE#7905]) +17 other tests skip
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-cur-indfb-draw-render.html

* igt@kms_frontbuffer_tracking@fbcpsrhdr-tiling-4:
- shard-lnl: NOTRUN -> [SKIP][56] ([Intel XE#7865]) +6 other tests skip
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_frontbuffer_tracking@hdr-1p-primscrn-pri-indfb-draw-blt:
- shard-ptl: NOTRUN -> [SKIP][57] ([Intel XE#7865]) +9 other tests skip
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@kms_frontbuffer_tracking@psrhdr-argb161616f-draw-mmap-wc:
- shard-lnl: NOTRUN -> [SKIP][58] ([Intel XE#7061]) +3 other tests skip
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_hdr@invalid-metadata-sizes:
- shard-lnl: NOTRUN -> [SKIP][59] ([Intel XE#1503])
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_joiner@basic-big-joiner:
- shard-lnl: NOTRUN -> [SKIP][60] ([Intel XE#6901])
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@[email protected]

* igt@kms_joiner@basic-ultra-joiner:
- shard-lnl: NOTRUN -> [SKIP][61] ([Intel XE#6900] / [Intel XE#7362])
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_pipe_stress@stress-xrgb8888-ytiled:
- shard-ptl: NOTRUN -> [SKIP][62] ([Intel XE#6912])
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_plane@pixel-format-4-tiled-lnl-ccs-modifier@pipe-a-plane-5:
- shard-lnl: NOTRUN -> [SKIP][63] ([Intel XE#8303]) +1 other test skip
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@kms_plane@[email protected]

* igt@kms_plane@pixel-format-y-tiled-modifier:
- shard-ptl: NOTRUN -> [SKIP][64] ([Intel XE#7283]) +2 other tests skip
[64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_plane@plane-panning-bottom-right-suspend:
- shard-ptl: [PASS][65] -> [ABORT][66] ([Intel XE#9363]) +1 other test abort
[65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-1/igt@[email protected]
[66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_plane_lowres@tiling-none@pipe-b-edp-1:
- shard-ptl: NOTRUN -> [SKIP][67] ([Intel XE#5844]) +4 other tests skip
[67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@kms_plane_lowres@[email protected]

* igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-5@pipe-c:
- shard-lnl: NOTRUN -> [SKIP][68] ([Intel XE#2763] / [Intel XE#6886]) +3 other tests skip
[68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@kms_plane_scaling@[email protected]

* igt@kms_pm_dc@dc5-dpms-suspend-resume:
- shard-bmg: [PASS][69] -> [ABORT][70] ([Intel XE#9399])
[69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-bmg-9/igt@[email protected]
[70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-bmg-6/igt@[email protected]

* igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area:
- shard-lnl: NOTRUN -> [SKIP][71] ([Intel XE#2893] / [Intel XE#7304])
[71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area:
- shard-lnl: NOTRUN -> [SKIP][72] ([Intel XE#2893] / [Intel XE#4608] / [Intel XE#7304])
[72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-a-edp-1:
- shard-ptl: NOTRUN -> [SKIP][73] ([Intel XE#5858])
[73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@kms_psr2_sf@[email protected]
- shard-lnl: NOTRUN -> [SKIP][74] ([Intel XE#4608])
[74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@kms_psr2_sf@[email protected]

* igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-b-edp-1:
- shard-ptl: NOTRUN -> [SKIP][75] ([Intel XE#5858] / [Intel XE#7304]) +1 other test skip
[75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@kms_psr2_sf@[email protected]
- shard-lnl: NOTRUN -> [SKIP][76] ([Intel XE#4608] / [Intel XE#7304])
[76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@kms_psr2_sf@[email protected]

* igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area:
- shard-ptl: NOTRUN -> [SKIP][77] ([Intel XE#7304]) +2 other tests skip
[77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_psr2_su@page_flip-p010:
- shard-ptl: NOTRUN -> [SKIP][78] ([Intel XE#7413])
[78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@kms_psr2_su@page_flip-p010.html

* igt@kms_psr@fbc-pr-sprite-plane-onoff:
- shard-ptl: NOTRUN -> [SKIP][79] ([Intel XE#1406])
[79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]
- shard-lnl: NOTRUN -> [SKIP][80] ([Intel XE#1406])
[80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@kms_psr@fbc-psr2-basic@edp-1:
- shard-lnl: NOTRUN -> [SKIP][81] ([Intel XE#1406] / [Intel XE#4609] / [Intel XE#7345]) +1 other test skip
[81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_psr@[email protected]

* igt@kms_psr@fbc-psr2-dpms:
- shard-lnl: NOTRUN -> [SKIP][82] ([Intel XE#1406] / [Intel XE#7345]) +1 other test skip
[82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@[email protected]

* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
- shard-ptl: NOTRUN -> [SKIP][83] ([Intel XE#5813])
[83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]
- shard-lnl: NOTRUN -> [SKIP][84] ([Intel XE#1127] / [Intel XE#5813])
[84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-lnl: NOTRUN -> [SKIP][85] ([Intel XE#362] / [Intel XE#5848])
[85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_vblank@ts-continuation-suspend:
- shard-ptl: [PASS][86] -> [ABORT][87] ([Intel XE#9375]) +1 other test abort
[86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-2/igt@[email protected]
[87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@kms_vrr@flip-basic-fastset:
- shard-ptl: [PASS][88] -> [FAIL][89] ([Intel XE#4227] / [Intel XE#7397])
[88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-3/igt@[email protected]
[89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]

* igt@kms_vrr@flip-basic-fastset@pipe-a-edp-1:
- shard-ptl: [PASS][90] -> [FAIL][91] ([Intel XE#6293] / [Intel XE#7397])
[90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-3/igt@kms_vrr@[email protected]
[91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@kms_vrr@[email protected]

* igt@xe_ccs@vm-bind-fault-mode-decompress:
- shard-ptl: NOTRUN -> [SKIP][92] ([Intel XE#7644])
[92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@[email protected]

* igt@xe_compute_preempt@compute-preempt-many-vram:
- shard-ptl: NOTRUN -> [SKIP][93] ([Intel XE#5191])
[93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@xe_create@create-big-vram:
- shard-ptl: NOTRUN -> [SKIP][94] ([Intel XE#5853] / [Intel XE#7457])
[94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]
- shard-lnl: NOTRUN -> [SKIP][95] ([Intel XE#1062] / [Intel XE#7318] / [Intel XE#7457])
[95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@xe_evict@evict-beng-threads-large-multi-vm:
- shard-ptl: NOTRUN -> [SKIP][96] ([Intel XE#5764]) +3 other tests skip
[96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]
- shard-lnl: NOTRUN -> [SKIP][97] ([Intel XE#6540] / [Intel XE#688]) +5 other tests skip
[97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@xe_exec_balancer@no-exec-cm-parallel-userptr-invalidate-race:
- shard-ptl: NOTRUN -> [SKIP][98] ([Intel XE#7482]) +8 other tests skip
[98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@xe_exec_balancer@no-exec-cm-parallel-userptr-invalidate-race.html

* igt@xe_exec_balancer@twice-parallel-userptr-invalidate-race:
- shard-lnl: NOTRUN -> [SKIP][99] ([Intel XE#7482]) +5 other tests skip
[99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate-race:
- shard-ptl: NOTRUN -> [SKIP][100] ([Intel XE#5575] / [Intel XE#7484]) +2 other tests skip
[100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate-race:
- shard-lnl: NOTRUN -> [SKIP][101] ([Intel XE#1392]) +1 other test skip
[101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate-race.html

* igt@xe_exec_fault_mode@many-multi-queue-rebind-imm:
- shard-ptl: NOTRUN -> [SKIP][102] ([Intel XE#8374]) +6 other tests skip
[102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@xe_exec_fault_mode@many-multi-queue-userptr-prefetch:
- shard-lnl: NOTRUN -> [SKIP][103] ([Intel XE#8374]) +6 other tests skip
[103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_exec_multi_queue@many-execs-preempt-mode-fault-close-fd-smem:
- shard-ptl: NOTRUN -> [SKIP][104] ([Intel XE#8364]) +9 other tests skip
[104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@xe_exec_multi_queue@many-execs-preempt-mode-fault-close-fd-smem.html

* igt@xe_exec_multi_queue@max-queues-preempt-mode-fault-basic-smem:
- shard-lnl: NOTRUN -> [SKIP][105] ([Intel XE#8364]) +10 other tests skip
[105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@xe_exec_multi_queue@max-queues-preempt-mode-fault-basic-smem.html

* igt@xe_exec_reset@multi-queue-long-spin-reuse-many-queue-switch:
- shard-lnl: NOTRUN -> [SKIP][106] ([Intel XE#8369]) +1 other test skip
[106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-comp-multi-vma:
- shard-ptl: NOTRUN -> [SKIP][107] ([Intel XE#6196])
[107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-comp-multi-vma.html

* igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-wt-multi-vma:
- shard-lnl: NOTRUN -> [SKIP][108] ([Intel XE#6196]) +1 other test skip
[108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-wt-multi-vma.html

* igt@xe_exec_threads@threads-multi-queue-cm-fd-userptr:
- shard-ptl: NOTRUN -> [SKIP][109] ([Intel XE#8378]) +1 other test skip
[109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-5/igt@[email protected]

* igt@xe_exec_threads@threads-multi-queue-userptr:
- shard-lnl: NOTRUN -> [SKIP][110] ([Intel XE#8378]) +4 other tests skip
[110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@[email protected]

* igt@xe_madvise@atomic-cpu:
- shard-lnl: NOTRUN -> [SKIP][111] ([Intel XE#7980])
[111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_multigpu_svm@mgpu-latency-prefetch:
- shard-lnl: NOTRUN -> [SKIP][112] ([Intel XE#6964])
[112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_pm@d3cold-mocs:
- shard-lnl: NOTRUN -> [SKIP][113] ([Intel XE#2284] / [Intel XE#7370])
[113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_pm@s4-vm-bind-prefetch:
- shard-lnl: [PASS][114] -> [ABORT][115] ([Intel XE#9362])
[114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-lnl-5/igt@[email protected]
[115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@xe_pmu@engine-activity-suspend:
- shard-ptl: [PASS][116] -> [ABORT][117] ([Intel XE#9362]) +2 other tests abort
[116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-4/igt@[email protected]
[117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-2/igt@[email protected]

* igt@xe_pmu@fn-engine-activity-load:
- shard-lnl: NOTRUN -> [SKIP][118] ([Intel XE#4650] / [Intel XE#7347])
[118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_pmu@fn-engine-activity-load@engine-drm_xe_engine_class_compute0:
- shard-lnl: NOTRUN -> [SKIP][119] ([Intel XE#7347]) +4 other tests skip
[119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@xe_pmu@fn-engine-activity-load@engine-drm_xe_engine_class_compute0.html

* igt@xe_query@multigpu-query-hwconfig:
- shard-ptl: NOTRUN -> [SKIP][120] ([Intel XE#6019])
[120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]

* igt@xe_query@multigpu-query-oa-units:
- shard-lnl: NOTRUN -> [SKIP][121] ([Intel XE#944]) +1 other test skip
[121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_sriov_admin@sched-priority-vf-write-denied:
- shard-lnl: NOTRUN -> [SKIP][122] ([Intel XE#7174])
[122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-5/igt@[email protected]

* igt@xe_sriov_scheduling@nonpreempt-engine-resets-normal-priority:
- shard-lnl: NOTRUN -> [SKIP][123] ([Intel XE#8339])
[123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@xe_sriov_scheduling@nonpreempt-engine-resets-normal-priority.html

* igt@xe_sriov_vram@vf-access-beyond:
- shard-lnl: NOTRUN -> [SKIP][124] ([Intel XE#6376] / [Intel XE#7330] / [Intel XE#7422]) +1 other test skip
[124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@xe_sriov_vram@vf-access-provisioned:
- shard-ptl: NOTRUN -> [SKIP][125] ([Intel XE#6376] / [Intel XE#7422])
[125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-7/igt@[email protected]

#### Possible fixes ####

* igt@kms_cursor_crc@cursor-suspend@pipe-a-edp-1:
- shard-ptl: [ABORT][126] ([Intel XE#9362]) -> [PASS][127] +5 other tests pass
[126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-8/igt@kms_cursor_crc@[email protected]
[127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-1/igt@kms_cursor_crc@[email protected]

* igt@kms_flip@flip-vs-expired-vblank@a-edp1:
- shard-lnl: [FAIL][128] ([Intel XE#301]) -> [PASS][129]
[128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-lnl-5/igt@kms_flip@[email protected]
[129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@kms_flip@[email protected]

* igt@kms_flip@modeset-vs-vblank-race:
- shard-bmg: [FAIL][130] ([Intel XE#3098] / [Intel XE#3149]) -> [PASS][131] +1 other test pass
[130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-bmg-4/igt@[email protected]
[131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-bmg-2/igt@[email protected]

* igt@kms_hdr@invalid-hdr:
- shard-bmg: [SKIP][132] ([Intel XE#1503]) -> [PASS][133]
[132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-bmg-4/igt@[email protected]
[133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-bmg-2/igt@[email protected]

* igt@kms_pm_rpm@dpms-lpsp:
- shard-lnl: [SKIP][134] -> [PASS][135]
[134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-lnl-3/igt@[email protected]
[135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-4/igt@[email protected]

* igt@kms_setmode@basic-no-cpu-idle@pipe-a-edp-1:
- shard-ptl: [FAIL][136] -> [PASS][137] +1 other test pass
[136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-5/igt@kms_setmode@[email protected]
[137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-1/igt@kms_setmode@[email protected]

* igt@kms_vrr@flip-dpms@pipe-a-edp-1:
- shard-ptl: [FAIL][138] ([Intel XE#4227] / [Intel XE#7397]) -> [PASS][139] +1 other test pass
[138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-7/igt@kms_vrr@[email protected]
[139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-6/igt@kms_vrr@[email protected]

* igt@xe_exec_threads@threads-hang-userptr-invalidate-race:
- shard-lnl: [FAIL][140] ([Intel XE#9096]) -> [PASS][141]
[140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-lnl-1/igt@[email protected]
[141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-3/igt@[email protected]

* igt@xe_pm@s4-vm-bind-userptr:
- shard-lnl: [ABORT][142] ([Intel XE#9362]) -> [PASS][143] +2 other tests pass
[142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-lnl-1/igt@[email protected]
[143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-1/igt@[email protected]

#### Warnings ####

* igt@kms_cursor_crc@cursor-suspend:
- shard-ptl: [ABORT][144] ([Intel XE#9362]) -> [ABORT][145] ([Intel XE#9375])
[144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-ptl-8/igt@[email protected]
[145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-ptl-1/igt@[email protected]

* igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions:
- shard-lnl: [SKIP][146] ([Intel XE#309] / [Intel XE#7343]) -> [SKIP][147] ([Intel XE#309] / [Intel XE#7343] / [Intel XE#7935])
[146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-lnl-5/igt@[email protected]
[147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-lnl-8/igt@[email protected]

* igt@kms_hdr@brightness-with-hdr:
- shard-bmg: [SKIP][148] ([Intel XE#3544]) -> [SKIP][149] ([Intel XE#3374] / [Intel XE#3544])
[148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-bmg-3/igt@[email protected]
[149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-bmg-8/igt@[email protected]

* igt@kms_tiled_display@basic-test-pattern:
- shard-bmg: [FAIL][150] ([Intel XE#1729] / [Intel XE#7424]) -> [SKIP][151] ([Intel XE#2426] / [Intel XE#5848])
[150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39/shard-bmg-3/igt@[email protected]
[151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-166426v4/shard-bmg-8/igt@[email protected]

[Intel XE#1062]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1062
[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#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
[Intel XE#1397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1397
[Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
[Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
[Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
[Intel XE#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
[Intel XE#1469]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1469
[Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
[Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
[Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
[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#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
[Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
[Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
[Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
[Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
[Intel XE#2893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2893
[Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
[Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
[Intel XE#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
[Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
[Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
[Intel XE#3279]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3279
[Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
[Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
[Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
[Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
[Intel XE#362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/362
[Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
[Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
[Intel XE#4227]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4227
[Intel XE#4608]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4608
[Intel XE#4609]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4609
[Intel XE#4650]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4650
[Intel XE#5191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5191
[Intel XE#5575]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5575
[Intel XE#5764]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5764
[Intel XE#5800]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5800
[Intel XE#5808]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5808
[Intel XE#5812]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5812
[Intel XE#5813]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5813
[Intel XE#5822]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5822
[Intel XE#5828]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5828
[Intel XE#5844]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5844
[Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
[Intel XE#5853]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5853
[Intel XE#5858]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5858
[Intel XE#5865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5865
[Intel XE#5900]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5900
[Intel XE#5901]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5901
[Intel XE#5907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5907
[Intel XE#5962]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5962
[Intel XE#6019]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6019
[Intel XE#6035]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6035
[Intel XE#6196]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6196
[Intel XE#6293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6293
[Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
[Intel XE#6376]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6376
[Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
[Intel XE#6540]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6540
[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#6886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6886
[Intel XE#6900]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6900
[Intel XE#6901]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6901
[Intel XE#6912]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6912
[Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
[Intel XE#6969]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6969
[Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
[Intel XE#7174]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7174
[Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
[Intel XE#7179]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7179
[Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
[Intel XE#7304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7304
[Intel XE#7318]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7318
[Intel XE#7330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7330
[Intel XE#7343]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7343
[Intel XE#7345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7345
[Intel XE#7347]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7347
[Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
[Intel XE#7355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7355
[Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
[Intel XE#7362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7362
[Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
[Intel XE#7374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7374
[Intel XE#7385]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7385
[Intel XE#7397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7397
[Intel XE#7399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7399
[Intel XE#7413]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7413
[Intel XE#7422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7422
[Intel XE#7424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7424
[Intel XE#7457]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7457
[Intel XE#7482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7482
[Intel XE#7484]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7484
[Intel XE#7642]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7642
[Intel XE#7644]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7644
[Intel XE#7679]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7679
[Intel XE#7865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7865
[Intel XE#7905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7905
[Intel XE#7935]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7935
[Intel XE#7980]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7980
[Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
[Intel XE#8303]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8303
[Intel XE#8339]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8339
[Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
[Intel XE#8369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8369
[Intel XE#8374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8374
[Intel XE#8378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8378
[Intel XE#8391]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8391
[Intel XE#9096]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9096
[Intel XE#9144]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9144
[Intel XE#9204]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9204
[Intel XE#9205]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9205
[Intel XE#9362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9362
[Intel XE#9363]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9363
[Intel XE#9375]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9375
[Intel XE#9399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9399
[Intel XE#9406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9406
[Intel XE#9422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9422
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
[Intel XE#9531]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9531
[Intel XE#9535]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9535

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

* Linux: xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39 -> xe-pw-166426v4

IGT_9150: 18811c476bfde62ffbb4c0af55cd6f57e36e0dca @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-5961-728ba1de4cb617e37b0f04258bdd0fc3248bdb39: 728ba1de4cb617e37b0f04258bdd0fc3248bdb39
xe-pw-166426v4: 166426v4

== Logs ==

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