[PATCH v3 0/4] mm/vmscan: fix swappiness=max and clean up per-node proactive reclaim

Ridong posted 4 patches 23 hours ago
mm/vmscan.c | 54 +++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 40 insertions(+), 14 deletions(-)
[PATCH v3 0/4] mm/vmscan: fix swappiness=max and clean up per-node proactive reclaim
Posted by Ridong 23 hours ago
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
Re: [PATCH v3 0/4] mm/vmscan: fix swappiness=max and clean up per-node proactive reclaim
Posted by Andrew Morton 4 hours ago
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
Re: [PATCH v3 0/4] mm/vmscan: fix swappiness=max and clean up per-node proactive reclaim
Posted by Ridong Chen 2 hours ago

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
Re: [PATCH v3 0/4] mm/vmscan: fix swappiness=max and clean up per-node proactive reclaim
Posted by Ridong Chen 2 hours ago

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