mm/vmscan.c | 54 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 14 deletions(-)
From: Ridong Chen <chenridong@xiaomi.com>
Fixes and one cleanup.
Patch 1 fixes "swappiness=max": the anon-only test in get_scan_count()
sat after the "cannot reclaim anon" check, so when no anon was
reclaimable the request fell back to SCAN_FILE and evicted page cache
instead.
Patch 2 fixes reclaim_store() collapsing every error into -EAGAIN, so
callers can no longer tell an invalid argument from a busy interface;
propagate the real error code, matching the memcg path.
Patch 3 drops the now-unused gfp_mask parameter from __node_reclaim().
Patch 4 fixes the same "swappiness=max" issue for MGLRU.
---
v2 -> v3:
- Update comments and commit message.
v1 -> v2:
- Collected review tags for patches 1-3
- Added patch 4 to fix the same issue in the MGLRU path.
Ridong Chen (4):
mm/vmscan: fix anon-only reclaim evicting file pages when
swappiness=max
mm: vmscan: propagate real error code from per-node proactive reclaim
mm: vmscan: drop unused gfp_mask parameter from __node_reclaim()
mm/mglru: fix anon-only reclaim evicting file pages when
swappiness=max
mm/vmscan.c | 54 +++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 40 insertions(+), 14 deletions(-)
--
2.34.1
On Thu, 23 Jul 2026 12:57:14 +0800 Ridong <ridong.chen@linux.dev> wrote: > Fixes and one cleanup. > > Patch 1 fixes "swappiness=max": the anon-only test in get_scan_count() > sat after the "cannot reclaim anon" check, so when no anon was > reclaimable the request fell back to SCAN_FILE and evicted page cache > instead. > > Patch 2 fixes reclaim_store() collapsing every error into -EAGAIN, so > callers can no longer tell an invalid argument from a busy interface; > propagate the real error code, matching the memcg path. > > Patch 3 drops the now-unused gfp_mask parameter from __node_reclaim(). > > Patch 4 fixes the same "swappiness=max" issue for MGLRU. Thanks. AI review might have found several pre-existing issues which might interest the maintainers. Also a suggestion against your [4/4]: https://sashiko.dev/#/patchset/20260723045718.2052070-1-ridong.chen@linux.dev
On 7/24/2026 8:18 AM, Andrew Morton wrote:
> On Thu, 23 Jul 2026 12:57:14 +0800 Ridong <ridong.chen@linux.dev> wrote:
>
>> Fixes and one cleanup.
>>
>> Patch 1 fixes "swappiness=max": the anon-only test in get_scan_count()
>> sat after the "cannot reclaim anon" check, so when no anon was
>> reclaimable the request fell back to SCAN_FILE and evicted page cache
>> instead.
>>
>> Patch 2 fixes reclaim_store() collapsing every error into -EAGAIN, so
>> callers can no longer tell an invalid argument from a busy interface;
>> propagate the real error code, matching the memcg path.
>>
>> Patch 3 drops the now-unused gfp_mask parameter from __node_reclaim().
>>
>> Patch 4 fixes the same "swappiness=max" issue for MGLRU.
>
> Thanks. AI review might have found several pre-existing issues which
> might interest the maintainers. Also a suggestion against your [4/4]:
>
> https://sashiko.dev/#/patchset/20260723045718.2052070-1-ridong.chen@linux.dev
Hi all, sashiko review:
This is a pre-existing issue, but I noticed that per-node proactive reclaim
fails to reclaim memory if the node's unmapped file or slab pages are below
minimum thresholds, completely ignoring anonymous memory.
In mm/vmscan.c:__node_reclaim():
if (node_pagecache_reclaimable(pgdat) > pgdat->min_unmapped_pages ||
node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B) >
pgdat->min_slab_pages) {
Does this condition incorrectly block proactive reclaim of anonymous memory
by applying legacy zone-reclaim thresholds?
It seems to bypass shrink_node() entirely if file/slab pages are low, even
when sc->proactive is set, which could falsely return -EAGAIN to userspace
for anon-heavy workloads.
Should we add:
if (sc->proactive ||
node_pagecache_reclaimable(pgdat) > pgdat->min_unmapped_pages ||
node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B) > pgdat->min_slab_pages) {
--
Best regards
Ridong
On 7/24/2026 8:18 AM, Andrew Morton wrote: > On Thu, 23 Jul 2026 12:57:14 +0800 Ridong <ridong.chen@linux.dev> wrote: > >> Fixes and one cleanup. >> >> Patch 1 fixes "swappiness=max": the anon-only test in get_scan_count() >> sat after the "cannot reclaim anon" check, so when no anon was >> reclaimable the request fell back to SCAN_FILE and evicted page cache >> instead. >> >> Patch 2 fixes reclaim_store() collapsing every error into -EAGAIN, so >> callers can no longer tell an invalid argument from a busy interface; >> propagate the real error code, matching the memcg path. >> >> Patch 3 drops the now-unused gfp_mask parameter from __node_reclaim(). >> >> Patch 4 fixes the same "swappiness=max" issue for MGLRU. > > Thanks. AI review might have found several pre-existing issues which > might interest the maintainers. Also a suggestion against your [4/4]: > > https://sashiko.dev/#/patchset/20260723045718.2052070-1-ridong.chen@linux.dev Thanks. I will update patch 4/4 as suggested. -- Best regards Ridong
© 2016 - 2026 Red Hat, Inc.