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

Reply via email to