Re: [PATCH 03/10] ttm/pool: initialise the shrinker earlier (v2)
Thomas Hellström <[email protected]> Wed, 22 Jul 2026 17:33:39 +0200
| Newsgroups | org.kernel.vger.cgroups,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-xe |
|---|---|
| Organization | Intel Sweden AB, Registration Number: 556189-6027 |
| Message-ID | <[email protected]> |
On Mon, 2026-07-06 at 15:22 +1000, Dave Airlie wrote: > From: Dave Airlie <[email protected]> > > Later memcg enablement needs the shrinker initialised before the list > lru, > Just move it for now, but also handle the list being uninitialised. > > Signed-off-by: Dave Airlie <[email protected]> > > --- > v2: sashiko identified a problem with the list handling. > --- Couple of seemingly valid Sashiko issues: https://sashiko.dev/#/message/20260706053333.AEABE1F000E9%40smtp.kernel.org Thanks, Thomas > drivers/gpu/drm/ttm/ttm_pool.c | 30 +++++++++++++++++------------- > 1 file changed, 17 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c > b/drivers/gpu/drm/ttm/ttm_pool.c > index e4dbf4c93091..f12b68812081 100644 > --- a/drivers/gpu/drm/ttm/ttm_pool.c > +++ b/drivers/gpu/drm/ttm/ttm_pool.c > @@ -440,10 +440,14 @@ static unsigned int ttm_pool_shrink(int nid, > unsigned long num_to_free) > > down_read(&pool_shrink_rwsem); > spin_lock(&shrinker_lock); > - pt = list_first_entry(&shrinker_list, typeof(*pt), > shrinker_list); > - list_move_tail(&pt->shrinker_list, &shrinker_list); > + pt = list_first_entry_or_null(&shrinker_list, typeof(*pt), > shrinker_list); > + if (pt) > + list_move_tail(&pt->shrinker_list, &shrinker_list); > spin_unlock(&shrinker_lock); > > + if (!pt) > + return 0; > + > num_pages = list_lru_walk_node(&pt->pages, nid, > pool_move_to_dispose_list, &dispose, &num_to_free); > num_pages *= 1 << pt->order; > > @@ -1402,6 +1406,17 @@ int ttm_pool_mgr_init(unsigned long num_pages) > spin_lock_init(&shrinker_lock); > INIT_LIST_HEAD(&shrinker_list); > > + mm_shrinker = shrinker_alloc(SHRINKER_NUMA_AWARE, "drm- > ttm_pool"); > + if (!mm_shrinker) > + return -ENOMEM; > + > + mm_shrinker->count_objects = ttm_pool_shrinker_count; > + mm_shrinker->scan_objects = ttm_pool_shrinker_scan; > + mm_shrinker->batch = TTM_SHRINKER_BATCH; > + mm_shrinker->seeks = 1; > + > + shrinker_register(mm_shrinker); > + > for (i = 0; i < NR_PAGE_ORDERS; ++i) { > ttm_pool_type_init(&global_write_combined[i], NULL, > ttm_write_combined, i); > @@ -1424,17 +1439,6 @@ int ttm_pool_mgr_init(unsigned long num_pages) > #endif > #endif > > - mm_shrinker = shrinker_alloc(SHRINKER_NUMA_AWARE, "drm- > ttm_pool"); > - if (!mm_shrinker) > - return -ENOMEM; > - > - mm_shrinker->count_objects = ttm_pool_shrinker_count; > - mm_shrinker->scan_objects = ttm_pool_shrinker_scan; > - mm_shrinker->batch = TTM_SHRINKER_BATCH; > - mm_shrinker->seeks = 1; > - > - shrinker_register(mm_shrinker); > - > return 0; > } >