public inbox for intel-xe@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH] drm/ttm/pool: back up at native page order
@ 2026-05-04  4:26 Matthew Brost
  2026-05-04  4:33 ` ✓ CI.KUnit: success for " Patchwork
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Matthew Brost @ 2026-05-04  4:26 UTC (permalink / raw)
  To: intel-xe, dri-devel
  Cc: Christian Koenig, Huang Rui, Matthew Auld, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
	linux-kernel, stable, Thomas Hellström

ttm_pool_split_for_swap() splits high-order pool pages into order-0
pages during backup so each 4K page can be released to the system as
soon as it has been written to shmem. While this minimizes the
allocator's working set during reclaim, it actively fragments memory:
every TTM-backed compound page that the shrinker touches is shattered
into order-0 pages, even when the rest of the system would prefer that
the high-order block stay intact. Under sustained kswapd pressure this
is enough to drive other parts of MM into recovery loops from which
they cannot easily escape, because the memory TTM just freed is no
longer contiguous.

Stop splitting on the backup path and back up each compound atomically
at its native order in ttm_pool_backup():

  - For each non-handle slot, read the order from the head page and
    back up all 1<<order subpages to consecutive shmem indices,
    writing the resulting handles into tt->pages[] as we go.
  - On any per-subpage backup failure, drop the handles we just wrote
    for this compound and restore the original page pointers, so the
    compound is left fully intact and may be retried later. shrunken
    is only incremented once the whole compound succeeds.
  - On success, the compound is freed once at its native order. No
    split_page(), no per-4K refcount juggling, no fragmentation
    introduced from this path.
  - Slots that already hold a backup handle from a previous partial
    attempt are skipped. A compound that would extend past a
    fault-injection-truncated num_pages is skipped rather than split.

The restore-side leftover-page branch in ttm_pool_restore_commit() is
left as-is for now: that path can still split a previously-retained
compound, but in practice it is unreachable under realistic workloads
(per profiling we have not been able to trigger it), so it is not
worth complicating the restore state machine to avoid the split there.
If it ever becomes a problem in practice it can be addressed
independently.

ttm_pool_split_for_swap() itself is retained for the restore path's
sole remaining caller. The DMA-mapped pre-backup unmap loop, the
purge path, ttm_pool_free_*, and ttm_pool_unmap_and_free() already
operate at native order and are unchanged.

Cc: Christian Koenig <christian.koenig@amd.com>
Cc: Huang Rui <ray.huang@amd.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Airlie <airlied@gmail.com>
Cc: Simona Vetter <simona@ffwll.ch>
Cc: dri-devel@lists.freedesktop.org
Cc: linux-kernel@vger.kernel.org
Cc: stable@vger.kernel.org
Fixes: b63d715b8090 ("drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages")
Suggested-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Matthew Brost <matthew.brost@intel.com>

---

A follow-up should attempt writeback to shmem at folio order as well,
but the API for doing so is unclear and may be incomplete.

This patch is related to the pending series [1] and significantly
reduces the likelihood of Xe entering a kswapd loop under fragmentation.
The kswapd → shrinker → Xe shrinker → TTM backup path is still
exercised; however, with this change the backup path no longer worsens
fragmentation, which previously amplified reclaim pressure and
reinforced the kswapd loop.

Nonetheless, the pathological case that [1] aims to address still exists
and requires a proper solution. Even with this patch, a kswapd loop due
to severe fragmentation can still be triggered, although it is now
substantially harder to reproduce.

[1] https://patchwork.freedesktop.org/series/165330/
---
 drivers/gpu/drm/ttm/ttm_pool.c | 71 +++++++++++++++++++++++++++-------
 1 file changed, 57 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
index 278bbe7a11ad..5ead0aba4bb7 100644
--- a/drivers/gpu/drm/ttm/ttm_pool.c
+++ b/drivers/gpu/drm/ttm/ttm_pool.c
@@ -1036,12 +1036,11 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
 {
 	struct file *backup = tt->backup;
 	struct page *page;
-	unsigned long handle;
 	gfp_t alloc_gfp;
 	gfp_t gfp;
 	int ret = 0;
 	pgoff_t shrunken = 0;
-	pgoff_t i, num_pages;
+	pgoff_t i, num_pages, npages;
 
 	if (WARN_ON(ttm_tt_is_backed_up(tt)))
 		return -EINVAL;
@@ -1097,28 +1096,72 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
 	if (IS_ENABLED(CONFIG_FAULT_INJECTION) && should_fail(&backup_fault_inject, 1))
 		num_pages = DIV_ROUND_UP(num_pages, 2);
 
-	for (i = 0; i < num_pages; ++i) {
-		s64 shandle;
+	for (i = 0; i < num_pages; i += npages) {
+		unsigned int order;
+		pgoff_t j;
 
+		npages = 1;
 		page = tt->pages[i];
 		if (unlikely(!page))
 			continue;
 
-		ttm_pool_split_for_swap(pool, page);
+		/* Already-handled entry from a previous attempt. */
+		if (unlikely(ttm_backup_page_ptr_is_handle(page)))
+			continue;
 
-		shandle = ttm_backup_backup_page(backup, page, flags->writeback, i,
-						 gfp, alloc_gfp);
-		if (shandle < 0) {
-			/* We allow partially shrunken tts */
-			ret = shandle;
+		order = ttm_pool_page_order(pool, page);
+		npages = 1UL << order;
+
+		/*
+		 * Back up the compound atomically at its native order. If
+		 * fault injection truncated num_pages mid-compound, skip
+		 * the partial tail rather than splitting.
+		 */
+		if (unlikely(i + npages > num_pages))
 			break;
+
+		for (j = 0; j < npages; ++j) {
+			unsigned long handle;
+			s64 shandle;
+
+			if (IS_ENABLED(CONFIG_FAULT_INJECTION) &&
+			    should_fail(&backup_fault_inject, 1))
+				shandle = -1;
+			else
+				shandle = ttm_backup_backup_page(backup, page + j,
+								 flags->writeback,
+								 i + j, gfp,
+								 alloc_gfp);
+
+			if (unlikely(shandle < 0)) {
+				pgoff_t k;
+
+				ret = shandle;
+				/*
+				 * Roll back: drop the handles we just wrote
+				 * and restore the original page pointers so
+				 * the compound remains intact and may be
+				 * retried later.
+				 */
+				for (k = 0; k < j; ++k) {
+					handle = ttm_backup_page_ptr_to_handle(tt->pages[i + k]);
+					ttm_backup_drop(backup, handle);
+					tt->pages[i + k] = page + k;
+				}
+
+				goto out;
+			}
+			handle = shandle;
+			tt->pages[i + j] = ttm_backup_handle_to_page_ptr(shandle);
 		}
-		handle = shandle;
-		tt->pages[i] = ttm_backup_handle_to_page_ptr(handle);
-		__free_pages_gpu_account(page, 0, false);
-		shrunken++;
+
+		/* Compound fully backed up; free at native order. */
+		page->private = 0;
+		__free_pages_gpu_account(page, order, false);
+		shrunken += npages;
 	}
 
+out:
 	return shrunken ? shrunken : ret;
 }
 
-- 
2.34.1


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

* ✓ CI.KUnit: success for drm/ttm/pool: back up at native page order
  2026-05-04  4:26 [PATCH] drm/ttm/pool: back up at native page order Matthew Brost
@ 2026-05-04  4:33 ` Patchwork
  2026-05-04  5:28 ` ✓ Xe.CI.BAT: " Patchwork
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2026-05-04  4:33 UTC (permalink / raw)
  To: Matthew Brost; +Cc: intel-xe

== Series Details ==

Series: drm/ttm/pool: back up at native page order
URL   : https://patchwork.freedesktop.org/series/165878/
State : success

== Summary ==

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

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

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

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



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

* ✓ Xe.CI.BAT: success for drm/ttm/pool: back up at native page order
  2026-05-04  4:26 [PATCH] drm/ttm/pool: back up at native page order Matthew Brost
  2026-05-04  4:33 ` ✓ CI.KUnit: success for " Patchwork
@ 2026-05-04  5:28 ` Patchwork
  2026-05-04  6:33 ` ✗ Xe.CI.FULL: failure " Patchwork
  2026-05-04  8:35 ` [PATCH] " Thomas Hellström
  3 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2026-05-04  5:28 UTC (permalink / raw)
  To: Matthew Brost; +Cc: intel-xe

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

== Series Details ==

Series: drm/ttm/pool: back up at native page order
URL   : https://patchwork.freedesktop.org/series/165878/
State : success

== Summary ==

CI Bug Log - changes from xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed_BAT -> xe-pw-165878v1_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

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

  No changes in participating hosts


Changes
-------

  No changes found


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

  * Linux: xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed -> xe-pw-165878v1

  IGT_8881: aa5853ef5b379b1e4558218c21ef4caeae112184 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed: 60a9a478148bc09e2d12c8310e22ec83200ed0ed
  xe-pw-165878v1: 165878v1

== Logs ==

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

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

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

* ✗ Xe.CI.FULL: failure for drm/ttm/pool: back up at native page order
  2026-05-04  4:26 [PATCH] drm/ttm/pool: back up at native page order Matthew Brost
  2026-05-04  4:33 ` ✓ CI.KUnit: success for " Patchwork
  2026-05-04  5:28 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-05-04  6:33 ` Patchwork
  2026-05-04  8:35 ` [PATCH] " Thomas Hellström
  3 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2026-05-04  6:33 UTC (permalink / raw)
  To: Matthew Brost; +Cc: intel-xe

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

== Series Details ==

Series: drm/ttm/pool: back up at native page order
URL   : https://patchwork.freedesktop.org/series/165878/
State : failure

== Summary ==

