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. --- 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; } -- 2.54.0
