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 <[email protected]> Cc: Qi Zheng <[email protected]> Cc: Roman Gushchin <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: Shakeel Butt <[email protected]> Cc: Kairui Song <[email protected]> Cc: Barry Song <[email protected]> Cc: Axel Rasmussen <[email protected]> Cc: Yuanchu Xie <[email protected]> Cc: Wei Xu <[email protected]> Cc: Tvrtko Ursulin <[email protected]> Cc: Thomas Hellström <[email protected]> Cc: Carlos Santa <[email protected]> Cc: Christian Koenig <[email protected]> Cc: Huang Rui <[email protected]> Cc: Matthew Auld <[email protected]> Cc: Matthew Brost <[email protected]> Cc: Maarten Lankhorst <[email protected]> Cc: Maxime Ripard <[email protected]> Cc: Thomas Zimmermann <[email protected]> Cc: David Airlie <[email protected]> Cc: Simona Vetter <[email protected]> CC: [email protected] Cc: Daniel Colascione <[email protected]> Cc: Andrew Morton <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Lorenzo Stoakes <[email protected]> Cc: "Liam R. Howlett" <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Suren Baghdasaryan <[email protected]> Cc: Michal Hocko <[email protected]> Cc: [email protected] Cc: [email protected] 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