CI Bug Log - changes from xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed_FULL -> xe-pw-165878v1_FULL
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with xe-pw-165878v1_FULL absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in xe-pw-165878v1_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

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

  No changes in participating hosts

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in xe-pw-165878v1_FULL:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_color_pipeline@plane-lut1d-lut1d:
    - shard-bmg:          [PASS][1] -> [TIMEOUT][2]
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-bmg-10/igt@kms_color_pipeline@plane-lut1d-lut1d.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-bmg-3/igt@kms_color_pipeline@plane-lut1d-lut1d.html

  * igt@xe_exec_system_allocator@madvise-preffered-loc-atomic-gl:
    - shard-bmg:          [PASS][3] -> [ABORT][4]
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-bmg-10/igt@xe_exec_system_allocator@madvise-preffered-loc-atomic-gl.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-bmg-3/igt@xe_exec_system_allocator@madvise-preffered-loc-atomic-gl.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-huge-nomemset:
    - shard-lnl:          [PASS][5] -> [FAIL][6]
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-lnl-4/igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-huge-nomemset.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-huge-nomemset.html

  * igt@xe_pm@s4-basic:
    - shard-bmg:          [PASS][7] -> [DMESG-WARN][8]
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-bmg-10/igt@xe_pm@s4-basic.html
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-bmg-3/igt@xe_pm@s4-basic.html

  * igt@xe_vm@overcommit-fault-vram-lr:
    - shard-lnl:          NOTRUN -> [SKIP][9]
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_vm@overcommit-fault-vram-lr.html

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

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

### IGT changes ###

