Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation
@ 2026-05-06  3:32 Matthew Brost
  2026-05-06  3:32 ` [PATCH v5 1/5] mm: Wire up order in shrink_control Matthew Brost
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Matthew Brost @ 2026-05-06  3:32 UTC (permalink / raw)
  To: intel-xe, dri-devel
  Cc: Dave Chinner, Qi Zheng, Roman Gushchin, Johannes Weiner,
	Shakeel Butt, Kairui Song, Barry Song, Axel Rasmussen,
	Yuanchu Xie, Wei Xu, Tvrtko Ursulin, Thomas Hellström,
	Carlos Santa, Christian Koenig, Huang Rui, Matthew Auld,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
	Simona Vetter, Daniel Colascione, Andrew Morton,
	David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	linux-mm, linux-kernel

Alternative approach to [1].

TTM allocations at higher orders can drive Xe into a pathological
reclaim loop when memory is fragmented:

kswapd → shrinker → eviction → rebind (exec ioctl) → repeat

In this state, reclaim is triggered despite substantial free memory,
but fails to produce contiguous higher-order pages. The Xe shrinker then
evicts active buffer objects, increasing faulting and rebind activity
and further feeding the loop. The result is high CPU overhead and poor
GPU forward progress.

This issue was first reported in [1] and independently observed
internally and by Google.

A simple reproducer is:

- Boot an iGPU system with mem=8G
- Launch 10 Chrome tabs running the WebGL aquarium demo
- Configure each tab with ~5k fish

Under this workload, ftrace shows a continuous loop of:

xe_shrinker_scan (kswapd)
xe_vma_rebind_exec

Performance degrades significantly, with each tab dropping to ~2 FPS on
PTL (Ubuntu 24.04).

At the same time, /proc/buddyinfo shows substantial free memory but no
higher-order availability. For example, the Normal zone:

Count: 4063 4595 3455 3400 3139 2762 2293 1655 643 0 0

This corresponds to ~2.8GB free memory, but no order-9 (2MB) blocks,
indicating severe fragmentation.

This series addresses the issue in three layers:

MM: Introduce an opportunistic_compaction hint in shrink_control.
kswapd folds the gfp flags of its wakers into a per-pgdat tri-state
(see enum kswapd_opportunistic_compaction_type) and forwards it to
shrinkers. The hint is set when every waker for a kswapd run is a
failable high-order allocation (__GFP_NORETRY or __GFP_RETRY_MAYFAIL,
without __GFP_NOFAIL) — i.e. callers that would rather see the
allocation fail than have working sets torn down to satisfy it. Any
order-0 or non-failable waker clears the hint for that run, so normal
memory pressure is unaffected.

TTM: Restrict direct reclaim to beneficial_order. Larger allocations
use __GFP_NORETRY so they fail fast (and feed the opportunistic hint
above) rather than synchronously triggering reclaim that is unlikely
to produce a contiguous higher-order block.

Xe: Consume shrink_control::opportunistic_compaction in the Xe
shrinker. When the hint is set for a high-order pass, the shrinker
skips advertising and performing TTM backup work — which operates at
native page order and would not help compaction — and avoids tearing
down active GPU working sets. Order-0 and non-opportunistic reclaim
behaviour is unchanged, so the shrinker still participates fully
under genuine memory pressure.

With these changes, the reclaim/eviction loop is eliminated. The same
workload improves to ~10 FPS per tab (Ubuntu 24.04) or ~15 FPS per tab
(Ubuntu 24.10), and kswapd activity subsides.

Buddyinfo after applying this series shows restored higher-order
availability:

Count: 8526 7067 3092 1959 1292 660 194 28 20 13 1

Matt

v2:
 - Layer with core MM / TTM helpers (Thomas)
v4:
 - Fix build (CI)
v5:
 - Use shrinker based heurstics (Dave Chinner, Thomas's GFP idea)
 - Rename lazy_compaction → opportunistic_compaction

[1] https://patchwork.freedesktop.org/series/165330/#rev3
[2] https://patchwork.freedesktop.org/patch/716404/?series=164353&rev=1

Cc: Dave Chinner <david@fromorbit.com>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Kairui Song <kasong@tencent.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Wei Xu <weixugc@google.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Carlos Santa <carlos.santa@intel.com>
Cc: Christian Koenig <christian.koenig@amd.com>
Cc: Huang Rui <ray.huang@amd.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Matthew Brost <matthew.brost@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: Daniel Colascione <dancol@dancol.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org

Matthew Brost (5):
  mm: Wire up order in shrink_control
  mm: Introduce opportunistic_compaction concept to vmscan and shrinkers
  drm/ttm: Issue direct reclaim at beneficial_order
  drm/xe: Set TTM device beneficial_order to 9 (2M)
  drm/xe: Make use of shrink_control::opportunistic_compaction hint

 drivers/gpu/drm/ttm/ttm_pool.c   |  4 +-
 drivers/gpu/drm/xe/xe_device.c   |  3 +-
 drivers/gpu/drm/xe/xe_shrinker.c | 20 +++++++--
 include/linux/mmzone.h           | 40 +++++++++++++++++
 include/linux/shrinker.h         | 23 ++++++++++
 mm/internal.h                    |  5 ++-
 mm/shrinker.c                    | 23 +++++++---
 mm/vmscan.c                      | 73 +++++++++++++++++++++++++++++---
 8 files changed, 170 insertions(+), 21 deletions(-)

-- 
2.34.1


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

* [PATCH v5 1/5] mm: Wire up order in shrink_control
  2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
@ 2026-05-06  3:32 ` Matthew Brost
  2026-05-06  3:32 ` [PATCH v5 2/5] mm: Introduce opportunistic_compaction concept to vmscan and shrinkers Matthew Brost
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Matthew Brost @ 2026-05-06  3:32 UTC (permalink / raw)
  To: intel-xe, dri-devel
  Cc: Andrew Morton, Dave Chinner, Qi Zheng, Roman Gushchin,
	Muchun Song, David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Johannes Weiner, Shakeel Butt, Kairui Song, Barry Song,
	Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-mm, linux-kernel,
	Thomas Hellström

Pass the allocation order through shrink_control so shrinkers have
visibility into the order that triggered reclaim.

This allows shrinkers to implement better heuristics, such as detecting
high-order allocation pressure or fragmentation and avoiding eviction
of working sets when reclaim is invoked from kswapd.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: David Hildenbrand <david@kernel.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Kairui Song <kasong@tencent.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Wei Xu <weixugc@google.com>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
Suggested-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
---
 include/linux/shrinker.h |  3 +++
 mm/internal.h            |  4 ++--
 mm/shrinker.c            | 13 ++++++++-----
 mm/vmscan.c              |  7 ++++---
 4 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h
index 1a00be90d93a..7072f693b9be 100644
--- a/include/linux/shrinker.h
+++ b/include/linux/shrinker.h
@@ -37,6 +37,9 @@ struct shrink_control {
 	/* current node being shrunk (for NUMA aware shrinkers) */
 	int nid;
 
+	/* Allocation order we are currently trying to fulfil. */
+	s8 order;
+
 	/*
 	 * How many objects scan_objects should scan and try to reclaim.
 	 * This is reset before every call, so it is safe for callees
diff --git a/mm/internal.h b/mm/internal.h
index 5a2ddcf68e0b..ff8671dccf7b 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -1759,8 +1759,8 @@ void __meminit __init_single_page(struct page *page, unsigned long pfn,
 void __meminit __init_page_from_nid(unsigned long pfn, int nid);
 
 /* shrinker related functions */
-unsigned long shrink_slab(gfp_t gfp_mask, int nid, struct mem_cgroup *memcg,
-			  int priority);
+unsigned long shrink_slab(gfp_t gfp_mask, int nid, s8 order,
+			  struct mem_cgroup *memcg, int priority);
 
 int shmem_add_to_page_cache(struct folio *folio,
 			    struct address_space *mapping,
diff --git a/mm/shrinker.c b/mm/shrinker.c
index 76b3f750cf65..c83f3b3daa08 100644
--- a/mm/shrinker.c
+++ b/mm/shrinker.c
@@ -466,7 +466,7 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl,
 }
 
 #ifdef CONFIG_MEMCG
-static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid,
+static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
 			struct mem_cgroup *memcg, int priority)
 {
 	struct shrinker_info *info;
@@ -528,6 +528,7 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid,
 			struct shrink_control sc = {
 				.gfp_mask = gfp_mask,
 				.nid = nid,
+				.order = order,
 				.memcg = memcg,
 			};
 			struct shrinker *shrinker;
@@ -587,7 +588,7 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid,
 	return freed;
 }
 #else /* !CONFIG_MEMCG */
-static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid,
+static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
 			struct mem_cgroup *memcg, int priority)
 {
 	return 0;
@@ -598,6 +599,7 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid,
  * shrink_slab - shrink slab caches
  * @gfp_mask: allocation context
  * @nid: node whose slab caches to target
+ * @order: order of allocation
  * @memcg: memory cgroup whose slab caches to target
  * @priority: the reclaim priority
  *
@@ -614,8 +616,8 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid,
  *
  * Returns the number of reclaimed slab objects.
  */
-unsigned long shrink_slab(gfp_t gfp_mask, int nid, struct mem_cgroup *memcg,
-			  int priority)
+unsigned long shrink_slab(gfp_t gfp_mask, int nid, s8 order,
+			  struct mem_cgroup *memcg, int priority)
 {
 	unsigned long ret, freed = 0;
 	struct shrinker *shrinker;
@@ -628,7 +630,7 @@ unsigned long shrink_slab(gfp_t gfp_mask, int nid, struct mem_cgroup *memcg,
 	 * oom.
 	 */
 	if (!mem_cgroup_disabled() && !mem_cgroup_is_root(memcg))
-		return shrink_slab_memcg(gfp_mask, nid, memcg, priority);
+		return shrink_slab_memcg(gfp_mask, nid, order, memcg, priority);
 
 	/*
 	 * lockless algorithm of global shrink.
@@ -656,6 +658,7 @@ unsigned long shrink_slab(gfp_t gfp_mask, int nid, struct mem_cgroup *memcg,
 		struct shrink_control sc = {
 			.gfp_mask = gfp_mask,
 			.nid = nid,
+			.order = order,
 			.memcg = memcg,
 		};
 
diff --git a/mm/vmscan.c b/mm/vmscan.c
index bd1b1aa12581..a54d14ecad25 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -412,7 +412,7 @@ static unsigned long drop_slab_node(int nid)
 
 	memcg = mem_cgroup_iter(NULL, NULL, NULL);
 	do {
-		freed += shrink_slab(GFP_KERNEL, nid, memcg, 0);
+		freed += shrink_slab(GFP_KERNEL, nid, 0, memcg, 0);
 	} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)) != NULL);
 
 	return freed;
@@ -5068,7 +5068,8 @@ static int shrink_one(struct lruvec *lruvec, struct scan_control *sc)
 
 	success = try_to_shrink_lruvec(lruvec, sc);
 
-	shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, sc->priority);
+	shrink_slab(sc->gfp_mask, pgdat->node_id, sc->order, memcg,
+		    sc->priority);
 
 	if (!sc->proactive)
 		vmpressure(sc->gfp_mask, memcg, false, sc->nr_scanned - scanned,
@@ -6170,7 +6171,7 @@ static void shrink_node_memcgs(pg_data_t *pgdat, struct scan_control *sc)
 
 		shrink_lruvec(lruvec, sc);
 
-		shrink_slab(sc->gfp_mask, pgdat->node_id, memcg,
+		shrink_slab(sc->gfp_mask, pgdat->node_id, sc->order, memcg,
 			    sc->priority);
 
 		/* Record the group's reclaim efficiency */
-- 
2.34.1


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

* [PATCH v5 2/5] mm: Introduce opportunistic_compaction concept to vmscan and shrinkers
  2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
  2026-05-06  3:32 ` [PATCH v5 1/5] mm: Wire up order in shrink_control Matthew Brost
