0
点赞
收藏
分享

微信扫一扫

shrink_list

犹大之窗 2023-06-05 阅读 30

static unsigned long 
shrink_list(enum lru_list lru, unsigned long nr_to_scan, 

struct lruvec *lruvec, struct scan_control *sc) 

 { 

if (is_active_lru(lru)) { 

 
if (inactive_list_is_low(lruvec, is_file_lru(lru))) 

 
shrink_active_list(nr_to_scan, lruvec, sc, lru); 

return 0; 

} 



 
return shrink_inactive_list(nr_to_scan, lruvec, sc, lru); 
}

static inline int is_active_lru(enum lru_list lru)
 {
return (lru == LRU_ACTIVE_ANON || lru == LRU_ACTIVE_FILE);
 }
/*
  * The inactive anon list should be small enough that the VM never has
  * to do too much work.
  *
  * The inactive file list should be small enough to leave most memory
  * to the established workingset on the scan-resistant active list,
  * but large enough to avoid thrashing the aggregate readahead window.
  *
  * Both inactive lists should also be large enough that each inactive
  * page has a chance to be referenced again before it is reclaimed.
  *
  * The inactive_ratio is the target ratio of ACTIVE to INACTIVE pages
  * on this LRU, maintained by the pageout code. A zone->inactive_ratio
  * of 3 means 3:1 or 25% of the pages are kept on the inactive list.
  *
  * total     target    max
  * memory    ratio     inactive
  * -------------------------------------
  *   10MB       1         5MB
  *  100MB       1        50MB
  *    1GB       3       250MB
  *   10GB      10       0.9GB
  *  100GB      31         3GB
  *    1TB     101        10GB
  *   10TB     320        32GB
  */
static bool inactive_list_is_low(struct lruvec *lruvec, bool file)
 {
unsigned long inactive_ratio;
unsigned long inactive;
unsigned long active;
unsigned long gb;


/*
* If we don't have swap space, anonymous page deactivation
* is pointless.
*/
if (!file && !total_swap_pages)
return false;


inactive = lruvec_lru_size(lruvec, file * LRU_FILE);
active = lruvec_lru_size(lruvec, file * LRU_FILE + LRU_ACTIVE);


gb = (inactive + active) >> (30 - PAGE_SHIFT);
if (gb)
inactive_ratio = int_sqrt(10 * gb);
else
inactive_ratio = 1;


return inactive * inactive_ratio < active;
 }

举报

相关推荐

0 条评论