#### Issues hit ####

  * igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
    - shard-lnl:          NOTRUN -> [SKIP][10] ([Intel XE#1466])
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
    - shard-lnl:          NOTRUN -> [SKIP][11] ([Intel XE#3658] / [Intel XE#7360]) +1 other test skip
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@linear-8bpp-rotate-270:
    - shard-lnl:          NOTRUN -> [SKIP][12] ([Intel XE#1407]) +1 other test skip
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_big_fb@linear-8bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
    - shard-lnl:          NOTRUN -> [SKIP][13] ([Intel XE#1477] / [Intel XE#7361])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_big_fb@y-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@yf-tiled-16bpp-rotate-180:
    - shard-lnl:          NOTRUN -> [SKIP][14] ([Intel XE#1124]) +5 other tests skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_big_fb@yf-tiled-16bpp-rotate-180.html

  * igt@kms_big_fb@yf-tiled-addfb:
    - shard-lnl:          NOTRUN -> [SKIP][15] ([Intel XE#1467] / [Intel XE#7367])
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_big_fb@yf-tiled-addfb.html

  * igt@kms_bw@connected-linear-tiling-4-displays-target-2160x1440p:
    - shard-lnl:          NOTRUN -> [SKIP][16] ([Intel XE#7676])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_bw@connected-linear-tiling-4-displays-target-2160x1440p.html

  * igt@kms_bw@linear-tiling-2-displays-target-2560x1440p:
    - shard-lnl:          NOTRUN -> [SKIP][17] ([Intel XE#367]) +1 other test skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_bw@linear-tiling-2-displays-target-2560x1440p.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs-cc:
    - shard-lnl:          NOTRUN -> [SKIP][18] ([Intel XE#2887]) +12 other tests skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs-cc.html

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

  * igt@kms_chamelium_color@ctm-max:
    - shard-lnl:          NOTRUN -> [SKIP][20] ([Intel XE#306] / [Intel XE#7358]) +1 other test skip
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_chamelium_color@ctm-max.html

  * igt@kms_chamelium_hpd@hdmi-hpd-fast:
    - shard-lnl:          NOTRUN -> [SKIP][21] ([Intel XE#373]) +4 other tests skip
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_chamelium_hpd@hdmi-hpd-fast.html

  * igt@kms_content_protection@dp-mst-type-1:
    - shard-lnl:          NOTRUN -> [SKIP][22] ([Intel XE#307] / [Intel XE#6974])
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_content_protection@dp-mst-type-1.html

  * igt@kms_content_protection@suspend-resume:
    - shard-lnl:          NOTRUN -> [SKIP][23] ([Intel XE#7642]) +2 other tests skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_content_protection@suspend-resume.html

  * igt@kms_cursor_crc@cursor-rapid-movement-128x42:
    - shard-lnl:          NOTRUN -> [SKIP][24] ([Intel XE#1424]) +2 other tests skip
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_cursor_crc@cursor-rapid-movement-128x42.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-legacy:
    - shard-lnl:          NOTRUN -> [SKIP][25] ([Intel XE#309] / [Intel XE#7343]) +4 other tests skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
    - shard-lnl:          NOTRUN -> [SKIP][26] ([Intel XE#323] / [Intel XE#6035])
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

  * igt@kms_display_modes@extended-mode-basic:
    - shard-lnl:          NOTRUN -> [SKIP][27] ([Intel XE#4302])
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_display_modes@extended-mode-basic.html

  * igt@kms_dsc@dsc-with-output-formats:
    - shard-lnl:          NOTRUN -> [SKIP][28] ([Intel XE#2244])
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_dsc@dsc-with-output-formats.html

  * igt@kms_flip@2x-absolute-wf_vblank-interruptible:
    - shard-lnl:          NOTRUN -> [SKIP][29] ([Intel XE#1421])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_flip@2x-absolute-wf_vblank-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-lnl:          [PASS][30] -> [FAIL][31] ([Intel XE#301] / [Intel XE#3149]) +1 other test fail
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank@a-edp1:
    - shard-lnl:          [PASS][32] -> [FAIL][33] ([Intel XE#301]) +1 other test fail
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html

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

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

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

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscreen-pri-indfb-draw-mmap-wc:
    - shard-lnl:          NOTRUN -> [SKIP][37] ([Intel XE#6312]) +2 other tests skip
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscreen-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-argb161616f-draw-mmap-wc:
    - shard-lnl:          NOTRUN -> [SKIP][38] ([Intel XE#7061] / [Intel XE#7356]) +3 other tests skip
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_frontbuffer_tracking@fbcdrrs-argb161616f-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][39] ([Intel XE#6312] / [Intel XE#651]) +8 other tests skip
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][40] ([Intel XE#5812] / [Intel XE#656]) +28 other tests skip
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-render.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-lnl:          NOTRUN -> [SKIP][41] ([Intel XE#1503])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-lnl:          NOTRUN -> [SKIP][42] ([Intel XE#4298] / [Intel XE#5873])
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_joiner@basic-max-non-joiner.html

  * igt@kms_joiner@invalid-modeset-force-ultra-joiner:
    - shard-lnl:          NOTRUN -> [SKIP][43] ([Intel XE#6900] / [Intel XE#7362])
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_joiner@invalid-modeset-force-ultra-joiner.html

  * igt@kms_plane@pixel-format-4-tiled-dg2-rc-ccs-modifier:
    - shard-lnl:          NOTRUN -> [SKIP][44] ([Intel XE#7283]) +3 other tests skip
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_plane@pixel-format-4-tiled-dg2-rc-ccs-modifier.html

  * igt@kms_plane_lowres@tiling-x@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][45] ([Intel XE#599] / [Intel XE#7382]) +3 other tests skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_plane_lowres@tiling-x@pipe-b-edp-1.html

  * igt@kms_plane_lowres@tiling-y:
    - shard-lnl:          NOTRUN -> [SKIP][46] ([Intel XE#599])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_plane_lowres@tiling-y.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-75@pipe-a:
    - shard-lnl:          NOTRUN -> [SKIP][47] ([Intel XE#2763] / [Intel XE#6886]) +3 other tests skip
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_plane_scaling@planes-downscale-factor-0-75@pipe-a.html

  * igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area:
    - shard-lnl:          NOTRUN -> [SKIP][48] ([Intel XE#2893] / [Intel XE#7304]) +2 other tests skip
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area:
    - shard-lnl:          NOTRUN -> [SKIP][49] ([Intel XE#2893] / [Intel XE#4608] / [Intel XE#7304])
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][50] ([Intel XE#4608])
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-a-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][51] ([Intel XE#4608] / [Intel XE#7304])
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area@pipe-b-edp-1.html

  * igt@kms_psr2_su@page_flip-nv12:
    - shard-lnl:          NOTRUN -> [SKIP][52] ([Intel XE#1128] / [Intel XE#7413])
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_psr2_su@page_flip-nv12.html

  * igt@kms_psr@fbc-psr2-sprite-blt:
    - shard-lnl:          NOTRUN -> [SKIP][53] ([Intel XE#1406] / [Intel XE#7345])
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_psr@fbc-psr2-sprite-blt.html

  * igt@kms_psr@fbc-psr2-sprite-blt@edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][54] ([Intel XE#1406] / [Intel XE#4609])
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@kms_psr@fbc-psr2-sprite-blt@edp-1.html

  * igt@kms_psr@pr-no-drrs:
    - shard-lnl:          NOTRUN -> [SKIP][55] ([Intel XE#1406]) +3 other tests skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_psr@pr-no-drrs.html

  * igt@kms_rotation_crc@primary-rotation-90:
    - shard-lnl:          NOTRUN -> [SKIP][56] ([Intel XE#3414] / [Intel XE#3904] / [Intel XE#7342]) +1 other test skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_rotation_crc@primary-rotation-90.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
    - shard-lnl:          NOTRUN -> [SKIP][57] ([Intel XE#1127] / [Intel XE#5813]) +1 other test skip
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180.html

  * igt@kms_vrr@lobf:
    - shard-lnl:          NOTRUN -> [SKIP][58] ([Intel XE#1499])
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_vrr@lobf.html

  * igt@kms_vrr@lobf@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][59] ([Intel XE#7638])
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@kms_vrr@lobf@pipe-a-edp-1.html

  * igt@xe_ccs@vm-bind-decompress:
    - shard-lnl:          NOTRUN -> [SKIP][60] ([Intel XE#7644])
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@xe_ccs@vm-bind-decompress.html

  * igt@xe_compute_preempt@compute-preempt-many-vram:
    - shard-lnl:          NOTRUN -> [SKIP][61] ([Intel XE#5191] / [Intel XE#7316] / [Intel XE#7346])
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_compute_preempt@compute-preempt-many-vram.html

  * igt@xe_configfs@survivability-mode:
    - shard-lnl:          NOTRUN -> [SKIP][62] ([Intel XE#6010] / [Intel XE#7317] / [Intel XE#7455])
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@xe_configfs@survivability-mode.html

  * igt@xe_eudebug_online@set-breakpoint:
    - shard-lnl:          NOTRUN -> [SKIP][63] ([Intel XE#7636]) +9 other tests skip
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_eudebug_online@set-breakpoint.html

  * igt@xe_evict_ccs@evict-overcommit-parallel-instantfree-reopen:
    - shard-lnl:          NOTRUN -> [SKIP][64] ([Intel XE#6540] / [Intel XE#688]) +7 other tests skip
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_evict_ccs@evict-overcommit-parallel-instantfree-reopen.html

  * igt@xe_exec_balancer@once-parallel-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][65] ([Intel XE#7482]) +14 other tests skip
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_exec_balancer@once-parallel-rebind.html

  * igt@xe_exec_basic@multigpu-once-null-defer-bind:
    - shard-lnl:          NOTRUN -> [SKIP][66] ([Intel XE#1392]) +5 other tests skip
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@xe_exec_basic@multigpu-once-null-defer-bind.html

  * igt@xe_exec_fault_mode@twice-multi-queue-userptr-imm:
    - shard-lnl:          NOTRUN -> [SKIP][67] ([Intel XE#7136]) +9 other tests skip
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@xe_exec_fault_mode@twice-multi-queue-userptr-imm.html

  * igt@xe_exec_multi_queue@many-queues-preempt-mode-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][68] ([Intel XE#6874]) +20 other tests skip
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@xe_exec_multi_queue@many-queues-preempt-mode-userptr.html

  * igt@xe_exec_threads@threads-multi-queue-mixed-shared-vm-userptr-invalidate-race:
    - shard-lnl:          NOTRUN -> [SKIP][69] ([Intel XE#7138]) +5 other tests skip
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_exec_threads@threads-multi-queue-mixed-shared-vm-userptr-invalidate-race.html

  * igt@xe_mmap@vram:
    - shard-lnl:          NOTRUN -> [SKIP][70] ([Intel XE#1416])
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@xe_mmap@vram.html

  * igt@xe_multigpu_svm@mgpu-pagefault-conflict:
    - shard-lnl:          NOTRUN -> [SKIP][71] ([Intel XE#6964]) +2 other tests skip
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@xe_multigpu_svm@mgpu-pagefault-conflict.html

  * igt@xe_page_reclaim@basic-mixed:
    - shard-lnl:          NOTRUN -> [SKIP][72] ([Intel XE#7793])
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_page_reclaim@basic-mixed.html

  * igt@xe_pat@pat-sw-hw-reset-compare:
    - shard-lnl:          NOTRUN -> [FAIL][73] ([Intel XE#7695])
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_pat@pat-sw-hw-reset-compare.html

  * igt@xe_pm@d3cold-mocs:
    - shard-lnl:          NOTRUN -> [SKIP][74] ([Intel XE#2284] / [Intel XE#7370])
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@xe_pm@d3cold-mocs.html

  * igt@xe_pm@s3-vm-bind-unbind-all:
    - shard-lnl:          NOTRUN -> [SKIP][75] ([Intel XE#584] / [Intel XE#7369])
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-8/igt@xe_pm@s3-vm-bind-unbind-all.html

  * igt@xe_query@multigpu-query-uc-fw-version-huc:
    - shard-lnl:          NOTRUN -> [SKIP][76] ([Intel XE#944]) +1 other test skip
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_query@multigpu-query-uc-fw-version-huc.html

  * igt@xe_sriov_admin@preempt-timeout-write-readback-vfs-disabled:
    - shard-lnl:          NOTRUN -> [SKIP][77] ([Intel XE#7174])
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@xe_sriov_admin@preempt-timeout-write-readback-vfs-disabled.html

  * igt@xe_sriov_scheduling@equal-throughput:
    - shard-lnl:          NOTRUN -> [SKIP][78] ([Intel XE#4351] / [Intel XE#7357])
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-7/igt@xe_sriov_scheduling@equal-throughput.html

  * igt@xe_sriov_vram@vf-access-after-resize-up:
    - shard-lnl:          NOTRUN -> [SKIP][79] ([Intel XE#6376] / [Intel XE#7330] / [Intel XE#7422])
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-lnl-4/igt@xe_sriov_vram@vf-access-after-resize-up.html

  
#### Possible fixes ####

  * igt@kms_cursor_legacy@cursora-vs-flipa-atomic-transitions-varying-size:
    - shard-bmg:          [DMESG-WARN][80] ([Intel XE#5354]) -> [PASS][81] +1 other test pass
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-bmg-4/igt@kms_cursor_legacy@cursora-vs-flipa-atomic-transitions-varying-size.html
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-bmg-7/igt@kms_cursor_legacy@cursora-vs-flipa-atomic-transitions-varying-size.html

  * igt@xe_evict@evict-mixed-many-threads-small:
    - shard-bmg:          [INCOMPLETE][82] ([Intel XE#6321]) -> [PASS][83]
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-bmg-2/igt@xe_evict@evict-mixed-many-threads-small.html
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-bmg-1/igt@xe_evict@evict-mixed-many-threads-small.html

  
#### Warnings ####

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-bmg:          [SKIP][84] ([Intel XE#2509] / [Intel XE#7437]) -> [SKIP][85] ([Intel XE#2426] / [Intel XE#5848])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed/shard-bmg-6/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165878v1/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  
  [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#1128]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1128
  [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#1416]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1416
  [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#1466]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1466
  [Intel XE#1467]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1467
  [Intel XE#1477]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1477
  [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
  [Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509
  [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#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
  [Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [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#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
  [Intel XE#3658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3658
  [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#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4298]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4298
  [Intel XE#4302]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4302
  [Intel XE#4351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4351
  [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#5191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5191
  [Intel XE#5354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5354
  [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#584]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/584
  [Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
  [Intel XE#5873]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5873
  [Intel XE#599]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/599
  [Intel XE#6010]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6010
  [Intel XE#6035]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6035
  [Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
  [Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321
  [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#6874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6874
  [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#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
  [Intel XE#6974]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6974
  [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
  [Intel XE#7136]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7136
  [Intel XE#7138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7138
  [Intel XE#7174]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7174
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
  [Intel XE#7304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7304
  [Intel XE#7316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7316
  [Intel XE#7317]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7317
  [Intel XE#7330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7330
  [Intel XE#7342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7342
  [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#7346]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7346
  [Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
  [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
  [Intel XE#7357]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7357
  [Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
  [Intel XE#7360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7360
  [Intel XE#7361]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7361
  [Intel XE#7362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7362
  [Intel XE#7367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7367
  [Intel XE#7369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7369
  [Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
  [Intel XE#7382]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7382
  [Intel XE#7385]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7385
  [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#7437]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7437
  [Intel XE#7455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7455
  [Intel XE#7482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7482
  [Intel XE#7636]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7636
  [Intel XE#7638]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7638
  [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#7676]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7676
  [Intel XE#7695]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7695
  [Intel XE#7793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7793
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


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

  * Linux: xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed -> xe-pw-165878v1

  IGT_8881: aa5853ef5b379b1e4558218c21ef4caeae112184 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-4968-60a9a478148bc09e2d12c8310e22ec83200ed0ed: 60a9a478148bc09e2d12c8310e22ec83200ed0ed
  xe-pw-165878v1: 165878v1

== Logs ==

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

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

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

* Re: [PATCH] drm/ttm/pool: back up at native page order
  2026-05-04  4:26 [PATCH] drm/ttm/pool: back up at native page order Matthew Brost
                   ` (2 preceding siblings ...)
  2026-05-04  6:33 ` ✗ Xe.CI.FULL: failure " Patchwork
@ 2026-05-04  8:35 ` Thomas Hellström
  2026-05-04 14:30   ` Matthew Brost
  3 siblings, 1 reply; 8+ messages in thread
From: Thomas Hellström @ 2026-05-04  8:35 UTC (permalink / raw)
  To: Matthew Brost, intel-xe, dri-devel
  Cc: Christian Koenig, Huang Rui, Matthew Auld, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
	linux-kernel, stable

Hi, Matt,

On Sun, 2026-05-03 at 21:26 -0700, Matthew Brost wrote:
> ttm_pool_split_for_swap() splits high-order pool pages into order-0
> pages during backup so each 4K page can be released to the system as
> soon as it has been written to shmem. While this minimizes the
> allocator's working set during reclaim, it actively fragments memory:
> every TTM-backed compound page that the shrinker touches is shattered
> into order-0 pages, even when the rest of the system would prefer
> that
> the high-order block stay intact. Under sustained kswapd pressure
> this
> is enough to drive other parts of MM into recovery loops from which
> they cannot easily escape, because the memory TTM just freed is no
> longer contiguous.
> 
> Stop splitting on the backup path and back up each compound
> atomically
> at its native order in ttm_pool_backup():
> 
>   - For each non-handle slot, read the order from the head page and
>     back up all 1<<order subpages to consecutive shmem indices,
>     writing the resulting handles into tt->pages[] as we go.
>   - On any per-subpage backup failure, drop the handles we just wrote
>     for this compound and restore the original page pointers, so the
>     compound is left fully intact and may be retried later. shrunken
>     is only incremented once the whole compound succeeds.
>   - On success, the compound is freed once at its native order. No
>     split_page(), no per-4K refcount juggling, no fragmentation
>     introduced from this path.
>   - Slots that already hold a backup handle from a previous partial
>     attempt are skipped. A compound that would extend past a
>     fault-injection-truncated num_pages is skipped rather than split.
> 
> The restore-side leftover-page branch in ttm_pool_restore_commit() is
> left as-is for now: that path can still split a previously-retained
> compound, but in practice it is unreachable under realistic workloads
> (per profiling we have not been able to trigger it), so it is not
> worth complicating the restore state machine to avoid the split
> there.
> If it ever becomes a problem in practice it can be addressed
> independently.
> 
> ttm_pool_split_for_swap() itself is retained for the restore path's
> sole remaining caller. The DMA-mapped pre-backup unmap loop, the
> purge path, ttm_pool_free_*, and ttm_pool_unmap_and_free() already
> operate at native order and are unchanged.

This split is intentional in that without it, we'd need to first
allocate 1 << order pages from the kernel's *reserves* in order to
later free 2 << order pages, making the shrinker much more likely to
fail in true OOM situations. (I believe this was one of the reasons the
initial shrinker attempts from AMD didn't work as expected).


I believe the solution here is in the ttm_backup layer, We should
introduce a ttm_backup_backup_folio function and either insert the page
directly into the shmem object (zero-copy) or even directly into the
swap cache. Then we should completely restrict xe page allocations to
only allow THP and PAGE_SIZE (Possibly 64K pages, but they'd either
need a split or perhaps they are small enough to be backed-up using
one-go copy, similar to this patch, but in the backup layer). FWIW at
the time the shrinker was put together, AFAIU SHMEM split large pages
on swapping anyway, but since that appears to have changed, we need to
catch up.

Inserting directly into the swap-cache WIP is here, rebased on a recent
kernel (This is an old idea that has actually been out on RFC once).
This needs a core mm bugfix (also in the branch), but I'm not sure the
swap cache is the right place to do this, at least not if we don't
immediately schedule a write to disc, it looks like current users don't
want to keep pages in swap-cache for very long (related to that bug)
https://gitlab.freedesktop.org/thomash/xe-vibe/-/commits/thp_swapping2

Inserting directly into shmem (A fairly recent idea that is mostly
untested)
https://gitlab.freedesktop.org/thomash/xe-vibe/-/commits/insert_shmem?ref_type=heads
Since SHMEM schedules writeout immediately when pages are moved to the
swap-cache, it's not as susceptible to the above bug, since swap-cache
entries are not typically held for folios for which we haven't
scheduled writeout.

We should try to solicit feedback from mm people on these two
approaches.

/Thomas

> 
> Cc: Christian Koenig <christian.koenig@amd.com>
> Cc: Huang Rui <ray.huang@amd.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Simona Vetter <simona@ffwll.ch>
> Cc: dri-devel@lists.freedesktop.org
> Cc: linux-kernel@vger.kernel.org
> Cc: stable@vger.kernel.org
> Fixes: b63d715b8090 ("drm/ttm/pool, drm/ttm/tt: Provide a helper to
> shrink pages")
> Suggested-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Assisted-by: Claude:claude-opus-4.6
> Signed-off-by: Matthew Brost <matthew.brost@intel.com>
> 
> ---
> 
> A follow-up should attempt writeback to shmem at folio order as well,
> but the API for doing so is unclear and may be incomplete.
> 
> This patch is related to the pending series [1] and significantly
> reduces the likelihood of Xe entering a kswapd loop under
> fragmentation.
> The kswapd → shrinker → Xe shrinker → TTM backup path is still
> exercised; however, with this change the backup path no longer
> worsens
> fragmentation, which previously amplified reclaim pressure and
> reinforced the kswapd loop.
> 
> Nonetheless, the pathological case that [1] aims to address still
> exists
> and requires a proper solution. Even with this patch, a kswapd loop
> due
> to severe fragmentation can still be triggered, although it is now
> substantially harder to reproduce.
> 
> [1] https://patchwork.freedesktop.org/series/165330/
> ---
>  drivers/gpu/drm/ttm/ttm_pool.c | 71 +++++++++++++++++++++++++++-----
> --
>  1 file changed, 57 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> b/drivers/gpu/drm/ttm/ttm_pool.c
> index 278bbe7a11ad..5ead0aba4bb7 100644
> --- a/drivers/gpu/drm/ttm/ttm_pool.c
> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> @@ -1036,12 +1036,11 @@ long ttm_pool_backup(struct ttm_pool *pool,
> struct ttm_tt *tt,
>  {
>  	struct file *backup = tt->backup;
>  	struct page *page;
> -	unsigned long handle;
>  	gfp_t alloc_gfp;
>  	gfp_t gfp;
>  	int ret = 0;
>  	pgoff_t shrunken = 0;
> -	pgoff_t i, num_pages;
> +	pgoff_t i, num_pages, npages;
>  
>  	if (WARN_ON(ttm_tt_is_backed_up(tt)))
>  		return -EINVAL;
> @@ -1097,28 +1096,72 @@ long ttm_pool_backup(struct ttm_pool *pool,
> struct ttm_tt *tt,
>  	if (IS_ENABLED(CONFIG_FAULT_INJECTION) &&
> should_fail(&backup_fault_inject, 1))
>  		num_pages = DIV_ROUND_UP(num_pages, 2);
>  
> -	for (i = 0; i < num_pages; ++i) {
> -		s64 shandle;
> +	for (i = 0; i < num_pages; i += npages) {
> +		unsigned int order;
> +		pgoff_t j;
>  
> +		npages = 1;
>  		page = tt->pages[i];
>  		if (unlikely(!page))
>  			continue;
>  
> -		ttm_pool_split_for_swap(pool, page);
> +		/* Already-handled entry from a previous attempt. */
> +		if (unlikely(ttm_backup_page_ptr_is_handle(page)))
> +			continue;
>  
> -		shandle = ttm_backup_backup_page(backup, page,
> flags->writeback, i,
> -						 gfp, alloc_gfp);
> -		if (shandle < 0) {
> -			/* We allow partially shrunken tts */
> -			ret = shandle;
> +		order = ttm_pool_page_order(pool, page);
> +		npages = 1UL << order;
> +
> +		/*
> +		 * Back up the compound atomically at its native
> order. If
> +		 * fault injection truncated num_pages mid-compound,
> skip
> +		 * the partial tail rather than splitting.
> +		 */
> +		if (unlikely(i + npages > num_pages))
>  			break;
> +
> +		for (j = 0; j < npages; ++j) {
> +			unsigned long handle;
> +			s64 shandle;
> +
> +			if (IS_ENABLED(CONFIG_FAULT_INJECTION) &&
> +			    should_fail(&backup_fault_inject, 1))
> +				shandle = -1;
> +			else
> +				shandle =
> ttm_backup_backup_page(backup, page + j,
> +								
> flags->writeback,
> +								 i +
> j, gfp,
> +								
> alloc_gfp);
> +
> +			if (unlikely(shandle < 0)) {
> +				pgoff_t k;
> +
> +				ret = shandle;
> +				/*
> +				 * Roll back: drop the handles we
> just wrote
> +				 * and restore the original page
> pointers so
> +				 * the compound remains intact and
> may be
> +				 * retried later.
> +				 */
> +				for (k = 0; k < j; ++k) {
> +					handle =
> ttm_backup_page_ptr_to_handle(tt->pages[i + k]);
> +					ttm_backup_drop(backup,
> handle);
> +					tt->pages[i + k] = page + k;
> +				}
> +
> +				goto out;
> +			}
> +			handle = shandle;
> +			tt->pages[i + j] =
> ttm_backup_handle_to_page_ptr(shandle);
>  		}
> -		handle = shandle;
> -		tt->pages[i] =
> ttm_backup_handle_to_page_ptr(handle);
> -		__free_pages_gpu_account(page, 0, false);
> -		shrunken++;
> +
> +		/* Compound fully backed up; free at native order.
> */
> +		page->private = 0;
> +		__free_pages_gpu_account(page, order, false);
> +		shrunken += npages;
>  	}
>  
> +out:
>  	return shrunken ? shrunken : ret;
>  }
>  

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

* Re: [PATCH] drm/ttm/pool: back up at native page order
  2026-05-04  8:35 ` [PATCH] " Thomas Hellström
@ 2026-05-04 14:30   ` Matthew Brost
  2026-05-04 15:19     ` Thomas Hellström
  0 siblings, 1 reply; 8+ messages in thread
From: Matthew Brost @ 2026-05-04 14:30 UTC (permalink / raw)
  To: Thomas Hellström
  Cc: intel-xe, dri-devel, Christian Koenig, Huang Rui, Matthew Auld,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, linux-kernel, stable

On Mon, May 04, 2026 at 10:35:23AM +0200, Thomas Hellström wrote:
> Hi, Matt,
> 
> On Sun, 2026-05-03 at 21:26 -0700, Matthew Brost wrote:
> > ttm_pool_split_for_swap() splits high-order pool pages into order-0
> > pages during backup so each 4K page can be released to the system as
> > soon as it has been written to shmem. While this minimizes the
> > allocator's working set during reclaim, it actively fragments memory:
> > every TTM-backed compound page that the shrinker touches is shattered
> > into order-0 pages, even when the rest of the system would prefer
> > that
> > the high-order block stay intact. Under sustained kswapd pressure
> > this
> > is enough to drive other parts of MM into recovery loops from which
> > they cannot easily escape, because the memory TTM just freed is no
> > longer contiguous.
> > 
> > Stop splitting on the backup path and back up each compound
> > atomically
> > at its native order in ttm_pool_backup():
> > 
> >   - For each non-handle slot, read the order from the head page and
> >     back up all 1<<order subpages to consecutive shmem indices,
> >     writing the resulting handles into tt->pages[] as we go.
> >   - On any per-subpage backup failure, drop the handles we just wrote
> >     for this compound and restore the original page pointers, so the
> >     compound is left fully intact and may be retried later. shrunken
> >     is only incremented once the whole compound succeeds.
> >   - On success, the compound is freed once at its native order. No
> >     split_page(), no per-4K refcount juggling, no fragmentation
> >     introduced from this path.
> >   - Slots that already hold a backup handle from a previous partial
> >     attempt are skipped. A compound that would extend past a
> >     fault-injection-truncated num_pages is skipped rather than split.
> > 
> > The restore-side leftover-page branch in ttm_pool_restore_commit() is
> > left as-is for now: that path can still split a previously-retained
> > compound, but in practice it is unreachable under realistic workloads
> > (per profiling we have not been able to trigger it), so it is not
> > worth complicating the restore state machine to avoid the split
> > there.
> > If it ever becomes a problem in practice it can be addressed
> > independently.
> > 
> > ttm_pool_split_for_swap() itself is retained for the restore path's
> > sole remaining caller. The DMA-mapped pre-backup unmap loop, the
> > purge path, ttm_pool_free_*, and ttm_pool_unmap_and_free() already
> > operate at native order and are unchanged.
> 
> This split is intentional in that without it, we'd need to first
> allocate 1 << order pages from the kernel's *reserves* in order to
> later free 2 << order pages, making the shrinker much more likely to
> fail in true OOM situations. (I believe this was one of the reasons the
> initial shrinker attempts from AMD didn't work as expected).
> 

So where exactly is allocation done—shmem_read_folio_gfp or
shmem_writeout? I did notice and called out, in the commit message, that
those interfaces are a bit confusing with respect to whether they
actually work with higher-order allocations.

Also, FWIW, this patch by itself seems to greatly help with
fragmentation, and I haven’t seen the OOM killer kick in. I’ve done
things like running WebGL in a bunch of Chrome tabs, then running
bonnie++ (which basically uses all memory), or running IGTs, which also
use all available memory. Based on that, I’m leaning toward this patch
alone working as designed.

> 
> I believe the solution here is in the ttm_backup layer, We should
> introduce a ttm_backup_backup_folio function and either insert the page

I think something like ttm_backup_backup_folio() makes sense, again I
called out in commit message.

> directly into the shmem object (zero-copy) or even directly into the
> swap cache. Then we should completely restrict xe page allocations to
> only allow THP and PAGE_SIZE (Possibly 64K pages, but they'd either
> need a split or perhaps they are small enough to be backed-up using

Yes, I did raise something like with Christian too [1]. IMO the driver
should be able dictate to TTM the orders it likely to allocate at.

[1] https://patchwork.freedesktop.org/patch/716362/?series=164338&rev=1

> one-go copy, similar to this patch, but in the backup layer). FWIW at
> the time the shrinker was put together, AFAIU SHMEM split large pages
> on swapping anyway, but since that appears to have changed, we need to
> catch up.
> 
> Inserting directly into the swap-cache WIP is here, rebased on a recent
> kernel (This is an old idea that has actually been out on RFC once).
> This needs a core mm bugfix (also in the branch), but I'm not sure the
> swap cache is the right place to do this, at least not if we don't
> immediately schedule a write to disc, it looks like current users don't
> want to keep pages in swap-cache for very long (related to that bug)
> https://gitlab.freedesktop.org/thomash/xe-vibe/-/commits/thp_swapping2
> 
> Inserting directly into shmem (A fairly recent idea that is mostly
> untested)
> https://gitlab.freedesktop.org/thomash/xe-vibe/-/commits/insert_shmem?ref_type=heads
> Since SHMEM schedules writeout immediately when pages are moved to the
> swap-cache, it's not as susceptible to the above bug, since swap-cache
> entries are not typically held for folios for which we haven't
> scheduled writeout.
> 

Let me take a look at these branches today.

> We should try to solicit feedback from mm people on these two
> approaches.

+1, but I think we should stop here if this patch, as‑is, is OK to go
in—ideally as a fix—since, based on my testing, it seems to help quite a
bit and current upstream shrinker is badly broken.

Matt

> 
> /Thomas
> 
> > 
> > Cc: Christian Koenig <christian.koenig@amd.com>
> > Cc: Huang Rui <ray.huang@amd.com>
> > Cc: Matthew Auld <matthew.auld@intel.com>
> > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > Cc: Maxime Ripard <mripard@kernel.org>
> > Cc: Thomas Zimmermann <tzimmermann@suse.de>
> > Cc: David Airlie <airlied@gmail.com>
> > Cc: Simona Vetter <simona@ffwll.ch>
> > Cc: dri-devel@lists.freedesktop.org
> > Cc: linux-kernel@vger.kernel.org
> > Cc: stable@vger.kernel.org
> > Fixes: b63d715b8090 ("drm/ttm/pool, drm/ttm/tt: Provide a helper to
> > shrink pages")
> > Suggested-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> > Assisted-by: Claude:claude-opus-4.6
> > Signed-off-by: Matthew Brost <matthew.brost@intel.com>
> > 
> > ---
> > 
> > A follow-up should attempt writeback to shmem at folio order as well,
> > but the API for doing so is unclear and may be incomplete.
> > 
> > This patch is related to the pending series [1] and significantly
> > reduces the likelihood of Xe entering a kswapd loop under
> > fragmentation.
> > The kswapd → shrinker → Xe shrinker → TTM backup path is still
> > exercised; however, with this change the backup path no longer
> > worsens
> > fragmentation, which previously amplified reclaim pressure and
> > reinforced the kswapd loop.
> > 
> > Nonetheless, the pathological case that [1] aims to address still
> > exists
> > and requires a proper solution. Even with this patch, a kswapd loop
> > due
> > to severe fragmentation can still be triggered, although it is now
> > substantially harder to reproduce.
> > 
> > [1] https://patchwork.freedesktop.org/series/165330/
> > ---
> >  drivers/gpu/drm/ttm/ttm_pool.c | 71 +++++++++++++++++++++++++++-----
> > --
> >  1 file changed, 57 insertions(+), 14 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > b/drivers/gpu/drm/ttm/ttm_pool.c
> > index 278bbe7a11ad..5ead0aba4bb7 100644
> > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > @@ -1036,12 +1036,11 @@ long ttm_pool_backup(struct ttm_pool *pool,
> > struct ttm_tt *tt,
> >  {
> >  	struct file *backup = tt->backup;
> >  	struct page *page;
> > -	unsigned long handle;
> >  	gfp_t alloc_gfp;
> >  	gfp_t gfp;
> >  	int ret = 0;
> >  	pgoff_t shrunken = 0;
> > -	pgoff_t i, num_pages;
> > +	pgoff_t i, num_pages, npages;
> >  
> >  	if (WARN_ON(ttm_tt_is_backed_up(tt)))
> >  		return -EINVAL;
> > @@ -1097,28 +1096,72 @@ long ttm_pool_backup(struct ttm_pool *pool,
> > struct ttm_tt *tt,
> >  	if (IS_ENABLED(CONFIG_FAULT_INJECTION) &&
> > should_fail(&backup_fault_inject, 1))
> >  		num_pages = DIV_ROUND_UP(num_pages, 2);
> >  
> > -	for (i = 0; i < num_pages; ++i) {
> > -		s64 shandle;
> > +	for (i = 0; i < num_pages; i += npages) {
> > +		unsigned int order;
> > +		pgoff_t j;
> >  
> > +		npages = 1;
> >  		page = tt->pages[i];
> >  		if (unlikely(!page))
> >  			continue;
> >  
> > -		ttm_pool_split_for_swap(pool, page);
> > +		/* Already-handled entry from a previous attempt. */
> > +		if (unlikely(ttm_backup_page_ptr_is_handle(page)))
> > +			continue;
> >  
> > -		shandle = ttm_backup_backup_page(backup, page,
> > flags->writeback, i,
> > -						 gfp, alloc_gfp);
> > -		if (shandle < 0) {
> > -			/* We allow partially shrunken tts */
> > -			ret = shandle;
> > +		order = ttm_pool_page_order(pool, page);
> > +		npages = 1UL << order;
> > +
> > +		/*
> > +		 * Back up the compound atomically at its native
> > order. If
> > +		 * fault injection truncated num_pages mid-compound,
> > skip
> > +		 * the partial tail rather than splitting.
> > +		 */
> > +		if (unlikely(i + npages > num_pages))
> >  			break;
> > +
> > +		for (j = 0; j < npages; ++j) {
> > +			unsigned long handle;
> > +			s64 shandle;
> > +
> > +			if (IS_ENABLED(CONFIG_FAULT_INJECTION) &&
> > +			    should_fail(&backup_fault_inject, 1))
> > +				shandle = -1;
> > +			else
> > +				shandle =
> > ttm_backup_backup_page(backup, page + j,
> > +								
> > flags->writeback,
> > +								 i +
> > j, gfp,
> > +								
> > alloc_gfp);
> > +
> > +			if (unlikely(shandle < 0)) {
> > +				pgoff_t k;
> > +
> > +				ret = shandle;
> > +				/*
> > +				 * Roll back: drop the handles we
> > just wrote
> > +				 * and restore the original page
> > pointers so
> > +				 * the compound remains intact and
> > may be
> > +				 * retried later.
> > +				 */
> > +				for (k = 0; k < j; ++k) {
> > +					handle =
> > ttm_backup_page_ptr_to_handle(tt->pages[i + k]);
> > +					ttm_backup_drop(backup,
> > handle);
> > +					tt->pages[i + k] = page + k;
> > +				}
> > +
> > +				goto out;
> > +			}
> > +			handle = shandle;
> > +			tt->pages[i + j] =
> > ttm_backup_handle_to_page_ptr(shandle);
> >  		}
> > -		handle = shandle;
> > -		tt->pages[i] =
> > ttm_backup_handle_to_page_ptr(handle);
> > -		__free_pages_gpu_account(page, 0, false);
> > -		shrunken++;
> > +
> > +		/* Compound fully backed up; free at native order.
> > */
> > +		page->private = 0;
> > +		__free_pages_gpu_account(page, order, false);
> > +		shrunken += npages;
> >  	}
> >  
> > +out:
> >  	return shrunken ? shrunken : ret;
> >  }
> >  

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

* Re: [PATCH] drm/ttm/pool: back up at native page order
  2026-05-04 14:30   ` Matthew Brost
@ 2026-05-04 15:19     ` Thomas Hellström
  2026-05-04 17:35       ` Matthew Brost
  0 siblings, 1 reply; 8+ messages in thread
From: Thomas Hellström @ 2026-05-04 15:19 UTC (permalink / raw)
  To: Matthew Brost
  Cc: intel-xe, dri-devel, Christian Koenig, Huang Rui, Matthew Auld,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, linux-kernel, stable

On Mon, 2026-05-04 at 07:30 -0700, Matthew Brost wrote:
> On Mon, May 04, 2026 at 10:35:23AM +0200, Thomas Hellström wrote:
> > Hi, Matt,
> > 
> > On Sun, 2026-05-03 at 21:26 -0700, Matthew Brost wrote:
> > > ttm_pool_split_for_swap() splits high-order pool pages into
> > > order-0
> > > pages during backup so each 4K page can be released to the system
> > > as
> > > soon as it has been written to shmem. While this minimizes the
> > > allocator's working set during reclaim, it actively fragments
> > > memory:
> > > every TTM-backed compound page that the shrinker touches is
> > > shattered
> > > into order-0 pages, even when the rest of the system would prefer
> > > that
> > > the high-order block stay intact. Under sustained kswapd pressure
> > > this
> > > is enough to drive other parts of MM into recovery loops from
> > > which
> > > they cannot easily escape, because the memory TTM just freed is
> > > no
> > > longer contiguous.
> > > 
> > > Stop splitting on the backup path and back up each compound
> > > atomically
> > > at its native order in ttm_pool_backup():
> > > 
> > >   - For each non-handle slot, read the order from the head page
> > > and
> > >     back up all 1<<order subpages to consecutive shmem indices,
> > >     writing the resulting handles into tt->pages[] as we go.
> > >   - On any per-subpage backup failure, drop the handles we just
> > > wrote
> > >     for this compound and restore the original page pointers, so
> > > the
> > >     compound is left fully intact and may be retried later.
> > > shrunken
> > >     is only incremented once the whole compound succeeds.
> > >   - On success, the compound is freed once at its native order.
> > > No
> > >     split_page(), no per-4K refcount juggling, no fragmentation
> > >     introduced from this path.
> > >   - Slots that already hold a backup handle from a previous
> > > partial
> > >     attempt are skipped. A compound that would extend past a
> > >     fault-injection-truncated num_pages is skipped rather than
> > > split.
> > > 
> > > The restore-side leftover-page branch in
> > > ttm_pool_restore_commit() is
> > > left as-is for now: that path can still split a previously-
> > > retained
> > > compound, but in practice it is unreachable under realistic
> > > workloads
> > > (per profiling we have not been able to trigger it), so it is not
> > > worth complicating the restore state machine to avoid the split
> > > there.
> > > If it ever becomes a problem in practice it can be addressed
> > > independently.
> > > 
> > > ttm_pool_split_for_swap() itself is retained for the restore
> > > path's
> > > sole remaining caller. The DMA-mapped pre-backup unmap loop, the
> > > purge path, ttm_pool_free_*, and ttm_pool_unmap_and_free()
> > > already
> > > operate at native order and are unchanged.
> > 
> > This split is intentional in that without it, we'd need to first
> > allocate 1 << order pages from the kernel's *reserves* in order to
> > later free 2 << order pages, making the shrinker much more likely
> > to
> > fail in true OOM situations. (I believe this was one of the reasons
> > the
> > initial shrinker attempts from AMD didn't work as expected).
> > 
> 
> So where exactly is allocation done—shmem_read_folio_gfp or
> shmem_writeout? I did notice and called out, in the commit message,
> that
> those interfaces are a bit confusing with respect to whether they
> actually work with higher-order allocations.

The interesting one is in shmem_read_folio_gfp(). This used to be 4K-
page only (but i915 had some tricks to make this allocate 2M folios).
My understanding (to be verified) is that this recently was changed to
allow 2M by default, and also to allow 2M folio writeout. Writeout
moves the folio from the page-cache to the swap-cache and then starts a
fs writeout operation. Pages are put back on the LRU and are freed when
writeout completes.

As I understand it, shmem_read_folio_gfp() will also potentially
allocate memory for the shmem object radix tree.

> 
> Also, FWIW, this patch by itself seems to greatly help with
> fragmentation, and I haven’t seen the OOM killer kick in. I’ve done
> things like running WebGL in a bunch of Chrome tabs, then running
> bonnie++ (which basically uses all memory), or running IGTs, which
> also
> use all available memory. Based on that, I’m leaning toward this
> patch
> alone working as designed.

Good to know. Perhaps it would feel safer if we completely restrict the
xe TTM order to 2M and below (if we haven't already).

> 
> > 
> > I believe the solution here is in the ttm_backup layer, We should
> > introduce a ttm_backup_backup_folio function and either insert the
> > page
> 
> I think something like ttm_backup_backup_folio() makes sense, again I
> called out in commit message.
> 
> > directly into the shmem object (zero-copy) or even directly into
> > the
> > swap cache. Then we should completely restrict xe page allocations
> > to
> > only allow THP and PAGE_SIZE (Possibly 64K pages, but they'd either
> > need a split or perhaps they are small enough to be backed-up using
> 
> Yes, I did raise something like with Christian too [1]. IMO the
> driver
> should be able dictate to TTM the orders it likely to allocate at.
> 
> [1]
> https://patchwork.freedesktop.org/patch/716362/?series=164338&rev=1
> 
> > one-go copy, similar to this patch, but in the backup layer). FWIW
> > at
> > the time the shrinker was put together, AFAIU SHMEM split large
> > pages
> > on swapping anyway, but since that appears to have changed, we need
> > to
> > catch up.
> > 
> > Inserting directly into the swap-cache WIP is here, rebased on a
> > recent
> > kernel (This is an old idea that has actually been out on RFC
> > once).
> > This needs a core mm bugfix (also in the branch), but I'm not sure
> > the
> > swap cache is the right place to do this, at least not if we don't
> > immediately schedule a write to disc, it looks like current users
> > don't
> > want to keep pages in swap-cache for very long (related to that
> > bug)
> > https://gitlab.freedesktop.org/thomash/xe-vibe/-/commits/thp_swapping2
> > 
> > Inserting directly into shmem (A fairly recent idea that is mostly
> > untested)
> > https://gitlab.freedesktop.org/thomash/xe-vibe/-/commits/insert_shmem?ref_type=heads
> > Since SHMEM schedules writeout immediately when pages are moved to
> > the
> > swap-cache, it's not as susceptible to the above bug, since swap-
> > cache
> > entries are not typically held for folios for which we haven't
> > scheduled writeout.
> > 
> 
> Let me take a look at these branches today.
> 
> > We should try to solicit feedback from mm people on these two
> > approaches.
> 
> +1, but I think we should stop here if this patch, as‑is, is OK to go
> in—ideally as a fix—since, based on my testing, it seems to help
> quite a
> bit and current upstream shrinker is badly broken.

Well I think the problem with testing shrinking behavior is that we
haven't had good test-cases, so we don't really know if this change
would break something that currently works. In the shmem documentation
there's even some wording about concerns that the shmem radix tree
allocations could accumulate and drain the kernel reserves. 

According to Google AI, the kernel reserves are around 2MiB times the
number of zones, controlled by vm.min_free_kbytes.

But I think if we would push this or something similar but then we
should 

*) Move the ttm_backup interface to be folio-based.
*) Restrict order to 2M
*) Craft a test-case that triggers a shmem_read_folio_gfp() error in
the backup path and verify that they do behave gracefully.

And then as follow-ups:

a) Investigate direct shmem insertion.
b) Address any remaining flaws from partially backed-up bos.
c) Cgroups integration, following up on airlied's work ensuring that
the evictee is charged for the shmem memory.


Thanks,
Thomas



> Matt
> 
> > 
> > /Thomas
> > 
> > > 
> > > Cc: Christian Koenig <christian.koenig@amd.com>
> > > Cc: Huang Rui <ray.huang@amd.com>
> > > Cc: Matthew Auld <matthew.auld@intel.com>
> > > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > > Cc: Maxime Ripard <mripard@kernel.org>
> > > Cc: Thomas Zimmermann <tzimmermann@suse.de>
> > > Cc: David Airlie <airlied@gmail.com>
> > > Cc: Simona Vetter <simona@ffwll.ch>
> > > Cc: dri-devel@lists.freedesktop.org
> > > Cc: linux-kernel@vger.kernel.org
> > > Cc: stable@vger.kernel.org
> > > Fixes: b63d715b8090 ("drm/ttm/pool, drm/ttm/tt: Provide a helper
> > > to
> > > shrink pages")
> > > Suggested-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> > > Assisted-by: Claude:claude-opus-4.6
> > > Signed-off-by: Matthew Brost <matthew.brost@intel.com>
> > > 
> > > ---
> > > 
> > > A follow-up should attempt writeback to shmem at folio order as
> > > well,
> > > but the API for doing so is unclear and may be incomplete.
> > > 
> > > This patch is related to the pending series [1] and significantly
> > > reduces the likelihood of Xe entering a kswapd loop under
> > > fragmentation.
> > > The kswapd → shrinker → Xe shrinker → TTM backup path is still
> > > exercised; however, with this change the backup path no longer
> > > worsens
> > > fragmentation, which previously amplified reclaim pressure and
> > > reinforced the kswapd loop.
> > > 
> > > Nonetheless, the pathological case that [1] aims to address still
> > > exists
> > > and requires a proper solution. Even with this patch, a kswapd
> > > loop
> > > due
> > > to severe fragmentation can still be triggered, although it is
> > > now
> > > substantially harder to reproduce.
> > > 
> > > [1] https://patchwork.freedesktop.org/series/165330/
> > > ---
> > >  drivers/gpu/drm/ttm/ttm_pool.c | 71 +++++++++++++++++++++++++++-
> > > ----
> > > --
> > >  1 file changed, 57 insertions(+), 14 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > > b/drivers/gpu/drm/ttm/ttm_pool.c
> > > index 278bbe7a11ad..5ead0aba4bb7 100644
> > > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > > @@ -1036,12 +1036,11 @@ long ttm_pool_backup(struct ttm_pool
> > > *pool,
> > > struct ttm_tt *tt,
> > >  {
> > >  	struct file *backup = tt->backup;
> > >  	struct page *page;
> > > -	unsigned long handle;
> > >  	gfp_t alloc_gfp;
> > >  	gfp_t gfp;
> > >  	int ret = 0;
> > >  	pgoff_t shrunken = 0;
> > > -	pgoff_t i, num_pages;
> > > +	pgoff_t i, num_pages, npages;
> > >  
> > >  	if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > >  		return -EINVAL;
> > > @@ -1097,28 +1096,72 @@ long ttm_pool_backup(struct ttm_pool
> > > *pool,
> > > struct ttm_tt *tt,
> > >  	if (IS_ENABLED(CONFIG_FAULT_INJECTION) &&
> > > should_fail(&backup_fault_inject, 1))
> > >  		num_pages = DIV_ROUND_UP(num_pages, 2);
> > >  
> > > -	for (i = 0; i < num_pages; ++i) {
> > > -		s64 shandle;
> > > +	for (i = 0; i < num_pages; i += npages) {
> > > +		unsigned int order;
> > > +		pgoff_t j;
> > >  
> > > +		npages = 1;
> > >  		page = tt->pages[i];
> > >  		if (unlikely(!page))
> > >  			continue;
> > >  
> > > -		ttm_pool_split_for_swap(pool, page);
> > > +		/* Already-handled entry from a previous
> > > attempt. */
> > > +		if
> > > (unlikely(ttm_backup_page_ptr_is_handle(page)))
> > > +			continue;
> > >  
> > > -		shandle = ttm_backup_backup_page(backup, page,
> > > flags->writeback, i,
> > > -						 gfp,
> > > alloc_gfp);
> > > -		if (shandle < 0) {
> > > -			/* We allow partially shrunken tts */
> > > -			ret = shandle;
> > > +		order = ttm_pool_page_order(pool, page);
> > > +		npages = 1UL << order;
> > > +
> > > +		/*
> > > +		 * Back up the compound atomically at its native
> > > order. If
> > > +		 * fault injection truncated num_pages mid-
> > > compound,
> > > skip
> > > +		 * the partial tail rather than splitting.
> > > +		 */
> > > +		if (unlikely(i + npages > num_pages))
> > >  			break;
> > > +
> > > +		for (j = 0; j < npages; ++j) {
> > > +			unsigned long handle;
> > > +			s64 shandle;
> > > +
> > > +			if (IS_ENABLED(CONFIG_FAULT_INJECTION)
> > > &&
> > > +			    should_fail(&backup_fault_inject,
> > > 1))
> > > +				shandle = -1;
> > > +			else
> > > +				shandle =
> > > ttm_backup_backup_page(backup, page + j,
> > > +								
> > > flags->writeback,
> > > +								
> > > i +
> > > j, gfp,
> > > +								
> > > alloc_gfp);
> > > +
> > > +			if (unlikely(shandle < 0)) {
> > > +				pgoff_t k;
> > > +
> > > +				ret = shandle;
> > > +				/*
> > > +				 * Roll back: drop the handles
> > > we
> > > just wrote
> > > +				 * and restore the original page
> > > pointers so
> > > +				 * the compound remains intact
> > > and
> > > may be
> > > +				 * retried later.
> > > +				 */
> > > +				for (k = 0; k < j; ++k) {
> > > +					handle =
> > > ttm_backup_page_ptr_to_handle(tt->pages[i + k]);
> > > +					ttm_backup_drop(backup,
> > > handle);
> > > +					tt->pages[i + k] = page
> > > + k;
> > > +				}
> > > +
> > > +				goto out;
> > > +			}
> > > +			handle = shandle;
> > > +			tt->pages[i + j] =
> > > ttm_backup_handle_to_page_ptr(shandle);
> > >  		}
> > > -		handle = shandle;
> > > -		tt->pages[i] =
> > > ttm_backup_handle_to_page_ptr(handle);
> > > -		__free_pages_gpu_account(page, 0, false);
> > > -		shrunken++;
> > > +
> > > +		/* Compound fully backed up; free at native
> > > order.
> > > */
> > > +		page->private = 0;
> > > +		__free_pages_gpu_account(page, order, false);
> > > +		shrunken += npages;
> > >  	}
> > >  
> > > +out:
> > >  	return shrunken ? shrunken : ret;
> > >  }
> > >  

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

* Re: [PATCH] drm/ttm/pool: back up at native page order
  2026-05-04 15:19     ` Thomas Hellström
@ 2026-05-04 17:35       ` Matthew Brost
  0 siblings, 0 replies; 8+ messages in thread
From: Matthew Brost @ 2026-05-04 17:35 UTC (permalink / raw)
  To: Thomas Hellström
  Cc: intel-xe, dri-devel, Christian Koenig, Huang Rui, Matthew Auld,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, linux-kernel, stable

On Mon, May 04, 2026 at 05:19:42PM +0200, Thomas Hellström wrote:
> On Mon, 2026-05-04 at 07:30 -0700, Matthew Brost wrote:
> > On Mon, May 04, 2026 at 10:35:23AM +0200, Thomas Hellström wrote:
> > > Hi, Matt,
> > > 
> > > On Sun, 2026-05-03 at 21:26 -0700, Matthew Brost wrote:
> > > > ttm_pool_split_for_swap() splits high-order pool pages into
> > > > order-0
> > > > pages during backup so each 4K page can be released to the system
> > > > as
> > > > soon as it has been written to shmem. While this minimizes the
> > > > allocator's working set during reclaim, it actively fragments
> > > > memory:
> > > > every TTM-backed compound page that the shrinker touches is
> > > > shattered
> > > > into order-0 pages, even when the rest of the system would prefer
> > > > that
> > > > the high-order block stay intact. Under sustained kswapd pressure
> > > > this
> > > > is enough to drive other parts of MM into recovery loops from
> > > > which
> > > > they cannot easily escape, because the memory TTM just freed is
> > > > no
> > > > longer contiguous.
> > > > 
> > > > Stop splitting on the backup path and back up each compound
> > > > atomically
> > > > at its native order in ttm_pool_backup():
> > > > 
> > > >   - For each non-handle slot, read the order from the head page
> > > > and
> > > >     back up all 1<<order subpages to consecutive shmem indices,
> > > >     writing the resulting handles into tt->pages[] as we go.
> > > >   - On any per-subpage backup failure, drop the handles we just
> > > > wrote
> > > >     for this compound and restore the original page pointers, so
> > > > the
> > > >     compound is left fully intact and may be retried later.
> > > > shrunken
> > > >     is only incremented once the whole compound succeeds.
> > > >   - On success, the compound is freed once at its native order.
> > > > No
> > > >     split_page(), no per-4K refcount juggling, no fragmentation
> > > >     introduced from this path.
> > > >   - Slots that already hold a backup handle from a previous
> > > > partial
> > > >     attempt are skipped. A compound that would extend past a
> > > >     fault-injection-truncated num_pages is skipped rather than
> > > > split.
> > > > 
> > > > The restore-side leftover-page branch in
> > > > ttm_pool_restore_commit() is
> > > > left as-is for now: that path can still split a previously-
> > > > retained
> > > > compound, but in practice it is unreachable under realistic
> > > > workloads
> > > > (per profiling we have not been able to trigger it), so it is not
> > > > worth complicating the restore state machine to avoid the split
> > > > there.
> > > > If it ever becomes a problem in practice it can be addressed
> > > > independently.
> > > > 
> > > > ttm_pool_split_for_swap() itself is retained for the restore
> > > > path's
> > > > sole remaining caller. The DMA-mapped pre-backup unmap loop, the
> > > > purge path, ttm_pool_free_*, and ttm_pool_unmap_and_free()
> > > > already
> > > > operate at native order and are unchanged.
> > > 
> > > This split is intentional in that without it, we'd need to first
> > > allocate 1 << order pages from the kernel's *reserves* in order to
> > > later free 2 << order pages, making the shrinker much more likely
> > > to
> > > fail in true OOM situations. (I believe this was one of the reasons
> > > the
> > > initial shrinker attempts from AMD didn't work as expected).
> > > 
> > 
> > So where exactly is allocation done—shmem_read_folio_gfp or
> > shmem_writeout? I did notice and called out, in the commit message,
> > that
> > those interfaces are a bit confusing with respect to whether they
> > actually work with higher-order allocations.
> 
> The interesting one is in shmem_read_folio_gfp(). This used to be 4K-
> page only (but i915 had some tricks to make this allocate 2M folios).


It looks like to_folio() in ttm_backup_backup_page() (the output from
shmem_read_folio_gfp()) is always order-0—at least with how I have the
kernel configured.

I see what you’re saying here: we need to allocate however many order-0
pages are required in shmem_read_folio_gfp() before we call
__free_pages_gpu_account() on the higher-order folio we’re backing up.
In the worst case (again, with my kernel configuration on x86), this is
order 10 (4MB). I think certain Kconfig options can make this larger,
and on platforms like ARM these higher orders can represent huge amounts
of memory.

> My understanding (to be verified) is that this recently was changed to
> allow 2M by default, and also to allow 2M folio writeout. Writeout
> moves the folio from the page-cache to the swap-cache and then starts a
> fs writeout operation. Pages are put back on the LRU and are freed when
> writeout completes.
> 
> As I understand it, shmem_read_folio_gfp() will also potentially
> allocate memory for the shmem object radix tree.
> 
> > 
> > Also, FWIW, this patch by itself seems to greatly help with
> > fragmentation, and I haven’t seen the OOM killer kick in. I’ve done
> > things like running WebGL in a bunch of Chrome tabs, then running
> > bonnie++ (which basically uses all memory), or running IGTs, which
> > also
> > use all available memory. Based on that, I’m leaning toward this
> > patch
> > alone working as designed.
> 
> Good to know. Perhaps it would feel safer if we completely restrict the
> xe TTM order to 2M and below (if we haven't already).
> 

We don’t do this today, but that seems like a reasonable idea, although
the default order-10 on x86 isn’t really all that bad either.

What if ttm_backup_backup_page() fails while we’re trying to back up a
higher-order page - We could then split the page, free the pages up to the
current point of iteration, and then retry to make forward progress. If
I recall correctly, if it fails again, the shrinker gracefully handles
partial backups.

> > 
> > > 
> > > I believe the solution here is in the ttm_backup layer, We should
> > > introduce a ttm_backup_backup_folio function and either insert the
> > > page
> > 
> > I think something like ttm_backup_backup_folio() makes sense, again I
> > called out in commit message.
> > 
> > > directly into the shmem object (zero-copy) or even directly into
> > > the
> > > swap cache. Then we should completely restrict xe page allocations
> > > to
> > > only allow THP and PAGE_SIZE (Possibly 64K pages, but they'd either
> > > need a split or perhaps they are small enough to be backed-up using
> > 
> > Yes, I did raise something like with Christian too [1]. IMO the
> > driver
> > should be able dictate to TTM the orders it likely to allocate at.
> > 
> > [1]
> > https://patchwork.freedesktop.org/patch/716362/?series=164338&rev=1
> > 
> > > one-go copy, similar to this patch, but in the backup layer). FWIW
> > > at
> > > the time the shrinker was put together, AFAIU SHMEM split large
> > > pages
> > > on swapping anyway, but since that appears to have changed, we need
> > > to
> > > catch up.
> > > 
> > > Inserting directly into the swap-cache WIP is here, rebased on a
> > > recent
> > > kernel (This is an old idea that has actually been out on RFC
> > > once).
> > > This needs a core mm bugfix (also in the branch), but I'm not sure
> > > the
> > > swap cache is the right place to do this, at least not if we don't
> > > immediately schedule a write to disc, it looks like current users
> > > don't
> > > want to keep pages in swap-cache for very long (related to that
> > > bug)
> > > https://gitlab.freedesktop.org/thomash/xe-vibe/-/commits/thp_swapping2
> > > 
> > > Inserting directly into shmem (A fairly recent idea that is mostly
> > > untested)
> > > https://gitlab.freedesktop.org/thomash/xe-vibe/-/commits/insert_shmem?ref_type=heads
> > > Since SHMEM schedules writeout immediately when pages are moved to
> > > the
> > > swap-cache, it's not as susceptible to the above bug, since swap-
> > > cache
> > > entries are not typically held for folios for which we haven't
> > > scheduled writeout.
> > > 
> > 
> > Let me take a look at these branches today.
> > 
> > > We should try to solicit feedback from mm people on these two
> > > approaches.
> > 
> > +1, but I think we should stop here if this patch, as‑is, is OK to go
> > in—ideally as a fix—since, based on my testing, it seems to help
> > quite a
> > bit and current upstream shrinker is badly broken.
> 
> Well I think the problem with testing shrinking behavior is that we
> haven't had good test-cases, so we don't really know if this change

I agree that we don’t have great test cases. We can try to get some
better IGTs, but I really think we need some end‑to‑end testing like
what I’ve been manually doing (e.g., opening a bunch of WebGL tabs on a
system without a lot of memory to trigger shrinking, and/or running
memory‑heavy workloads on the CLI at the same time—compiling the kernel
with a large number of threads is likely a decent option).

> would break something that currently works. In the shmem documentation
> there's even some wording about concerns that the shmem radix tree
> allocations could accumulate and drain the kernel reserves. 
> 
> According to Google AI, the kernel reserves are around 2MiB times the
> number of zones, controlled by vm.min_free_kbytes.
> 
> But I think if we would push this or something similar but then we
> should 
> 
> *) Move the ttm_backup interface to be folio-based.
> *) Restrict order to 2M

I can 'Restrict order to 2M' in this series if you think it is a good
idea.

> *) Craft a test-case that triggers a shmem_read_folio_gfp() error in
> the backup path and verify that they do behave gracefully.
> 

I think, as a stop-gap and backportable fix, this patch plus a fallback
to splitting with error injection (I have error injection in this series
but I have ran and injected errors) is a reasonable option. Longer term,
yes, moving ttm_backup to be folio-based makes sense.

> And then as follow-ups:
> 
> a) Investigate direct shmem insertion.
> b) Address any remaining flaws from partially backed-up bos.
> c) Cgroups integration, following up on airlied's work ensuring that
> the evictee is charged for the shmem memory.
> 

And then also +1 on exploring these options.

Matt

> 
> Thanks,
> Thomas
> 
> 
> 
> > Matt
> > 
> > > 
> > > /Thomas
> > > 
> > > > 
> > > > Cc: Christian Koenig <christian.koenig@amd.com>
> > > > Cc: Huang Rui <ray.huang@amd.com>
> > > > Cc: Matthew Auld <matthew.auld@intel.com>
> > > > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > > > Cc: Maxime Ripard <mripard@kernel.org>
> > > > Cc: Thomas Zimmermann <tzimmermann@suse.de>
> > > > Cc: David Airlie <airlied@gmail.com>
> > > > Cc: Simona Vetter <simona@ffwll.ch>
> > > > Cc: dri-devel@lists.freedesktop.org
> > > > Cc: linux-kernel@vger.kernel.org
> > > > Cc: stable@vger.kernel.org
> > > > Fixes: b63d715b8090 ("drm/ttm/pool, drm/ttm/tt: Provide a helper
> > > > to
> > > > shrink pages")
> > > > Suggested-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> > > > Assisted-by: Claude:claude-opus-4.6
> > > > Signed-off-by: Matthew Brost <matthew.brost@intel.com>
> > > > 
> > > > ---
> > > > 
> > > > A follow-up should attempt writeback to shmem at folio order as
> > > > well,
> > > > but the API for doing so is unclear and may be incomplete.
> > > > 
> > > > This patch is related to the pending series [1] and significantly
> > > > reduces the likelihood of Xe entering a kswapd loop under
> > > > fragmentation.
> > > > The kswapd → shrinker → Xe shrinker → TTM backup path is still
> > > > exercised; however, with this change the backup path no longer
> > > > worsens
> > > > fragmentation, which previously amplified reclaim pressure and
> > > > reinforced the kswapd loop.
> > > > 
> > > > Nonetheless, the pathological case that [1] aims to address still
> > > > exists
> > > > and requires a proper solution. Even with this patch, a kswapd
> > > > loop
> > > > due
> > > > to severe fragmentation can still be triggered, although it is
> > > > now
> > > > substantially harder to reproduce.
> > > > 
> > > > [1] https://patchwork.freedesktop.org/series/165330/
> > > > ---
> > > >  drivers/gpu/drm/ttm/ttm_pool.c | 71 +++++++++++++++++++++++++++-
> > > > ----
> > > > --
> > > >  1 file changed, 57 insertions(+), 14 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > > > b/drivers/gpu/drm/ttm/ttm_pool.c
> > > > index 278bbe7a11ad..5ead0aba4bb7 100644
> > > > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > > > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > > > @@ -1036,12 +1036,11 @@ long ttm_pool_backup(struct ttm_pool
> > > > *pool,
> > > > struct ttm_tt *tt,
> > > >  {
> > > >  	struct file *backup = tt->backup;
> > > >  	struct page *page;
> > > > -	unsigned long handle;
> > > >  	gfp_t alloc_gfp;
> > > >  	gfp_t gfp;
> > > >  	int ret = 0;
> > > >  	pgoff_t shrunken = 0;
> > > > -	pgoff_t i, num_pages;
> > > > +	pgoff_t i, num_pages, npages;
> > > >  
> > > >  	if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > >  		return -EINVAL;
> > > > @@ -1097,28 +1096,72 @@ long ttm_pool_backup(struct ttm_pool
> > > > *pool,
> > > > struct ttm_tt *tt,
> > > >  	if (IS_ENABLED(CONFIG_FAULT_INJECTION) &&
> > > > should_fail(&backup_fault_inject, 1))
> > > >  		num_pages = DIV_ROUND_UP(num_pages, 2);
> > > >  
> > > > -	for (i = 0; i < num_pages; ++i) {
> > > > -		s64 shandle;
> > > > +	for (i = 0; i < num_pages; i += npages) {
> > > > +		unsigned int order;
> > > > +		pgoff_t j;
> > > >  
> > > > +		npages = 1;
> > > >  		page = tt->pages[i];
> > > >  		if (unlikely(!page))
> > > >  			continue;
> > > >  
> > > > -		ttm_pool_split_for_swap(pool, page);
> > > > +		/* Already-handled entry from a previous
> > > > attempt. */
> > > > +		if
> > > > (unlikely(ttm_backup_page_ptr_is_handle(page)))
> > > > +			continue;
> > > >  
> > > > -		shandle = ttm_backup_backup_page(backup, page,
> > > > flags->writeback, i,
> > > > -						 gfp,
> > > > alloc_gfp);
> > > > -		if (shandle < 0) {
> > > > -			/* We allow partially shrunken tts */
> > > > -			ret = shandle;
> > > > +		order = ttm_pool_page_order(pool, page);
> > > > +		npages = 1UL << order;
> > > > +
> > > > +		/*
> > > > +		 * Back up the compound atomically at its native
> > > > order. If
> > > > +		 * fault injection truncated num_pages mid-
> > > > compound,
> > > > skip
> > > > +		 * the partial tail rather than splitting.
> > > > +		 */
> > > > +		if (unlikely(i + npages > num_pages))
> > > >  			break;
> > > > +
> > > > +		for (j = 0; j < npages; ++j) {
> > > > +			unsigned long handle;
> > > > +			s64 shandle;
> > > > +
> > > > +			if (IS_ENABLED(CONFIG_FAULT_INJECTION)
> > > > &&
> > > > +			    should_fail(&backup_fault_inject,
> > > > 1))
> > > > +				shandle = -1;
> > > > +			else
> > > > +				shandle =
> > > > ttm_backup_backup_page(backup, page + j,
> > > > +								
> > > > flags->writeback,
> > > > +								
> > > > i +
> > > > j, gfp,
> > > > +								
> > > > alloc_gfp);
> > > > +
> > > > +			if (unlikely(shandle < 0)) {
> > > > +				pgoff_t k;
> > > > +
> > > > +				ret = shandle;
> > > > +				/*
> > > > +				 * Roll back: drop the handles
> > > > we
> > > > just wrote
> > > > +				 * and restore the original page
> > > > pointers so
> > > > +				 * the compound remains intact
> > > > and
> > > > may be
> > > > +				 * retried later.
> > > > +				 */
> > > > +				for (k = 0; k < j; ++k) {
> > > > +					handle =
> > > > ttm_backup_page_ptr_to_handle(tt->pages[i + k]);
> > > > +					ttm_backup_drop(backup,
> > > > handle);
> > > > +					tt->pages[i + k] = page
> > > > + k;
> > > > +				}
> > > > +
> > > > +				goto out;
> > > > +			}
> > > > +			handle = shandle;
> > > > +			tt->pages[i + j] =
> > > > ttm_backup_handle_to_page_ptr(shandle);
> > > >  		}
> > > > -		handle = shandle;
> > > > -		tt->pages[i] =
> > > > ttm_backup_handle_to_page_ptr(handle);
> > > > -		__free_pages_gpu_account(page, 0, false);
> > > > -		shrunken++;
> > > > +
> > > > +		/* Compound fully backed up; free at native
> > > > order.
> > > > */
> > > > +		page->private = 0;
> > > > +		__free_pages_gpu_account(page, order, false);
> > > > +		shrunken += npages;
> > > >  	}
> > > >  
> > > > +out:
> > > >  	return shrunken ? shrunken : ret;
> > > >  }
> > > >  

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

end of thread, other threads:[~2026-05-04 17:36 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-04  4:26 [PATCH] drm/ttm/pool: back up at native page order Matthew Brost
2026-05-04  4:33 ` ✓ CI.KUnit: success for " Patchwork
2026-05-04  5:28 ` ✓ Xe.CI.BAT: " Patchwork
2026-05-04  6:33 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-05-04  8:35 ` [PATCH] " Thomas Hellström
2026-05-04 14:30   ` Matthew Brost
2026-05-04 15:19     ` Thomas Hellström
2026-05-04 17:35       ` Matthew Brost

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