@ 2026-05-06  3:32 ` Matthew Brost
  2026-05-06  3:32 ` [PATCH v5 3/5] drm/ttm: Issue direct reclaim at beneficial_order Matthew Brost
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Matthew Brost @ 2026-05-06  3:32 UTC (permalink / raw)
  To: intel-xe, dri-devel
  Cc: Andrew Morton, Dave Chinner, Qi Zheng, Roman Gushchin,
	Muchun Song, David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Johannes Weiner, Shakeel Butt, Kairui Song, Barry Song,
	Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-mm, linux-kernel

High-order allocations using __GFP_NORETRY or __GFP_RETRY_MAYFAIL
are often opportunistic attempts to satisfy fragmentation-sensitive
allocations rather than indications of severe memory pressure. In these
cases, kswapd reclaim may invoke shrinkers that aggressively destroy
working sets even though reclaim is unlikely to materially improve the
allocation outcome.

Some shrinkers manage expensive backing or migration operations where
reclaim can result in substantial working set disruption despite the
system having sufficient free memory overall. This is particularly
visible in fragmentation-heavy workloads where reclaim repeatedly tears
down active state while kswapd attempts to satisfy higher-order
allocations.

Introduce an opportunistic_compaction hint in shrink_control that allows
kswapd to communicate when reclaim originates from a high-order
allocation context that may be fragmentation driven rather than true
memory pressure. Shrinkers may use this hint to avoid destructive
working set reclaim while still participating normally during order-0
or stronger reclaim conditions.

