From: Yang Yang <yang.yang29@xxxxxxxxxx> After we implemented workingset detection for anonymous LRU[1], the calculation of workingset size is a little complex. Actually there is no need to call mem_cgroup_get_nr_swap_pages() if refault page is anonymous page, since we are doing swapping then should always give pressure to NR_ACTIVE_ANON. So avoid using mem_cgroup_get_nr_swap_pages() when handling swapin in workingset_refault(). This also give us a chance to refactor the code to make it simpler and more understandable. [1] commit aae466b0052e ("mm/swap: implement workingset detection for anonymous LRU") Signed-off-by: Yang Yang <yang.yang29@xxxxxxxxxx> Reviewed-by: Wang Yong <wang.yong12@xxxxxxxxxx> Reviewed-by: Xiaokai Ran <ran.xiaokai@xxxxxxxxxx> --- mm/workingset.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/mm/workingset.c b/mm/workingset.c index 00c6f4d9d9be..a304e8571d54 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -466,22 +466,23 @@ void workingset_refault(struct folio *folio, void *shadow) /* * Compare the distance to the existing workingset size. We * don't activate pages that couldn't stay resident even if - * all the memory was available to the workingset. Whether - * workingset competition needs to consider anon or not depends - * on having swap. + * all the memory was available to the workingset. For page + * cache whether workingset competition needs to consider + * anon or not depends on having swap. */ workingset_size = lruvec_page_state(eviction_lruvec, NR_ACTIVE_FILE); + /* For anonymous page */ if (!file) { + workingset_size += lruvec_page_state(eviction_lruvec, + NR_ACTIVE_ANON); workingset_size += lruvec_page_state(eviction_lruvec, NR_INACTIVE_FILE); - } - if (mem_cgroup_get_nr_swap_pages(eviction_memcg) > 0) { + /* For page cache */ + } else if (mem_cgroup_get_nr_swap_pages(eviction_memcg) > 0) { workingset_size += lruvec_page_state(eviction_lruvec, NR_ACTIVE_ANON); - if (file) { - workingset_size += lruvec_page_state(eviction_lruvec, + workingset_size += lruvec_page_state(eviction_lruvec, NR_INACTIVE_ANON); - } } if (refault_distance > workingset_size) goto out; -- 2.25.1