@@ -132,6 +132,16 @@ static struct list_head shrinker_list;
132132static struct shrinker * mm_shrinker ;
133133static DECLARE_RWSEM (pool_shrink_rwsem );
134134
135+ static int ttm_pool_nid (struct ttm_pool * pool )
136+ {
137+ int nid = NUMA_NO_NODE ;
138+ if (pool )
139+ nid = pool -> nid ;
140+ if (nid == NUMA_NO_NODE )
141+ nid = numa_node_id ();
142+ return nid ;
143+ }
144+
135145/* Allocate pages of size 1 << order with the given gfp_flags */
136146static struct page * ttm_pool_alloc_page (struct ttm_pool * pool , gfp_t gfp_flags ,
137147 unsigned int order )
@@ -297,30 +307,41 @@ static void ttm_pool_type_give(struct ttm_pool_type *pt, struct page *p)
297307 clear_page (page_address (p + i ));
298308 }
299309
300- spin_lock (& pt -> lock );
301- list_add (& p -> lru , & pt -> pages );
302- spin_unlock (& pt -> lock );
310+ INIT_LIST_HEAD (& p -> lru );
311+ rcu_read_lock ();
312+ list_lru_add (& pt -> pages , & p -> lru , page_to_nid (p ), NULL );
313+ rcu_read_unlock ();
303314 atomic_long_add (1 << pt -> order , & allocated_pages );
304315
305316 mod_lruvec_page_state (p , NR_GPU_ACTIVE , - num_pages );
306317 mod_lruvec_page_state (p , NR_GPU_RECLAIM , num_pages );
307318}
308319
320+ static enum lru_status take_one_from_lru (struct list_head * item ,
321+ struct list_lru_one * list ,
322+ void * cb_arg )
323+ {
324+ struct page * * out_page = cb_arg ;
325+ struct page * p = container_of (item , struct page , lru );
326+ list_lru_isolate (list , item );
327+
328+ * out_page = p ;
329+ return LRU_REMOVED ;
330+ }
331+
309332/* Take pages from a specific pool_type, return NULL when nothing available */
310- static struct page * ttm_pool_type_take (struct ttm_pool_type * pt )
333+ static struct page * ttm_pool_type_take (struct ttm_pool_type * pt , int nid )
311334{
312- struct page * p ;
335+ int ret ;
336+ struct page * p = NULL ;
337+ unsigned long nr_to_walk = 1 ;
313338
314- spin_lock (& pt -> lock );
315- p = list_first_entry_or_null (& pt -> pages , typeof (* p ), lru );
316- if (p ) {
339+ ret = list_lru_walk_node (& pt -> pages , nid , take_one_from_lru , (void * )& p , & nr_to_walk );
340+ if (ret == 1 && p ) {
317341 atomic_long_sub (1 << pt -> order , & allocated_pages );
318342 mod_lruvec_page_state (p , NR_GPU_ACTIVE , (1 << pt -> order ));
319343 mod_lruvec_page_state (p , NR_GPU_RECLAIM , - (1 << pt -> order ));
320- list_del (& p -> lru );
321344 }
322- spin_unlock (& pt -> lock );
323-
324345 return p ;
325346}
326347
@@ -331,25 +352,47 @@ static void ttm_pool_type_init(struct ttm_pool_type *pt, struct ttm_pool *pool,
331352 pt -> pool = pool ;
332353 pt -> caching = caching ;
333354 pt -> order = order ;
334- spin_lock_init (& pt -> lock );
335- INIT_LIST_HEAD (& pt -> pages );
355+ list_lru_init (& pt -> pages );
336356
337357 spin_lock (& shrinker_lock );
338358 list_add_tail (& pt -> shrinker_list , & shrinker_list );
339359 spin_unlock (& shrinker_lock );
340360}
341361
362+ static enum lru_status pool_move_to_dispose_list (struct list_head * item ,
363+ struct list_lru_one * list ,
364+ void * cb_arg )
365+ {
366+ struct list_head * dispose = cb_arg ;
367+
368+ list_lru_isolate_move (list , item , dispose );
369+
370+ return LRU_REMOVED ;
371+ }
372+
373+ static void ttm_pool_dispose_list (struct ttm_pool_type * pt ,
374+ struct list_head * dispose )
375+ {
376+ while (!list_empty (dispose )) {
377+ struct page * p ;
378+ p = list_first_entry (dispose , struct page , lru );
379+ list_del_init (& p -> lru );
380+ atomic_long_sub (1 << pt -> order , & allocated_pages );
381+ ttm_pool_free_page (pt -> pool , pt -> caching , pt -> order , p , true);
382+ }
383+ }
384+
342385/* Remove a pool_type from the global shrinker list and free all pages */
343386static void ttm_pool_type_fini (struct ttm_pool_type * pt )
344387{
345- struct page * p ;
388+ LIST_HEAD ( dispose ) ;
346389
347390 spin_lock (& shrinker_lock );
348391 list_del (& pt -> shrinker_list );
349392 spin_unlock (& shrinker_lock );
350393
351- while (( p = ttm_pool_type_take ( pt )))
352- ttm_pool_free_page (pt -> pool , pt -> caching , pt -> order , p , true );
394+ list_lru_walk ( & pt -> pages , pool_move_to_dispose_list , & dispose , LONG_MAX );
395+ ttm_pool_dispose_list (pt , & dispose );
353396}
354397
355398/* Return the pool_type to use for the given caching and order */
@@ -399,7 +442,7 @@ static unsigned int ttm_pool_shrink(void)
399442 list_move_tail (& pt -> shrinker_list , & shrinker_list );
400443 spin_unlock (& shrinker_lock );
401444
402- p = ttm_pool_type_take (pt );
445+ p = ttm_pool_type_take (pt , ttm_pool_nid ( pt -> pool ) );
403446 if (p ) {
404447 ttm_pool_free_page (pt -> pool , pt -> caching , pt -> order , p , true);
405448 num_pages = 1 << pt -> order ;
@@ -756,7 +799,7 @@ static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
756799 p = NULL ;
757800 pt = ttm_pool_select_type (pool , page_caching , order );
758801 if (pt && allow_pools )
759- p = ttm_pool_type_take (pt );
802+ p = ttm_pool_type_take (pt , ttm_pool_nid ( pool ) );
760803 /*
761804 * If that fails or previously failed, allocate from system.
762805 * Note that this also disallows additional pool allocations using
@@ -1185,16 +1228,7 @@ static unsigned long ttm_pool_shrinker_count(struct shrinker *shrink,
11851228/* Count the number of pages available in a pool_type */
11861229static unsigned int ttm_pool_type_count (struct ttm_pool_type * pt )
11871230{
1188- unsigned int count = 0 ;
1189- struct page * p ;
1190-
1191- spin_lock (& pt -> lock );
1192- /* Only used for debugfs, the overhead doesn't matter */
1193- list_for_each_entry (p , & pt -> pages , lru )
1194- ++ count ;
1195- spin_unlock (& pt -> lock );
1196-
1197- return count ;
1231+ return list_lru_count (& pt -> pages );
11981232}
11991233
12001234/* Print a nice header for the order */
0 commit comments