The hint is propagated through shrink_slab() and derived from
high-order kswapd wakeups associated with non-failing allocation
contexts.

No functional changes are introduced for existing shrinkers.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: David Hildenbrand <david@kernel.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Kairui Song <kasong@tencent.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Wei Xu <weixugc@google.com>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
---
 include/linux/mmzone.h   | 40 +++++++++++++++++++++++
 include/linux/shrinker.h | 20 ++++++++++++
 mm/internal.h            |  3 +-
 mm/shrinker.c            | 14 +++++---
 mm/vmscan.c              | 70 +++++++++++++++++++++++++++++++++++++---
 5 files changed, 137 insertions(+), 10 deletions(-)

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 9adb2ad21da5..1554e8058e4b 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -1461,6 +1461,39 @@ struct memory_failure_stats {
 };
 #endif
 
+/*
+ * Per-pgdat state machine for the kswapd "opportunistic compaction" hint.
+ *
+ * wakeup_kswapd() collapses the gfp flags of all wakers that arrive between
+ * two kswapd runs into a single tri-state, which kswapd then forwards to the
+ * shrinkers via shrink_control::opportunistic_compaction:
+ *
+ *   KSWAPD_UNSET_OPPORTUNISTIC_COMPACTION
+ *	Initial state after kswapd consumes the previous value. No waker has
+ *	been observed yet for the upcoming run.
+ *
+ *   KSWAPD_NO_OPPORTUNISTIC_COMPACTION
+ *	At least one waker is an order-0 allocation, or a high-order
+ *	allocation that cannot tolerate failure (i.e., not eligible for
+ *	opportunistic behaviour). Shrinkers must do their normal best-effort
+ *	work; the hint is cleared.
+ *
+ *   KSWAPD_OPPORTUNISTIC_COMPACTION
+ *	All wakers seen so far are high-order allocations that may fail
+ *	(__GFP_NORETRY or __GFP_RETRY_MAYFAIL, without __GFP_NOFAIL). Shrinkers
+ *	may skip work that is unlikely to produce a contiguous high-order
+ *	block (e.g., evicting working-set pages).
+ *
+ * The state is sticky in the "NO" direction within a single kswapd run: once
+ * any non-eligible waker is observed, subsequent eligible wakers cannot
+ * upgrade it back to KSWAPD_OPPORTUNISTIC_COMPACTION.
+ */
+enum kswapd_opportunistic_compaction_type {
+	KSWAPD_UNSET_OPPORTUNISTIC_COMPACTION = 0,
+	KSWAPD_NO_OPPORTUNISTIC_COMPACTION,
+	KSWAPD_OPPORTUNISTIC_COMPACTION,
+};
+
 /*
  * On NUMA machines, each NUMA node would have a pg_data_t to describe
  * it's memory layout. On UMA machines there is a single pglist_data which
@@ -1525,6 +1558,13 @@ typedef struct pglist_data {
 #endif
 	struct task_struct *kswapd;	/* Protected by kswapd_lock */
 	int kswapd_order;
+	/*
+	 * Aggregated opportunistic-compaction hint for the next kswapd run.
+	 * Updated by wakeup_kswapd() based on the gfp flags / order of each
+	 * waker, and consumed (and reset) by kswapd before balance_pgdat().
+	 * See enum kswapd_opportunistic_compaction_type for the state machine.
+	 */
+	enum kswapd_opportunistic_compaction_type kswapd_opportunistic_compaction;
 	enum zone_type kswapd_highest_zoneidx;
 
 	atomic_t kswapd_failures;	/* Number of 'reclaimed == 0' runs */
diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h
index 7072f693b9be..c1a69536bcdc 100644
--- a/include/linux/shrinker.h
+++ b/include/linux/shrinker.h
@@ -40,6 +40,26 @@ struct shrink_control {
 	/* Allocation order we are currently trying to fulfil. */
 	s8 order;
 
+	/*
+	 * Opportunistic compaction hint.
+	 *
+	 * Set by the reclaim path to tell shrinkers that this pass is
+	 * driven by an order > 0 allocation that the caller is willing to
+	 * have fail (e.g., __GFP_NORETRY / __GFP_RETRY_MAYFAIL without
+	 * __GFP_NOFAIL). Such allocations only really benefit from
+	 * shrinking when doing so frees up a contiguous, high-order block;
+	 * thrashing working sets in the hope of producing one is typically
+	 * counter-productive.
+	 *
+	 * Shrinkers that can produce naturally-aligned high-order folios
+	 * (see shrink_control::order) should treat this as a hint to skip
+	 * costly work that is unlikely to help compaction (for example,
+	 * evicting hot/working-set pages just to free single pages).
+	 *
+	 * Only meaningful when @order > 0; ignored otherwise.
+	 */
+	bool opportunistic_compaction;
+
 	/*
 	 * How many objects scan_objects should scan and try to reclaim.
 	 * This is reset before every call, so it is safe for callees
diff --git a/mm/internal.h b/mm/internal.h
index ff8671dccf7b..a822ddfc7e5d 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -1760,7 +1760,8 @@ void __meminit __init_page_from_nid(unsigned long pfn, int nid);
 
 /* shrinker related functions */
 unsigned long shrink_slab(gfp_t gfp_mask, int nid, s8 order,
-			  struct mem_cgroup *memcg, int priority);
+			  struct mem_cgroup *memcg, int priority,
+			  bool opportunistic_compaction);
 
 int shmem_add_to_page_cache(struct folio *folio,
 			    struct address_space *mapping,
diff --git a/mm/shrinker.c b/mm/shrinker.c
index c83f3b3daa08..bdc331e8a344 100644
--- a/mm/shrinker.c
+++ b/mm/shrinker.c
@@ -467,7 +467,7 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl,
 
 #ifdef CONFIG_MEMCG
 static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
-			struct mem_cgroup *memcg, int priority)
+			struct mem_cgroup *memcg, int priority, bool opportunistic_compaction)
 {
 	struct shrinker_info *info;
 	unsigned long ret, freed = 0;
@@ -530,6 +530,7 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
 				.nid = nid,
 				.order = order,
 				.memcg = memcg,
+				.opportunistic_compaction = opportunistic_compaction,
 			};
 			struct shrinker *shrinker;
 			int shrinker_id = calc_shrinker_id(index, offset);
@@ -589,7 +590,8 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
 }
 #else /* !CONFIG_MEMCG */
 static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
