When laptop_mode is enabled, may_writepage is set to 0 in try_to_free_mem_cgroup_pages(). This triggers a warning in MGLRU's lru_gen_shrink_lruvec(): VM_WARN_ON_ONCE(!sc->may_writepage || !sc->may_unmap); The warning occurs because MGLRU expects full reclaim capabilities to function correctly. The call path is: mem_cgroup_resize_max() try_to_free_mem_cgroup_pages() do_try_to_free_pages() shrink_node() shrink_lruvec() lru_gen_shrink_lruvec() <-- WARNING Unlike kswapd or direct reclaim where laptop_mode's disk-saving behavior is a reasonable optimization, memcg limit enforcement is a hard requirement - memory MUST be freed when a cgroup exceeds its limit. The may_unmap field is already set unconditionally to 1 in this path, acknowledging that memcg reclaim needs full capabilities. Set may_writepage unconditionally to 1 for memcg reclaim to ensure MGLRU works correctly and memory limits are properly enforced. Fixes: bd74fdaea146 ("mm: multi-gen LRU: support page table walks") Reported-by: syzbot+90fcab4d88cffed6d0d8@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=90fcab4d88cffed6d0d8 Signed-off-by: Deepanshu Kartikey --- Note: Only compile-tested. No reproducer available from syzbot. --- mm/vmscan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 900c74b6aa62..5e1c99d9cbd7 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -6669,7 +6669,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, .reclaim_idx = MAX_NR_ZONES - 1, .target_mem_cgroup = memcg, .priority = DEF_PRIORITY, - .may_writepage = !laptop_mode, + .may_writepage = 1, .may_unmap = 1, .may_swap = !!(reclaim_options & MEMCG_RECLAIM_MAY_SWAP), .proactive = !!(reclaim_options & MEMCG_RECLAIM_PROACTIVE), -- 2.43.0