[PATCH 1/2] drm/xe: count UMA shrinkable BOs as reclaimable without swap
From: aquiles
Date: Fri Jun 26 2026 - 07:36:08 EST
On integrated (UMA) devices all GPU buffer objects reside in system RAM.
xe_shrinker_count() previously gated shrinkable (non-purgeable) page
counts on ttm_backup_bytes_avail(), so those pages were invisible to
the kernel's memory reclaim on systems without swap configured.
On UMA, shrinkable system-memory BOs can be reclaimed independently of
swap availability. Report them unconditionally so the shrinker can
always request their eviction under memory pressure.
Signed-off-by: aquiles <achillezongo07@xxxxxxxxx>
---
drivers/gpu/drm/xe/xe_shrinker.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
index 83374cd57..3ca2de342 100644
--- a/drivers/gpu/drm/xe/xe_shrinker.c
+++ b/drivers/gpu/drm/xe/xe_shrinker.c
@@ -140,16 +140,22 @@ xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
{
struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
unsigned long num_pages;
+ long uma_reclaimable_pages;
bool can_backup = !!(sc->gfp_mask & __GFP_FS);
+ bool is_uma = !IS_DGFX(shrinker->xe);
num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
read_lock(&shrinker->lock);
+ uma_reclaimable_pages = is_uma ? shrinker->shrinkable_pages : 0;
+
if (can_backup)
- num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
+ num_pages = min_t(unsigned long, num_pages,
+ shrinker->shrinkable_pages - uma_reclaimable_pages);
else
num_pages = 0;
+ num_pages += uma_reclaimable_pages;
num_pages += shrinker->purgeable_pages;
read_unlock(&shrinker->lock);
--
2.54.0