Re: [PATCH -v4 0/2] mm: vmscan: fix node reclaim ignoring swappiness parameter

Andrew Morton <[email protected]> Thu, 23 Jul 2026 17:34:18 -0700
Newsgroups org.kernel.vger.cgroups,org.kernel.vger.linux-kernel,org.kvack.linux-mm
Message-ID <[email protected]>
On Thu, 23 Jul 2026 11:24:32 +0800 Ridong <[email protected]> wrote:

> From: Ridong Chen <[email protected]>
> 
> The per-node proactive reclaim interface
> (/sys/devices/system/node/nodeX/reclaim) accepts a swappiness parameter,
> but it is silently ignored when CONFIG_MEMCG is disabled. The root cause
> is that sc_swappiness() has separate implementations for CONFIG_MEMCG and
> !CONFIG_MEMCG, and the latter never checks proactive_swappiness.
> 
> Patch 1 moves mem_cgroup_swappiness() and vm_swappiness out of the public
> include/linux/swap.h into the mm-private mm/swap.h, and makes the helper
> handle both CONFIG_MEMCG and !CONFIG_MEMCG in a single inline function.
> This is a prerequisite for unifying sc_swappiness().
> 
> Patch 2 consolidates sc_swappiness() into a single definition that works
> regardless of CONFIG_MEMCG, fixing the node reclaim swappiness bug.

Thanks, I updated mm.git to this version.

> v3 -> v4:
>  - READ_ONCE() was missed when reading memcg->swappiness, add it back.
> 
> v2 -> v3:
>  - Simplify mem_cgroup_swappiness as suggested by Johannes.  
>  - Rebase on the next-20260722

Here's how v3 plus v4 altered mm.git:


 mm/swap.h |   15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

--- a/mm/swap.h~b
+++ a/mm/swap.h
@@ -105,18 +105,11 @@ extern int vm_swappiness;
 static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg)
 {
 #ifdef CONFIG_MEMCG_V1
-	/* Cgroup2 doesn't have per-cgroup swappiness */
-	if (cgroup_subsys_on_dfl(memory_cgrp_subsys))
-		return READ_ONCE(vm_swappiness);
-
-	/* root ? */
-	if (mem_cgroup_disabled() || mem_cgroup_is_root(memcg))
-		return READ_ONCE(vm_swappiness);
-
-	return READ_ONCE(memcg->swappiness);
-#else
-	return READ_ONCE(vm_swappiness);
+	if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) &&
+	    !mem_cgroup_disabled() && !mem_cgroup_is_root(memcg))
+		return READ_ONCE(memcg->swappiness);
 #endif
+	return READ_ONCE(vm_swappiness);
 }
 
 #ifdef CONFIG_SWAP
_