Re: [PATCH v2 4/4] mm/mglru: fix anon-only reclaim evicting file pages when swappiness=max

From: Ridong Chen

Date: Mon Jul 20 2026 - 02:04:03 EST




On 7/20/2026 10:48 AM, Qi Zheng wrote:


On 7/18/26 9:43 PM, Barry Song wrote:
On Sat, Jul 18, 2026 at 5:54 PM Ridong Chen <ridong.chen@xxxxxxxxx> wrote:

From: Ridong Chen <chenridong@xxxxxxxxxx>

The previous patch fixes this issue for the traditional LRU, which also
exists in MGLRU [1]. Fix this by checking whether swappiness is
SWAPPINESS_ANON_ONLY in get_swappiness() first, and returning 0 from
get_nr_to_scan() when swappiness is SWAPPINESS_ANON_ONLY and anon pages
cannot be reclaimed, to avoid useless work.

Is this intended to avoid unnecessary work, or to prevent file folios
from being reclaimed incorrectly?

Based on the test results below, it seems primarily intended to prevent
file pages from being mistakenly reclaimed. Also, bailing out early in
the SWAPPINESS_ANON_ONLY + !can_reclaim_anon_pages case is to avoid
unnecessary work.

Hi Ridong, perhaps the commit message could be clearer. ;)


Thanks for the feedback. Let me clarify:

When SWAPPINESS_ANON_ONLY is set, get_swappiness() returns the swappiness value, and get_type_to_scan() can always return LRU_GEN_ANON. So if anonymous pages cannot be reclaimed, we bail out early to avoid unnecessary work. In that case, get_nr_to_scan() just returns 0.

If we do not return early in get_nr_to_scan() under the SWAPPINESS_ANON_ONLY + !can_reclaim_anon_pages condition, then in isolate_folios(), it may fall back to scanning file pages, but this only happens when scanned = 0, which is not the usual case.


```
shrink_one
try_to_shrink_lruvec
get_swappiness // return SWAPPINESS_ANON_ONLY if swappiness=max
get_nr_to_scan // return 0 if anon can't be reclaimed, skip
evict_folios
isolate_folios // !scanned falling back to anyther type if !scanned
```

I'll update the commit message to make this clearer in the next version.



The test result:
Before fix:

   # cat /sys/kernel/mm/lru_gen/enabled
   0x0007
   # cat memory.stat
   anon 204800
   file 67108864
   ...
   pgsteal_proactive 0
   pgscan_proactive 0

   # echo "64M swappiness=max" > memory.reclaim
   # cat memory.stat
   anon 208896
   file 0
   ...
   pgsteal_proactive 16384
   pgscan_proactive 16384

After fix:

   # cat memory.stat
   anon 188416
   file 67215360
   kernel 1970176
   ...
   pgsteal_proactive 0
   pgscan_proactive 0

   # echo "64M swappiness=max" > memory.reclaim
   -bash: echo: write error: Resource temporarily unavailable
   # cat memory.stat
   anon 204800
   file 67215360
   ...
   pgsteal_proactive 0
   pgscan_proactive 0

[1] https://sashiko.dev/#/patchset/20260717113300.214717-1- ridong.chen@xxxxxxxxx

Fixes: 68a1436bde00 ("mm: add swappiness=max arg to memory.reclaim for only anon reclaim")
Signed-off-by: Ridong Chen <chenridong@xxxxxxxxxx>
---
  mm/vmscan.c | 14 +++++++++++++-
  1 file changed, 13 insertions(+), 1 deletion(-)


Overall, this looks good to me.

Acked-by: Qi Zheng <qi.zheng@xxxxxxxxx>

Thanks,
Qi



--
Best regards
Ridong