-			struct mem_cgroup *memcg, int priority)
+			struct mem_cgroup *memcg, int priority,
+			bool opportunistic_compaction)
 {
 	return 0;
 }
@@ -602,6 +604,7 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
  * @order: order of allocation
  * @memcg: memory cgroup whose slab caches to target
  * @priority: the reclaim priority
+ * @opportunistic_compaction: do compaction opportunistically (e.g., do not swap working sets)
  *
  * Call the shrink functions to age shrinkable caches.
  *
@@ -617,7 +620,8 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
  * Returns the number of reclaimed slab objects.
  */
 unsigned long shrink_slab(gfp_t gfp_mask, int nid, s8 order,
-			  struct mem_cgroup *memcg, int priority)
+			  struct mem_cgroup *memcg, int priority,
+			  bool opportunistic_compaction)
 {
 	unsigned long ret, freed = 0;
 	struct shrinker *shrinker;
@@ -630,7 +634,8 @@ unsigned long shrink_slab(gfp_t gfp_mask, int nid, s8 order,
 	 * oom.
 	 */
 	if (!mem_cgroup_disabled() && !mem_cgroup_is_root(memcg))
-		return shrink_slab_memcg(gfp_mask, nid, order, memcg, priority);
+		return shrink_slab_memcg(gfp_mask, nid, order, memcg, priority,
+					 opportunistic_compaction);
 
 	/*
 	 * lockless algorithm of global shrink.
@@ -660,6 +665,7 @@ unsigned long shrink_slab(gfp_t gfp_mask, int nid, s8 order,
 			.nid = nid,
 			.order = order,
 			.memcg = memcg,
+			.opportunistic_compaction = opportunistic_compaction,
 		};
 
 		if (!shrinker_try_get(shrinker))
diff --git a/mm/vmscan.c b/mm/vmscan.c
index a54d14ecad25..57b8e1af6300 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -96,6 +96,14 @@ struct scan_control {
 	/* Swappiness value for proactive reclaim. Always use sc_swappiness()! */
 	int *proactive_swappiness;
 
+	/*
+	 * Opportunistic compaction hint snapshotted from the pgdat at the
+	 * start of this reclaim pass. Forwarded to shrinkers through
+	 * shrink_control::opportunistic_compaction so they can skip
+	 * non-productive work for failable high-order allocations.
+	 */
+	enum kswapd_opportunistic_compaction_type kswapd_opportunistic_compaction;
+
 	/* Can active folios be deactivated as part of reclaim? */
 #define DEACTIVATE_ANON 1
 #define DEACTIVATE_FILE 2
@@ -412,7 +420,7 @@ static unsigned long drop_slab_node(int nid)
 
 	memcg = mem_cgroup_iter(NULL, NULL, NULL);
 	do {
-		freed += shrink_slab(GFP_KERNEL, nid, 0, memcg, 0);
+		freed += shrink_slab(GFP_KERNEL, nid, 0, memcg, 0, false);
 	} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)) != NULL);
 
 	return freed;
@@ -5069,7 +5077,8 @@ static int shrink_one(struct lruvec *lruvec, struct scan_control *sc)
 	success = try_to_shrink_lruvec(lruvec, sc);
 
 	shrink_slab(sc->gfp_mask, pgdat->node_id, sc->order, memcg,
-		    sc->priority);
+		    sc->priority, sc->kswapd_opportunistic_compaction ==
+		    KSWAPD_OPPORTUNISTIC_COMPACTION);
 
 	if (!sc->proactive)
 		vmpressure(sc->gfp_mask, memcg, false, sc->nr_scanned - scanned,
@@ -6172,7 +6181,8 @@ static void shrink_node_memcgs(pg_data_t *pgdat, struct scan_control *sc)
 		shrink_lruvec(lruvec, sc);
 
 		shrink_slab(sc->gfp_mask, pgdat->node_id, sc->order, memcg,
-			    sc->priority);
+			    sc->priority, sc->kswapd_opportunistic_compaction ==
+			    KSWAPD_OPPORTUNISTIC_COMPACTION);
 
 		/* Record the group's reclaim efficiency */
 		if (!sc->proactive)
@@ -7105,8 +7115,14 @@ clear_reclaim_active(pg_data_t *pgdat, int highest_zoneidx)
  * found to have free_pages <= high_wmark_pages(zone), any page in that zone
  * or lower is eligible for reclaim until at least one usable zone is
  * balanced.
+ *
+ * @kswapd_opportunistic_compaction is the aggregated hint produced by
+ * wakeup_kswapd() for this run; it is propagated into scan_control so that
+ * shrinkers can skip costly work that is unlikely to help compaction when
+ * all wakers are failable high-order allocations.
  */
-static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
+static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx,
+			 enum kswapd_opportunistic_compaction_type kswapd_opportunistic_compaction)
 {
 	int i;
 	unsigned long nr_soft_reclaimed;
@@ -7120,6 +7136,7 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
 		.gfp_mask = GFP_KERNEL,
 		.order = order,
 		.may_unmap = 1,
+		.kswapd_opportunistic_compaction = kswapd_opportunistic_compaction,
 	};
 
 	set_task_reclaim_state(current, &sc.reclaim_state);
@@ -7442,6 +7459,7 @@ static int kswapd(void *p)
 	unsigned int highest_zoneidx = MAX_NR_ZONES - 1;
 	pg_data_t *pgdat = (pg_data_t *)p;
 	struct task_struct *tsk = current;
+	enum kswapd_opportunistic_compaction_type kswapd_opportunistic_compaction;
 
 	/*
 	 * Tell the memory management that we're a "memory allocator",
@@ -7459,6 +7477,7 @@ static int kswapd(void *p)
 	set_freezable();
 
 	WRITE_ONCE(pgdat->kswapd_order, 0);
+	WRITE_ONCE(pgdat->kswapd_opportunistic_compaction, KSWAPD_UNSET_OPPORTUNISTIC_COMPACTION);
 	WRITE_ONCE(pgdat->kswapd_highest_zoneidx, MAX_NR_ZONES);
 	atomic_set(&pgdat->nr_writeback_throttled, 0);
 	for ( ; ; ) {
@@ -7474,10 +7493,13 @@ static int kswapd(void *p)
 
 		/* Read the new order and highest_zoneidx */
 		alloc_order = READ_ONCE(pgdat->kswapd_order);
+		kswapd_opportunistic_compaction = READ_ONCE(pgdat->kswapd_opportunistic_compaction);
 		highest_zoneidx = kswapd_highest_zoneidx(pgdat,
 							highest_zoneidx);
 		WRITE_ONCE(pgdat->kswapd_order, 0);
 		WRITE_ONCE(pgdat->kswapd_highest_zoneidx, MAX_NR_ZONES);
+		WRITE_ONCE(pgdat->kswapd_opportunistic_compaction,
+			   KSWAPD_UNSET_OPPORTUNISTIC_COMPACTION);
 
 		if (kthread_freezable_should_stop(&was_frozen))
 			break;
@@ -7500,7 +7522,8 @@ static int kswapd(void *p)
 		trace_mm_vmscan_kswapd_wake(pgdat->node_id, highest_zoneidx,
 						alloc_order);
 		reclaim_order = balance_pgdat(pgdat, alloc_order,
-						highest_zoneidx);
+						highest_zoneidx,
+						kswapd_opportunistic_compaction);
 		if (reclaim_order < alloc_order)
 			goto kswapd_try_sleep;
 	}
@@ -7510,6 +7533,22 @@ static int kswapd(void *p)
 	return 0;
 }
 
+/*
+ * Is @gfp_flags a high-order allocation that is eligible for the
+ * "opportunistic compaction" treatment in kswapd / shrinkers?
+ *
+ * The caller must be willing to tolerate failure (__GFP_NORETRY or
+ * __GFP_RETRY_MAYFAIL) and must not have set __GFP_NOFAIL. For such
+ * allocations there is little value in burning working-set pages just to
+ * scrape together a single high-order block: if compaction can't easily
+ * succeed, the caller would rather see the allocation fail.
+ */
+static bool gfp_kswapd_opportunistic_compaction(gfp_t gfp_flags)
+{
+	return (gfp_flags & (__GFP_NORETRY | __GFP_RETRY_MAYFAIL)) &&
+		!(gfp_flags & __GFP_NOFAIL);
+}
+
 /*
  * A zone is low on free memory or too fragmented for high-order memory.  If
  * kswapd should reclaim (direct reclaim is deferred), wake it up for the zone's
@@ -7538,6 +7577,27 @@ void wakeup_kswapd(struct zone *zone, gfp_t gfp_flags, int order,
 	if (READ_ONCE(pgdat->kswapd_order) < order)
 		WRITE_ONCE(pgdat->kswapd_order, order);
 
+	/*
+	 * Fold this waker into the per-pgdat opportunistic-compaction hint
+	 * that kswapd will pick up at the start of its next run.
+	 *
+	 * The state is sticky in the "NO" direction: once any waker in this
+	 * batch is order-0 or a non-failable high-order allocation, the hint
+	 * stays cleared until kswapd consumes it. Only when every waker so
+	 * far is a failable high-order allocation do we set
+	 * KSWAPD_OPPORTUNISTIC_COMPACTION, asking shrinkers to skip work
+	 * that won't realistically help compaction.
+	 */
+	if (READ_ONCE(pgdat->kswapd_opportunistic_compaction) !=
+	    KSWAPD_NO_OPPORTUNISTIC_COMPACTION) {
+		if (!order || !gfp_kswapd_opportunistic_compaction(gfp_flags))
+			WRITE_ONCE(pgdat->kswapd_opportunistic_compaction,
+				   KSWAPD_NO_OPPORTUNISTIC_COMPACTION);
+		else if (order && gfp_kswapd_opportunistic_compaction(gfp_flags))
+			WRITE_ONCE(pgdat->kswapd_opportunistic_compaction,
+				   KSWAPD_OPPORTUNISTIC_COMPACTION);
+	}
+
 	if (!waitqueue_active(&pgdat->kswapd_wait))
 		return;
 
-- 
2.34.1


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

* [PATCH v5 3/5] drm/ttm: Issue direct reclaim at beneficial_order
  2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
  2026-05-06  3:32 ` [PATCH v5 1/5] mm: Wire up order in shrink_control Matthew Brost
  2026-05-06  3:32 ` [PATCH v5 2/5] mm: Introduce opportunistic_compaction concept to vmscan and shrinkers Matthew Brost
@ 2026-05-06  3:32 ` Matthew Brost
  2026-05-06  3:32 ` [PATCH v5 4/5] drm/xe: Set TTM device beneficial_order to 9 (2M) Matthew Brost
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Matthew Brost @ 2026-05-06  3:32 UTC (permalink / raw)
  To: intel-xe, dri-devel
  Cc: Andrew Morton, Dave Chinner, Qi Zheng, Roman Gushchin,
	Muchun Song, David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Johannes Weiner, Shakeel Butt, Kairui Song, Barry Song,
	Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-mm, linux-kernel,
	Tvrtko Ursulin, Thomas Hellström, Carlos Santa,
	Christian Koenig, Huang Rui, Matthew Auld, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
	Daniel Colascione, Andi Shyti

Triggering kswap at an order higher than beneficial_order makes little
sense, as the driver has already indicated the optimal order at which
reclaim is effective. Similarly, issuing direct reclaim or triggering
kswap at a lower order than beneficial_order is ineffective, since the
driver does not benefit from reclaiming lower-order pages.

As a result, direct reclaim should only be issued with __GFP_NORETRY at
exactly beneficial_order, or as a fallback, direct reclaim without
__GFP_NORETRY at order 0 when failure is not an option.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: David Hildenbrand <david@kernel.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Kairui Song <kasong@tencent.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Wei Xu <weixugc@google.com>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
Cc: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Carlos Santa <carlos.santa@intel.com>
Cc: Christian Koenig <christian.koenig@amd.com>
Cc: Huang Rui <ray.huang@amd.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Matthew Brost <matthew.brost@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: Daniel Colascione <dancol@dancol.org>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Christian Koenig <christian.koenig@amd.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
---
 drivers/gpu/drm/ttm/ttm_pool.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
index 278bbe7a11ad..e76c3a5c67bd 100644
--- a/drivers/gpu/drm/ttm/ttm_pool.c
+++ b/drivers/gpu/drm/ttm/ttm_pool.c
@@ -165,8 +165,8 @@ static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags,
 	 * Do not add latency to the allocation path for allocations orders
 	 * device tolds us do not bring them additional performance gains.
 	 */
-	if (beneficial_order && order > beneficial_order)
-		gfp_flags &= ~__GFP_DIRECT_RECLAIM;
+	if (order && beneficial_order && order != beneficial_order)
+		gfp_flags &= ~__GFP_RECLAIM;
 
 	if (!ttm_pool_uses_dma_alloc(pool)) {
 		p = alloc_pages_node(pool->nid, gfp_flags, order);
-- 
2.34.1


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

* [PATCH v5 4/5] drm/xe: Set TTM device beneficial_order to 9 (2M)
  2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
                   ` (2 preceding siblings ...)
  2026-05-06  3:32 ` [PATCH v5 3/5] drm/ttm: Issue direct reclaim at beneficial_order Matthew Brost
@ 2026-05-06  3:32 ` Matthew Brost
  2026-05-07 11:18   ` Thomas Hellström
  2026-05-06  3:33 ` [PATCH v5 5/5] drm/xe: Make use of shrink_control::opportunistic_compaction hint Matthew Brost
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 11+ messages in thread
From: Matthew Brost @ 2026-05-06  3:32 UTC (permalink / raw)
  To: intel-xe, dri-devel
  Cc: Andrew Morton, Dave Chinner, Qi Zheng, Roman Gushchin,
	Muchun Song, David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Johannes Weiner, Shakeel Butt, Kairui Song, Barry Song,
	Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-mm, linux-kernel,
	Thomas Hellström, Carlos Santa, Matthew Auld, Andi Shyti

Set the TTM device beneficial_order to 9 (2M), which is the sweet
spot for Xe when attempting reclaim on system memory BOs, as it matches
the large GPU page size. This ensures reclaim is attempted at the most
effective order for the driver.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: David Hildenbrand <david@kernel.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Kairui Song <kasong@tencent.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Wei Xu <weixugc@google.com>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Carlos Santa <carlos.santa@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
---
 drivers/gpu/drm/xe/xe_device.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 4b45b617a039..3f719ab08d1c 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -500,7 +500,8 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
 
 	err = ttm_device_init(&xe->ttm, &xe_ttm_funcs, xe->drm.dev,
 			      xe->drm.anon_inode->i_mapping,
-			      xe->drm.vma_offset_manager, 0);
+			      xe->drm.vma_offset_manager,
+			      TTM_ALLOCATION_POOL_BENEFICIAL_ORDER(get_order(SZ_2M)));
 	if (WARN_ON(err))
 		return ERR_PTR(err);
 
-- 
2.34.1


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

* [PATCH v5 5/5] drm/xe: Make use of shrink_control::opportunistic_compaction hint
  2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
                   ` (3 preceding siblings ...)
  2026-05-06  3:32 ` [PATCH v5 4/5] drm/xe: Set TTM device beneficial_order to 9 (2M) Matthew Brost
@ 2026-05-06  3:33 ` Matthew Brost
  2026-05-06 14:38   ` Thomas Hellström
  2026-05-06  3:38 ` ✗ CI.checkpatch: warning for mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation (rev4) Patchwork
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 11+ messages in thread
From: Matthew Brost @ 2026-05-06  3:33 UTC (permalink / raw)
  To: intel-xe, dri-devel
  Cc: Andrew Morton, Dave Chinner, Qi Zheng, Roman Gushchin,
	Muchun Song, David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Johannes Weiner, Shakeel Butt, Kairui Song, Barry Song,
	Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-mm, linux-kernel

Xe/TTM backup reclaim can be extremely expensive under fragmentation
pressure as reclaim may migrate or destroy actively used GPU working
sets despite the system still having substantial free memory available.

Under high-order opportunistic reclaim, repeatedly backing up GPU
memory can lead to reclaim/rebind ping-pong behavior where active GPU
working sets are continuously torn down and reconstructed without
materially improving allocation success.

Use the new shrink_control::opportunistic_compaction hint to avoid Xe
backup reclaim during fragmentation-driven high-order reclaim attempts.
In this mode the shrinker skips advertising backup-backed reclaimable
memory and avoids initiating backup operations entirely.

Order-0 and non-opportunistic reclaim behavior remain unchanged, so
Xe backup reclaim still participates normally during genuine memory
pressure.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: David Hildenbrand <david@kernel.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Kairui Song <kasong@tencent.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Wei Xu <weixugc@google.com>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
---
 drivers/gpu/drm/xe/xe_shrinker.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
index 83374cd57660..4646b0f5b82b 100644
--- a/drivers/gpu/drm/xe/xe_shrinker.c
+++ b/drivers/gpu/drm/xe/xe_shrinker.c
@@ -139,10 +139,17 @@ static unsigned long
 xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
 {
 	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
-	unsigned long num_pages;
+	unsigned long num_pages = 0;
 	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
 
-	num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
+	/*
+	 * Skip accounting backup-able pages when this is an opportunistic
+	 * high-order pass: TTM backup work shrinks at native page granularity
+	 * and is unlikely to produce the contiguous block the caller wants,
+	 * so don't advertise it as reclaimable for this hint.
+	 */
+	if (!sc->order || !sc->opportunistic_compaction)
+		num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
 	read_lock(&shrinker->lock);
 
 	if (can_backup)
@@ -233,7 +240,14 @@ static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_con
 	}
 
 	sc->nr_scanned = nr_scanned;
-	if (nr_scanned >= nr_to_scan || !can_backup)
+	/*
+	 * Stop after the purge pass for opportunistic high-order reclaim:
+	 * the subsequent backup/writeback pass works at native page order
+	 * and is unlikely to free a contiguous high-order block, so doing
+	 * it here would just churn working sets for no compaction benefit.
+	 */
+	if (nr_scanned >= nr_to_scan || !can_backup ||
+	    (sc->order && sc->opportunistic_compaction))
 		goto out;
 
 	/* If we didn't wake before, try to do it now if needed. */
-- 
2.34.1


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

* ✗ CI.checkpatch: warning for mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation (rev4)
  2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
                   ` (4 preceding siblings ...)
  2026-05-06  3:33 ` [PATCH v5 5/5] drm/xe: Make use of shrink_control::opportunistic_compaction hint Matthew Brost
@ 2026-05-06  3:38 ` Patchwork
  2026-05-06  3:40 ` ✓ CI.KUnit: success " Patchwork
  2026-05-09  0:03 ` [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Andrew Morton
  7 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2026-05-06  3:38 UTC (permalink / raw)
  To: Matthew Brost; +Cc: intel-xe

== Series Details ==

Series: mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation (rev4)
URL   : https://patchwork.freedesktop.org/series/165329/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
c8c12e558adaef7a4d125d83b6e1f8824bc13b82
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 04f4cebb6dc17a18e9241c5e434b66e9252c70ba
Author: Matthew Brost <matthew.brost@intel.com>
Date:   Tue May 5 20:33:00 2026 -0700

    drm/xe: Make use of shrink_control::opportunistic_compaction hint
    
    Xe/TTM backup reclaim can be extremely expensive under fragmentation
    pressure as reclaim may migrate or destroy actively used GPU working
    sets despite the system still having substantial free memory available.
    
    Under high-order opportunistic reclaim, repeatedly backing up GPU
    memory can lead to reclaim/rebind ping-pong behavior where active GPU
    working sets are continuously torn down and reconstructed without
    materially improving allocation success.
    
    Use the new shrink_control::opportunistic_compaction hint to avoid Xe
    backup reclaim during fragmentation-driven high-order reclaim attempts.
    In this mode the shrinker skips advertising backup-backed reclaimable
    memory and avoids initiating backup operations entirely.
    
    Order-0 and non-opportunistic reclaim behavior remain unchanged, so
    Xe backup reclaim still participates normally during genuine memory
    pressure.
    
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Qi Zheng <zhengqi.arch@bytedance.com>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: David Hildenbrand <david@kernel.org>
    Cc: Lorenzo Stoakes <ljs@kernel.org>
    Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
    Cc: Vlastimil Babka <vbabka@kernel.org>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Shakeel Butt <shakeel.butt@linux.dev>
    Cc: Kairui Song <kasong@tencent.com>
    Cc: Barry Song <baohua@kernel.org>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Yuanchu Xie <yuanchu@google.com>
    Cc: Wei Xu <weixugc@google.com>
    Cc: linux-mm@kvack.org
    Cc: linux-kernel@vger.kernel.org
    Assisted-by: Claude:claude-opus-4.6
    Signed-off-by: Matthew Brost <matthew.brost@intel.com>
+ /mt/dim checkpatch 2046bd160271a39a4abff3d0033500d7a669a9f1 drm-intel
9559a0f37256 mm: Wire up order in shrink_control
-:79: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#79: FILE: mm/shrinker.c:470:
+static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
 			struct mem_cgroup *memcg, int priority)

-:96: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#96: FILE: mm/shrinker.c:592:
+static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, s8 order,
 			struct mem_cgroup *memcg, int priority)

total: 0 errors, 0 warnings, 2 checks, 99 lines checked
b4812e60e3dc mm: Introduce opportunistic_compaction concept to vmscan and shrinkers
805f4d89d6fa drm/ttm: Issue direct reclaim at beneficial_order
2e4dd3a8a32f drm/xe: Set TTM device beneficial_order to 9 (2M)
04f4cebb6dc1 drm/xe: Make use of shrink_control::opportunistic_compaction hint



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

* ✓ CI.KUnit: success for mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation (rev4)
  2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
                   ` (5 preceding siblings ...)
  2026-05-06  3:38 ` ✗ CI.checkpatch: warning for mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation (rev4) Patchwork
@ 2026-05-06  3:40 ` Patchwork
  2026-05-09  0:03 ` [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Andrew Morton
  7 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2026-05-06  3:40 UTC (permalink / raw)
  To: Matthew Brost; +Cc: intel-xe

== Series Details ==

Series: mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation (rev4)
URL   : https://patchwork.freedesktop.org/series/165329/
State : success

== Summary ==

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

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

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

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



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

* Re: [PATCH v5 5/5] drm/xe: Make use of shrink_control::opportunistic_compaction hint
  2026-05-06  3:33 ` [PATCH v5 5/5] drm/xe: Make use of shrink_control::opportunistic_compaction hint Matthew Brost
@ 2026-05-06 14:38   ` Thomas Hellström
  0 siblings, 0 replies; 11+ messages in thread
From: Thomas Hellström @ 2026-05-06 14:38 UTC (permalink / raw)
  To: Matthew Brost, intel-xe, dri-devel
  Cc: Andrew Morton, Dave Chinner, Qi Zheng, Roman Gushchin,
	Muchun Song, David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Johannes Weiner, Shakeel Butt, Kairui Song, Barry Song,
	Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-mm, linux-kernel

On Tue, 2026-05-05 at 20:33 -0700, Matthew Brost wrote:
> Xe/TTM backup reclaim can be extremely expensive under fragmentation
> pressure as reclaim may migrate or destroy actively used GPU working
> sets despite the system still having substantial free memory
> available.
> 
> Under high-order opportunistic reclaim, repeatedly backing up GPU
> memory can lead to reclaim/rebind ping-pong behavior where active GPU
> working sets are continuously torn down and reconstructed without
> materially improving allocation success.
> 
> Use the new shrink_control::opportunistic_compaction hint to avoid Xe
> backup reclaim during fragmentation-driven high-order reclaim
> attempts.
> In this mode the shrinker skips advertising backup-backed reclaimable
> memory and avoids initiating backup operations entirely.
> 
> Order-0 and non-opportunistic reclaim behavior remain unchanged, so
> Xe backup reclaim still participates normally during genuine memory
> pressure.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Dave Chinner <david@fromorbit.com>
> Cc: Qi Zheng <zhengqi.arch@bytedance.com>
> Cc: Roman Gushchin <roman.gushchin@linux.dev>
> Cc: Muchun Song <muchun.song@linux.dev>
> Cc: David Hildenbrand <david@kernel.org>
> Cc: Lorenzo Stoakes <ljs@kernel.org>
> Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
> Cc: Vlastimil Babka <vbabka@kernel.org>
> Cc: Mike Rapoport <rppt@kernel.org>
> Cc: Suren Baghdasaryan <surenb@google.com>
> Cc: Michal Hocko <mhocko@suse.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: Shakeel Butt <shakeel.butt@linux.dev>
> Cc: Kairui Song <kasong@tencent.com>
> Cc: Barry Song <baohua@kernel.org>
> Cc: Axel Rasmussen <axelrasmussen@google.com>
> Cc: Yuanchu Xie <yuanchu@google.com>
> Cc: Wei Xu <weixugc@google.com>
> Cc: linux-mm@kvack.org
> Cc: linux-kernel@vger.kernel.org
> Assisted-by: Claude:claude-opus-4.6
> Signed-off-by: Matthew Brost <matthew.brost@intel.com>

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

> ---
>  drivers/gpu/drm/xe/xe_shrinker.c | 20 +++++++++++++++++---
>  1 file changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_shrinker.c
> b/drivers/gpu/drm/xe/xe_shrinker.c
> index 83374cd57660..4646b0f5b82b 100644
> --- a/drivers/gpu/drm/xe/xe_shrinker.c
> +++ b/drivers/gpu/drm/xe/xe_shrinker.c
> @@ -139,10 +139,17 @@ static unsigned long
>  xe_shrinker_count(struct shrinker *shrink, struct shrink_control
> *sc)
>  {
>  	struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
> -	unsigned long num_pages;
> +	unsigned long num_pages = 0;
>  	bool can_backup = !!(sc->gfp_mask & __GFP_FS);
>  
> -	num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
> +	/*
> +	 * Skip accounting backup-able pages when this is an
> opportunistic
> +	 * high-order pass: TTM backup work shrinks at native page
> granularity
> +	 * and is unlikely to produce the contiguous block the
> caller wants,
> +	 * so don't advertise it as reclaimable for this hint.
> +	 */
> +	if (!sc->order || !sc->opportunistic_compaction)
> +		num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
>  	read_lock(&shrinker->lock);
>  
>  	if (can_backup)
> @@ -233,7 +240,14 @@ static unsigned long xe_shrinker_scan(struct
> shrinker *shrink, struct shrink_con
>  	}
>  
>  	sc->nr_scanned = nr_scanned;
> -	if (nr_scanned >= nr_to_scan || !can_backup)
> +	/*
> +	 * Stop after the purge pass for opportunistic high-order
> reclaim:
> +	 * the subsequent backup/writeback pass works at native page
> order
> +	 * and is unlikely to free a contiguous high-order block, so
> doing
> +	 * it here would just churn working sets for no compaction
> benefit.
> +	 */
> +	if (nr_scanned >= nr_to_scan || !can_backup ||
> +	    (sc->order && sc->opportunistic_compaction))
>  		goto out;
>  
>  	/* If we didn't wake before, try to do it now if needed. */

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

* Re: [PATCH v5 4/5] drm/xe: Set TTM device beneficial_order to 9 (2M)
  2026-05-06  3:32 ` [PATCH v5 4/5] drm/xe: Set TTM device beneficial_order to 9 (2M) Matthew Brost
@ 2026-05-07 11:18   ` Thomas Hellström
  0 siblings, 0 replies; 11+ messages in thread
From: Thomas Hellström @ 2026-05-07 11:18 UTC (permalink / raw)
  To: Matthew Brost, intel-xe, dri-devel
  Cc: Andrew Morton, Dave Chinner, Qi Zheng, Roman Gushchin,
	Muchun Song, David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Johannes Weiner, Shakeel Butt, Kairui Song, Barry Song,
	Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-mm, linux-kernel,
	Carlos Santa, Matthew Auld, Andi Shyti

On Tue, 2026-05-05 at 20:32 -0700, Matthew Brost wrote:
> Set the TTM device beneficial_order to 9 (2M), which is the sweet
> spot for Xe when attempting reclaim on system memory BOs, as it
> matches
> the large GPU page size. This ensures reclaim is attempted at the
> most
> effective order for the driver.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Dave Chinner <david@fromorbit.com>
> Cc: Qi Zheng <zhengqi.arch@bytedance.com>
> Cc: Roman Gushchin <roman.gushchin@linux.dev>
> Cc: Muchun Song <muchun.song@linux.dev>
> Cc: David Hildenbrand <david@kernel.org>
> Cc: Lorenzo Stoakes <ljs@kernel.org>
> Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
> Cc: Vlastimil Babka <vbabka@kernel.org>
> Cc: Mike Rapoport <rppt@kernel.org>
> Cc: Suren Baghdasaryan <surenb@google.com>
> Cc: Michal Hocko <mhocko@suse.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: Shakeel Butt <shakeel.butt@linux.dev>
> Cc: Kairui Song <kasong@tencent.com>
> Cc: Barry Song <baohua@kernel.org>
> Cc: Axel Rasmussen <axelrasmussen@google.com>
> Cc: Yuanchu Xie <yuanchu@google.com>
> Cc: Wei Xu <weixugc@google.com>
> Cc: linux-mm@kvack.org
> Cc: linux-kernel@vger.kernel.org
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Carlos Santa <carlos.santa@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> Signed-off-by: Matthew Brost <matthew.brost@intel.com>
> Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>

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


> ---
>  drivers/gpu/drm/xe/xe_device.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_device.c
> b/drivers/gpu/drm/xe/xe_device.c
> index 4b45b617a039..3f719ab08d1c 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -500,7 +500,8 @@ struct xe_device *xe_device_create(struct pci_dev
> *pdev,
>  
>  	err = ttm_device_init(&xe->ttm, &xe_ttm_funcs, xe->drm.dev,
>  			      xe->drm.anon_inode->i_mapping,
> -			      xe->drm.vma_offset_manager, 0);
> +			      xe->drm.vma_offset_manager,
> +			     
> TTM_ALLOCATION_POOL_BENEFICIAL_ORDER(get_order(SZ_2M)));
>  	if (WARN_ON(err))
>  		return ERR_PTR(err);
>  

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

* Re: [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation
  2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
                   ` (6 preceding siblings ...)
  2026-05-06  3:40 ` ✓ CI.KUnit: success " Patchwork
@ 2026-05-09  0:03 ` Andrew Morton
  7 siblings, 0 replies; 11+ messages in thread
From: Andrew Morton @ 2026-05-09  0:03 UTC (permalink / raw)
  To: Matthew Brost
  Cc: intel-xe, dri-devel, Dave Chinner, Qi Zheng, Roman Gushchin,
	Johannes Weiner, Shakeel Butt, Kairui Song, Barry Song,
	Axel Rasmussen, Yuanchu Xie, Wei Xu, Tvrtko Ursulin,
	Thomas Hellström, Carlos Santa, Christian Koenig, Huang Rui,
	Matthew Auld, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	David Airlie, Simona Vetter, Daniel Colascione, David Hildenbrand,
	Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
	Suren Baghdasaryan, Michal Hocko, linux-mm, linux-kernel

On Tue,  5 May 2026 20:32:55 -0700 Matthew Brost <matthew.brost@intel.com> wrote:

> TTM allocations at higher orders can drive Xe into a pathological
> reclaim loop when memory is fragmented:
> 
> ...
> 
> This series addresses the issue in three layers:

Thanks.  AI review asked a few things, nothing looked very serious to
my eye:

	https://sashiko.dev/#/patchset/20260506033300.3534883-1-matthew.brost@intel.com

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

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

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-06  3:32 [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Matthew Brost
2026-05-06  3:32 ` [PATCH v5 1/5] mm: Wire up order in shrink_control Matthew Brost
2026-05-06  3:32 ` [PATCH v5 2/5] mm: Introduce opportunistic_compaction concept to vmscan and shrinkers Matthew Brost
2026-05-06  3:32 ` [PATCH v5 3/5] drm/ttm: Issue direct reclaim at beneficial_order Matthew Brost
2026-05-06  3:32 ` [PATCH v5 4/5] drm/xe: Set TTM device beneficial_order to 9 (2M) Matthew Brost
2026-05-07 11:18   ` Thomas Hellström
2026-05-06  3:33 ` [PATCH v5 5/5] drm/xe: Make use of shrink_control::opportunistic_compaction hint Matthew Brost
2026-05-06 14:38   ` Thomas Hellström
2026-05-06  3:38 ` ✗ CI.checkpatch: warning for mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation (rev4) Patchwork
2026-05-06  3:40 ` ✓ CI.KUnit: success " Patchwork
2026-05-09  0:03 ` [PATCH v5 0/5] mm, drm/ttm, drm/xe: Avoid reclaim/eviction loops under fragmentation Andrew Morton

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