* [PATCH 0/2] mm: fix node reclaim swappiness handling @ 2026-07-11 9:11 Ridong Chen 2026-07-11 9:11 ` [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h Ridong Chen 2026-07-11 9:11 ` [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter Ridong Chen 0 siblings, 2 replies; 15+ messages in thread From: Ridong Chen @ 2026-07-11 9:11 UTC (permalink / raw) To: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Barry Song, Yuanchu Xie Cc: linux-mm, cgroups, linux-kernel, ridong.chen, Ridong Chen From: Ridong Chen <chenridong@xiaomi.com> The per-node proactive reclaim interface (/sys/devices/system/node/nodeX/reclaim) accepts a swappiness parameter, but it was silently ignored when CONFIG_MEMCG is disabled. The root cause is that sc_swappiness() had separate implementations for CONFIG_MEMCG and !CONFIG_MEMCG, and the latter never checked proactive_swappiness. Patch 1 moves mem_cgroup_swappiness() from swap.h to memcontrol.h and makes it handle both CONFIG_MEMCG and !CONFIG_MEMCG cases 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. Ridong Chen (2): memcg: move mem_cgroup_swappiness to memcontrol.h mm: vmscan: fix node reclaim ignoring swappiness parameter include/linux/memcontrol.h | 25 +++++++++++++++++++++++-- include/linux/swap.h | 19 ------------------- mm/memcontrol.c | 3 +-- mm/vmscan.c | 17 +++++++---------- 4 files changed, 31 insertions(+), 33 deletions(-) -- 2.43.0 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-11 9:11 [PATCH 0/2] mm: fix node reclaim swappiness handling Ridong Chen @ 2026-07-11 9:11 ` Ridong Chen 2026-07-13 15:08 ` Barry Song 2026-07-11 9:11 ` [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter Ridong Chen 1 sibling, 1 reply; 15+ messages in thread From: Ridong Chen @ 2026-07-11 9:11 UTC (permalink / raw) To: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Barry Song, Yuanchu Xie Cc: linux-mm, cgroups, linux-kernel, ridong.chen, Ridong Chen From: Ridong Chen <chenridong@xiaomi.com> The per-memcg swappiness knob is v1-only; v2 always uses global vm_swappiness and ignores the per-cgroup field. Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper to memcontrol.h where it belongs. No functional change for v1; v2-only kernels drop the unused field. Signed-off-by: Ridong Chen <chenridong@xiaomi.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> --- include/linux/memcontrol.h | 25 +++++++++++++++++++++++-- include/linux/swap.h | 19 ------------------- mm/memcontrol.c | 3 +-- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index e1f46a0016fc..f59614956f96 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -239,8 +239,6 @@ struct mem_cgroup { */ bool oom_group; - int swappiness; - /* memory.events and memory.events.local */ struct cgroup_file events_file; struct cgroup_file events_local_file; @@ -318,6 +316,9 @@ struct mem_cgroup { /* List of events which userspace want to receive */ struct list_head event_list; spinlock_t event_list_lock; + + int swappiness; + #endif /* CONFIG_MEMCG_V1 */ struct mem_cgroup_per_node *nodeinfo[]; @@ -365,6 +366,9 @@ enum objext_flags { #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1) +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ +extern int vm_swappiness; + #ifdef CONFIG_MEMCG /* * After the initialization objcg->memcg is always pointing at @@ -1440,6 +1444,23 @@ static inline void mem_cgroup_flush_workqueue(void) { } static inline int mem_cgroup_init(void) { return 0; } #endif /* CONFIG_MEMCG */ +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); +#endif +} + /* * Extended information for slab objects stored as an array in page->memcg_data * if MEMCG_DATA_OBJEXTS is set. diff --git a/include/linux/swap.h b/include/linux/swap.h index 8f0f68e245ba..2cfe364d66dc 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -372,7 +372,6 @@ extern unsigned long mem_cgroup_shrink_node(struct mem_cgroup *mem, pg_data_t *pgdat, unsigned long *nr_scanned); extern unsigned long shrink_all_memory(unsigned long nr_pages); -extern int vm_swappiness; long remove_mapping(struct address_space *mapping, struct folio *folio); #if defined(CONFIG_SYSFS) && defined(CONFIG_NUMA) @@ -537,25 +536,7 @@ static inline int add_swap_extent(struct swap_info_struct *sis, } #endif /* CONFIG_SWAP */ #ifdef CONFIG_MEMCG -static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg) -{ - /* 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); -} - void lru_reparent_memcg(struct mem_cgroup *memcg, struct mem_cgroup *parent, int nid); -#else -static inline int mem_cgroup_swappiness(struct mem_cgroup *mem) -{ - return READ_ONCE(vm_swappiness); -} #endif #if defined(CONFIG_SWAP) && defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6dc4888a90f3..b61def56c41a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4174,11 +4174,10 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) #endif page_counter_set_high(&memcg->swap, PAGE_COUNTER_MAX); if (parent) { - WRITE_ONCE(memcg->swappiness, mem_cgroup_swappiness(parent)); - page_counter_init(&memcg->memory, &parent->memory, memcg_on_dfl); page_counter_init(&memcg->swap, &parent->swap, false); #ifdef CONFIG_MEMCG_V1 + WRITE_ONCE(memcg->swappiness, mem_cgroup_swappiness(parent)); memcg->memory.track_failcnt = !memcg_on_dfl; WRITE_ONCE(memcg->oom_kill_disable, READ_ONCE(parent->oom_kill_disable)); page_counter_init(&memcg->kmem, &parent->kmem, false); -- 2.43.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-11 9:11 ` [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h Ridong Chen @ 2026-07-13 15:08 ` Barry Song 2026-07-14 1:19 ` Ridong Chen 0 siblings, 1 reply; 15+ messages in thread From: Barry Song @ 2026-07-13 15:08 UTC (permalink / raw) To: Ridong Chen Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: > > From: Ridong Chen <chenridong@xiaomi.com> > > The per-memcg swappiness knob is v1-only; v2 always uses global > vm_swappiness and ignores the per-cgroup field. > > Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper > to memcontrol.h where it belongs. > > No functional change for v1; v2-only kernels drop the unused field. > > Signed-off-by: Ridong Chen <chenridong@xiaomi.com> > Acked-by: Johannes Weiner <hannes@cmpxchg.org> Reviewed-by: Barry Song <baohua@kernel.org> With some nits. > --- [...] > struct mem_cgroup_per_node *nodeinfo[]; > @@ -365,6 +366,9 @@ enum objext_flags { > > #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1) > > +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ > +extern int vm_swappiness; This is a bit unusual. I'm not sure whether mm/swap.h would be a more appropriate place for this. Thanks Barry ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-13 15:08 ` Barry Song @ 2026-07-14 1:19 ` Ridong Chen 2026-07-14 1:43 ` Barry Song 0 siblings, 1 reply; 15+ messages in thread From: Ridong Chen @ 2026-07-14 1:19 UTC (permalink / raw) To: Barry Song Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On 7/13/2026 11:08 PM, Barry Song wrote: > On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: >> >> From: Ridong Chen <chenridong@xiaomi.com> >> >> The per-memcg swappiness knob is v1-only; v2 always uses global >> vm_swappiness and ignores the per-cgroup field. >> >> Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper >> to memcontrol.h where it belongs. >> >> No functional change for v1; v2-only kernels drop the unused field. >> >> Signed-off-by: Ridong Chen <chenridong@xiaomi.com> >> Acked-by: Johannes Weiner <hannes@cmpxchg.org> > > Reviewed-by: Barry Song <baohua@kernel.org> > > With some nits. > >> --- > [...] >> struct mem_cgroup_per_node *nodeinfo[]; >> @@ -365,6 +366,9 @@ enum objext_flags { >> >> #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1) >> >> +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ >> +extern int vm_swappiness; > > This is a bit unusual. I'm not sure whether mm/swap.h would be > a more appropriate place for this. > Thank you for your reply. The vm_swappiness variable is not utilized within mm/swap.c. Furthermore, since memcontrol.h does not include swap.h, retaining the extern int vm_swappiness declaration in mm/swap.h will result in a compilation failure. -- Best regards Ridong ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-14 1:19 ` Ridong Chen @ 2026-07-14 1:43 ` Barry Song 2026-07-14 1:48 ` Barry Song 0 siblings, 1 reply; 15+ messages in thread From: Barry Song @ 2026-07-14 1:43 UTC (permalink / raw) To: Ridong Chen Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On Tue, Jul 14, 2026 at 9:20 AM Ridong Chen <ridong.chen@linux.dev> wrote: > > > > On 7/13/2026 11:08 PM, Barry Song wrote: > > On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: > >> > >> From: Ridong Chen <chenridong@xiaomi.com> > >> > >> The per-memcg swappiness knob is v1-only; v2 always uses global > >> vm_swappiness and ignores the per-cgroup field. > >> > >> Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper > >> to memcontrol.h where it belongs. > >> > >> No functional change for v1; v2-only kernels drop the unused field. > >> > >> Signed-off-by: Ridong Chen <chenridong@xiaomi.com> > >> Acked-by: Johannes Weiner <hannes@cmpxchg.org> > > > > Reviewed-by: Barry Song <baohua@kernel.org> > > > > With some nits. > > > >> --- > > [...] > >> struct mem_cgroup_per_node *nodeinfo[]; > >> @@ -365,6 +366,9 @@ enum objext_flags { > >> > >> #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1) > >> > >> +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ > >> +extern int vm_swappiness; > > > > This is a bit unusual. I'm not sure whether mm/swap.h would be > > a more appropriate place for this. > > > Thank you for your reply. > > The vm_swappiness variable is not utilized within mm/swap.c. > Furthermore, since memcontrol.h does not include swap.h, retaining the > extern int vm_swappiness declaration in mm/swap.h will result in a > compilation failure. If this is the case, it still seems better to keep extern int vm_swappiness in include/linux/swap.h. Then we don't need the comment: /* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ It also makes it clearer that vm_swappiness is an extern variable belonging to the swap module, rather than the memcontrol module. Thanks Barry ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-14 1:43 ` Barry Song @ 2026-07-14 1:48 ` Barry Song 2026-07-14 7:42 ` Ridong Chen 0 siblings, 1 reply; 15+ messages in thread From: Barry Song @ 2026-07-14 1:48 UTC (permalink / raw) To: Ridong Chen Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On Tue, Jul 14, 2026 at 9:43 AM Barry Song <baohua@kernel.org> wrote: > > On Tue, Jul 14, 2026 at 9:20 AM Ridong Chen <ridong.chen@linux.dev> wrote: > > > > > > > > On 7/13/2026 11:08 PM, Barry Song wrote: > > > On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: > > >> > > >> From: Ridong Chen <chenridong@xiaomi.com> > > >> > > >> The per-memcg swappiness knob is v1-only; v2 always uses global > > >> vm_swappiness and ignores the per-cgroup field. > > >> > > >> Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper > > >> to memcontrol.h where it belongs. > > >> > > >> No functional change for v1; v2-only kernels drop the unused field. > > >> > > >> Signed-off-by: Ridong Chen <chenridong@xiaomi.com> > > >> Acked-by: Johannes Weiner <hannes@cmpxchg.org> > > > > > > Reviewed-by: Barry Song <baohua@kernel.org> > > > > > > With some nits. > > > > > >> --- > > > [...] > > >> struct mem_cgroup_per_node *nodeinfo[]; > > >> @@ -365,6 +366,9 @@ enum objext_flags { > > >> > > >> #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1) > > >> > > >> +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ > > >> +extern int vm_swappiness; > > > > > > This is a bit unusual. I'm not sure whether mm/swap.h would be > > > a more appropriate place for this. > > > > > Thank you for your reply. > > > > The vm_swappiness variable is not utilized within mm/swap.c. > > Furthermore, since memcontrol.h does not include swap.h, retaining the > > extern int vm_swappiness declaration in mm/swap.h will result in a > > compilation failure. > > If this is the case, it still seems better to keep > extern int vm_swappiness in include/linux/swap.h. > > Then we don't need the comment: > /* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ > > It also makes it clearer that vm_swappiness is an extern variable > belonging to the swap module, rather than the memcontrol module. BTW, if mem_c_group_swappiness() and vm_swappiness are only used within mm/, could all of these be moved to mm/swap.h and mm/internal.h instead? We are making a big effort to move many unrelated things out of include/linux/swap.h recently. Could you check? https://lore.kernel.org/linux-mm/20260708-ch-swap-series-plus-folio-lru-cleanup-v9-0-2bc72b4f8730@gmail.com/ ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-14 1:48 ` Barry Song @ 2026-07-14 7:42 ` Ridong Chen 2026-07-14 10:21 ` Barry Song 0 siblings, 1 reply; 15+ messages in thread From: Ridong Chen @ 2026-07-14 7:42 UTC (permalink / raw) To: Barry Song Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On 7/14/2026 9:48 AM, Barry Song wrote: > On Tue, Jul 14, 2026 at 9:43 AM Barry Song <baohua@kernel.org> wrote: >> >> On Tue, Jul 14, 2026 at 9:20 AM Ridong Chen <ridong.chen@linux.dev> wrote: >>> >>> >>> >>> On 7/13/2026 11:08 PM, Barry Song wrote: >>>> On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: >>>>> >>>>> From: Ridong Chen <chenridong@xiaomi.com> >>>>> >>>>> The per-memcg swappiness knob is v1-only; v2 always uses global >>>>> vm_swappiness and ignores the per-cgroup field. >>>>> >>>>> Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper >>>>> to memcontrol.h where it belongs. >>>>> >>>>> No functional change for v1; v2-only kernels drop the unused field. >>>>> >>>>> Signed-off-by: Ridong Chen <chenridong@xiaomi.com> >>>>> Acked-by: Johannes Weiner <hannes@cmpxchg.org> >>>> >>>> Reviewed-by: Barry Song <baohua@kernel.org> >>>> >>>> With some nits. >>>> >>>>> --- >>>> [...] >>>>> struct mem_cgroup_per_node *nodeinfo[]; >>>>> @@ -365,6 +366,9 @@ enum objext_flags { >>>>> >>>>> #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1) >>>>> >>>>> +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ >>>>> +extern int vm_swappiness; >>>> >>>> This is a bit unusual. I'm not sure whether mm/swap.h would be >>>> a more appropriate place for this. >>>> >>> Thank you for your reply. >>> >>> The vm_swappiness variable is not utilized within mm/swap.c. >>> Furthermore, since memcontrol.h does not include swap.h, retaining the >>> extern int vm_swappiness declaration in mm/swap.h will result in a >>> compilation failure. >> >> If this is the case, it still seems better to keep >> extern int vm_swappiness in include/linux/swap.h. >> >> Then we don't need the comment: >> /* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ >> >> It also makes it clearer that vm_swappiness is an extern variable >> belonging to the swap module, rather than the memcontrol module. > > BTW, if mem_c_group_swappiness() and vm_swappiness are only used > within mm/, could all of these be moved to mm/swap.h and > mm/internal.h instead? > > We are making a big effort to move many unrelated things out of > include/linux/swap.h recently. Could you check? > > https://lore.kernel.org/linux-mm/20260708-ch-swap-series-plus-folio-lru-cleanup-v9-0-2bc72b4f8730@gmail.com/ Good suggestion. Moving them to mm/internal.h makes sense. Will update in the next version. -- Best regards Ridong ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-14 7:42 ` Ridong Chen @ 2026-07-14 10:21 ` Barry Song 2026-07-14 11:31 ` Ridong Chen 0 siblings, 1 reply; 15+ messages in thread From: Barry Song @ 2026-07-14 10:21 UTC (permalink / raw) To: Ridong Chen Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On Tue, Jul 14, 2026 at 3:43 PM Ridong Chen <ridong.chen@linux.dev> wrote: > > > > On 7/14/2026 9:48 AM, Barry Song wrote: > > On Tue, Jul 14, 2026 at 9:43 AM Barry Song <baohua@kernel.org> wrote: > >> > >> On Tue, Jul 14, 2026 at 9:20 AM Ridong Chen <ridong.chen@linux.dev> wrote: > >>> > >>> > >>> > >>> On 7/13/2026 11:08 PM, Barry Song wrote: > >>>> On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: > >>>>> > >>>>> From: Ridong Chen <chenridong@xiaomi.com> > >>>>> > >>>>> The per-memcg swappiness knob is v1-only; v2 always uses global > >>>>> vm_swappiness and ignores the per-cgroup field. > >>>>> > >>>>> Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper > >>>>> to memcontrol.h where it belongs. > >>>>> > >>>>> No functional change for v1; v2-only kernels drop the unused field. > >>>>> > >>>>> Signed-off-by: Ridong Chen <chenridong@xiaomi.com> > >>>>> Acked-by: Johannes Weiner <hannes@cmpxchg.org> > >>>> > >>>> Reviewed-by: Barry Song <baohua@kernel.org> > >>>> > >>>> With some nits. > >>>> > >>>>> --- > >>>> [...] > >>>>> struct mem_cgroup_per_node *nodeinfo[]; > >>>>> @@ -365,6 +366,9 @@ enum objext_flags { > >>>>> > >>>>> #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1) > >>>>> > >>>>> +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ > >>>>> +extern int vm_swappiness; > >>>> > >>>> This is a bit unusual. I'm not sure whether mm/swap.h would be > >>>> a more appropriate place for this. > >>>> > >>> Thank you for your reply. > >>> > >>> The vm_swappiness variable is not utilized within mm/swap.c. > >>> Furthermore, since memcontrol.h does not include swap.h, retaining the > >>> extern int vm_swappiness declaration in mm/swap.h will result in a > >>> compilation failure. > >> > >> If this is the case, it still seems better to keep > >> extern int vm_swappiness in include/linux/swap.h. > >> > >> Then we don't need the comment: > >> /* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ > >> > >> It also makes it clearer that vm_swappiness is an extern variable > >> belonging to the swap module, rather than the memcontrol module. > > > > BTW, if mem_c_group_swappiness() and vm_swappiness are only used > > within mm/, could all of these be moved to mm/swap.h and > > mm/internal.h instead? > > > > We are making a big effort to move many unrelated things out of > > include/linux/swap.h recently. Could you check? > > > > https://lore.kernel.org/linux-mm/20260708-ch-swap-series-plus-folio-lru-cleanup-v9-0-2bc72b4f8730@gmail.com/ > > Good suggestion. Moving them to mm/internal.h makes sense. Will update > in the next version. Either mm/swap.h or mm/internal.h. vm_swappiness probably belongs in mm/swap.h rather than mm/internal.h, right? BTW, I am not particularly eager about this cleanup; it could be done later as a separate patch. If you decide not to do the cleanup, I think it would be better to leave "extern int vm_swappiness" in include/linux/swap.h rather than declaring it in include/linux/memcontrol.h? Best Regards Barry ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-14 10:21 ` Barry Song @ 2026-07-14 11:31 ` Ridong Chen 2026-07-14 13:46 ` Barry Song 0 siblings, 1 reply; 15+ messages in thread From: Ridong Chen @ 2026-07-14 11:31 UTC (permalink / raw) To: Barry Song Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On 7/14/2026 6:21 PM, Barry Song wrote: > On Tue, Jul 14, 2026 at 3:43 PM Ridong Chen <ridong.chen@linux.dev> wrote: >> >> >> >> On 7/14/2026 9:48 AM, Barry Song wrote: >>> On Tue, Jul 14, 2026 at 9:43 AM Barry Song <baohua@kernel.org> wrote: >>>> >>>> On Tue, Jul 14, 2026 at 9:20 AM Ridong Chen <ridong.chen@linux.dev> wrote: >>>>> >>>>> >>>>> >>>>> On 7/13/2026 11:08 PM, Barry Song wrote: >>>>>> On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: >>>>>>> >>>>>>> From: Ridong Chen <chenridong@xiaomi.com> >>>>>>> >>>>>>> The per-memcg swappiness knob is v1-only; v2 always uses global >>>>>>> vm_swappiness and ignores the per-cgroup field. >>>>>>> >>>>>>> Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper >>>>>>> to memcontrol.h where it belongs. >>>>>>> >>>>>>> No functional change for v1; v2-only kernels drop the unused field. >>>>>>> >>>>>>> Signed-off-by: Ridong Chen <chenridong@xiaomi.com> >>>>>>> Acked-by: Johannes Weiner <hannes@cmpxchg.org> >>>>>> >>>>>> Reviewed-by: Barry Song <baohua@kernel.org> >>>>>> >>>>>> With some nits. >>>>>> >>>>>>> --- >>>>>> [...] >>>>>>> struct mem_cgroup_per_node *nodeinfo[]; >>>>>>> @@ -365,6 +366,9 @@ enum objext_flags { >>>>>>> >>>>>>> #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1) >>>>>>> >>>>>>> +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ >>>>>>> +extern int vm_swappiness; >>>>>> >>>>>> This is a bit unusual. I'm not sure whether mm/swap.h would be >>>>>> a more appropriate place for this. >>>>>> >>>>> Thank you for your reply. >>>>> >>>>> The vm_swappiness variable is not utilized within mm/swap.c. >>>>> Furthermore, since memcontrol.h does not include swap.h, retaining the >>>>> extern int vm_swappiness declaration in mm/swap.h will result in a >>>>> compilation failure. >>>> >>>> If this is the case, it still seems better to keep >>>> extern int vm_swappiness in include/linux/swap.h. >>>> >>>> Then we don't need the comment: >>>> /* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ >>>> >>>> It also makes it clearer that vm_swappiness is an extern variable >>>> belonging to the swap module, rather than the memcontrol module. >>> >>> BTW, if mem_c_group_swappiness() and vm_swappiness are only used >>> within mm/, could all of these be moved to mm/swap.h and >>> mm/internal.h instead? >>> >>> We are making a big effort to move many unrelated things out of >>> include/linux/swap.h recently. Could you check? >>> >>> https://lore.kernel.org/linux-mm/20260708-ch-swap-series-plus-folio-lru-cleanup-v9-0-2bc72b4f8730@gmail.com/ >> >> Good suggestion. Moving them to mm/internal.h makes sense. Will update >> in the next version. > > Either mm/swap.h or mm/internal.h. > vm_swappiness probably belongs in mm/swap.h rather than > mm/internal.h, right? > > BTW, I am not particularly eager about this cleanup; > it could be done later as a separate patch. > > If you decide not to do the cleanup, I think it would be better to > leave "extern int vm_swappiness" in include/linux/swap.h rather than > declaring it in include/linux/memcontrol.h? I noticed that some swap-related macros are already defined in mm/internal.h, so I'm planning to place the code right after them for better grouping. Does that work for you? ``` ... #define MEMCG_RECLAIM_MAY_SWAP (1 << 1) #define MEMCG_RECLAIM_PROACTIVE (1 << 2) #define MIN_SWAPPINESS 0 #define MAX_SWAPPINESS 200 /* Just reclaim from anon folios in proactive memory reclaim */ #define SWAPPINESS_ANON_ONLY (MAX_SWAPPINESS + 1) 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); #endif } ... ``` -- Best regards Ridong ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h 2026-07-14 11:31 ` Ridong Chen @ 2026-07-14 13:46 ` Barry Song 0 siblings, 0 replies; 15+ messages in thread From: Barry Song @ 2026-07-14 13:46 UTC (permalink / raw) To: Ridong Chen Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On Tue, Jul 14, 2026 at 7:31 PM Ridong Chen <ridong.chen@linux.dev> wrote: [...] > >>>> > >>>> If this is the case, it still seems better to keep > >>>> extern int vm_swappiness in include/linux/swap.h. > >>>> > >>>> Then we don't need the comment: > >>>> /* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */ > >>>> > >>>> It also makes it clearer that vm_swappiness is an extern variable > >>>> belonging to the swap module, rather than the memcontrol module. > >>> > >>> BTW, if mem_c_group_swappiness() and vm_swappiness are only used > >>> within mm/, could all of these be moved to mm/swap.h and > >>> mm/internal.h instead? > >>> > >>> We are making a big effort to move many unrelated things out of > >>> include/linux/swap.h recently. Could you check? > >>> > >>> https://lore.kernel.org/linux-mm/20260708-ch-swap-series-plus-folio-lru-cleanup-v9-0-2bc72b4f8730@gmail.com/ > >> > >> Good suggestion. Moving them to mm/internal.h makes sense. Will update > >> in the next version. > > > > Either mm/swap.h or mm/internal.h. > > vm_swappiness probably belongs in mm/swap.h rather than > > mm/internal.h, right? > > > > BTW, I am not particularly eager about this cleanup; > > it could be done later as a separate patch. > > > > If you decide not to do the cleanup, I think it would be better to > > leave "extern int vm_swappiness" in include/linux/swap.h rather than > > declaring it in include/linux/memcontrol.h? > I noticed that some swap-related macros are already defined in > mm/internal.h, so I'm planning to place the code right after them for > better grouping. Does that work for you? We also have mm/swap.h, which is dedicated to exporting swap-related things. Is it a better place than mm/internal.h? > > ``` > ... > #define MEMCG_RECLAIM_MAY_SWAP (1 << 1) > #define MEMCG_RECLAIM_PROACTIVE (1 << 2) > #define MIN_SWAPPINESS 0 > #define MAX_SWAPPINESS 200 > > /* Just reclaim from anon folios in proactive memory reclaim */ > #define SWAPPINESS_ANON_ONLY (MAX_SWAPPINESS + 1) > > 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); > #endif > } > ... > ``` ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter 2026-07-11 9:11 [PATCH 0/2] mm: fix node reclaim swappiness handling Ridong Chen 2026-07-11 9:11 ` [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h Ridong Chen @ 2026-07-11 9:11 ` Ridong Chen 2026-07-13 11:28 ` Johannes Weiner 2026-07-13 15:16 ` Barry Song 1 sibling, 2 replies; 15+ messages in thread From: Ridong Chen @ 2026-07-11 9:11 UTC (permalink / raw) To: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Barry Song, Yuanchu Xie Cc: linux-mm, cgroups, linux-kernel, ridong.chen, Ridong Chen From: Ridong Chen <chenridong@xiaomi.com> sc_swappiness() had two separate definitions depending on CONFIG_MEMCG. The !CONFIG_MEMCG variant simply returned vm_swappiness, ignoring the proactive_swappiness value passed through scan_control. This caused the swappiness parameter written to /sys/devices/system/node/nodeX/reclaim to have no effect when CONFIG_MEMCG is disabled. Fix this by consolidating sc_swappiness() into a single definition that checks sc->proactive_swappiness first, then falls back to mem_cgroup_swappiness() which already handles both CONFIG_MEMCG and !CONFIG_MEMCG. Before fix (swappiness=max ignored, mostly file pages reclaimed): # cat /proc/sys/vm/swappiness 60 # cat /proc/vmstat | grep pgsteal pgsteal_kswapd 0 pgsteal_direct 0 pgsteal_khugepaged 0 pgsteal_proactive 1840 pgsteal_anon 25 pgsteal_file 1815 # echo "64M swappiness=max" > /sys/devices/system/node/node0/reclaim # cat /proc/vmstat | grep pgsteal pgsteal_kswapd 0 pgsteal_direct 0 pgsteal_khugepaged 0 pgsteal_proactive 18013 pgsteal_anon 337 pgsteal_file 17676 After fix (swappiness=max honored, anon pages reclaimed as expected): # cat /proc/vmstat | grep pgsteal pgsteal_kswapd 0 pgsteal_direct 0 pgsteal_khugepaged 0 pgsteal_proactive 0 pgsteal_anon 0 pgsteal_file 0 # echo "64M swappiness=max" > /sys/devices/system/node/node0/reclaim # cat /proc/vmstat | grep pgsteal pgsteal_kswapd 0 pgsteal_direct 0 pgsteal_khugepaged 0 pgsteal_proactive 16283 pgsteal_anon 16283 pgsteal_file 0 Fixes: 68cd9050d871 ("mm: add swappiness= arg to memory.reclaim") Signed-off-by: Ridong Chen <chenridong@xiaomi.com> --- mm/vmscan.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 35c3bb15ae96..5271bd023c1d 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -198,6 +198,13 @@ struct scan_control { */ int vm_swappiness = 60; +static int sc_swappiness(struct scan_control *sc, struct mem_cgroup *memcg) +{ + if (sc->proactive && sc->proactive_swappiness) + return *sc->proactive_swappiness; + return mem_cgroup_swappiness(memcg); +} + #ifdef CONFIG_MEMCG /* Returns true for reclaim through cgroup limits or cgroup interfaces. */ @@ -239,12 +246,6 @@ static bool writeback_throttling_sane(struct scan_control *sc) return false; } -static int sc_swappiness(struct scan_control *sc, struct mem_cgroup *memcg) -{ - if (sc->proactive && sc->proactive_swappiness) - return *sc->proactive_swappiness; - return mem_cgroup_swappiness(memcg); -} #else static bool cgroup_reclaim(struct scan_control *sc) { @@ -261,10 +262,6 @@ static bool writeback_throttling_sane(struct scan_control *sc) return true; } -static int sc_swappiness(struct scan_control *sc, struct mem_cgroup *memcg) -{ - return READ_ONCE(vm_swappiness); -} #endif static void set_task_reclaim_state(struct task_struct *task, -- 2.43.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter 2026-07-11 9:11 ` [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter Ridong Chen @ 2026-07-13 11:28 ` Johannes Weiner 2026-07-14 7:58 ` Ridong Chen 2026-07-13 15:16 ` Barry Song 1 sibling, 1 reply; 15+ messages in thread From: Johannes Weiner @ 2026-07-13 11:28 UTC (permalink / raw) To: Ridong Chen Cc: Andrew Morton, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Barry Song, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On Sat, Jul 11, 2026 at 05:11:57PM +0800, Ridong Chen wrote: > From: Ridong Chen <chenridong@xiaomi.com> > > sc_swappiness() had two separate definitions depending on > CONFIG_MEMCG. The !CONFIG_MEMCG variant simply returned > vm_swappiness, ignoring the proactive_swappiness value passed > through scan_control. This caused the swappiness parameter > written to /sys/devices/system/node/nodeX/reclaim to have no > effect when CONFIG_MEMCG is disabled. > > Fix this by consolidating sc_swappiness() into a single definition > that checks sc->proactive_swappiness first, then falls back to > mem_cgroup_swappiness() which already handles both CONFIG_MEMCG > and !CONFIG_MEMCG. > > Before fix (swappiness=max ignored, mostly file pages reclaimed): > > # cat /proc/sys/vm/swappiness > 60 > # cat /proc/vmstat | grep pgsteal > pgsteal_kswapd 0 > pgsteal_direct 0 > pgsteal_khugepaged 0 > pgsteal_proactive 1840 > pgsteal_anon 25 > pgsteal_file 1815 > # echo "64M swappiness=max" > /sys/devices/system/node/node0/reclaim > # cat /proc/vmstat | grep pgsteal > pgsteal_kswapd 0 > pgsteal_direct 0 > pgsteal_khugepaged 0 > pgsteal_proactive 18013 > pgsteal_anon 337 > pgsteal_file 17676 > > After fix (swappiness=max honored, anon pages reclaimed as expected): > > # cat /proc/vmstat | grep pgsteal > pgsteal_kswapd 0 > pgsteal_direct 0 > pgsteal_khugepaged 0 > pgsteal_proactive 0 > pgsteal_anon 0 > pgsteal_file 0 > # echo "64M swappiness=max" > /sys/devices/system/node/node0/reclaim > # cat /proc/vmstat | grep pgsteal > pgsteal_kswapd 0 > pgsteal_direct 0 > pgsteal_khugepaged 0 > pgsteal_proactive 16283 > pgsteal_anon 16283 > pgsteal_file 0 > > Fixes: 68cd9050d871 ("mm: add swappiness= arg to memory.reclaim") > Signed-off-by: Ridong Chen <chenridong@xiaomi.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> I would put Fixes: b980077899ea ("mm: introduce per-node proactive reclaim interface") instead. It wasn't a bug before that. Probably warrants a stable CC for 6.16 as well since this is pretty user-visible breakage. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter 2026-07-13 11:28 ` Johannes Weiner @ 2026-07-14 7:58 ` Ridong Chen 0 siblings, 0 replies; 15+ messages in thread From: Ridong Chen @ 2026-07-14 7:58 UTC (permalink / raw) To: Johannes Weiner Cc: Andrew Morton, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Barry Song, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen Hi Johannes, > Probably warrants a stable CC for 6.16 as well since this is pretty > user-visible breakage. Thanks for the stable tag suggestion. I checked the commit baseline: git name-rev b980077899ea b980077899ea tags/v6.17-rc1 So this should be tagged for 6.17+ rather than 6.16. I'll add: Cc: stable@vger.kernel.org # 6.17+ -- Best regards Ridong ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter 2026-07-11 9:11 ` [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter Ridong Chen 2026-07-13 11:28 ` Johannes Weiner @ 2026-07-13 15:16 ` Barry Song 2026-07-14 1:10 ` Ridong Chen 1 sibling, 1 reply; 15+ messages in thread From: Barry Song @ 2026-07-13 15:16 UTC (permalink / raw) To: Ridong Chen Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: > > From: Ridong Chen <chenridong@xiaomi.com> > > sc_swappiness() had two separate definitions depending on > CONFIG_MEMCG. The !CONFIG_MEMCG variant simply returned > vm_swappiness, ignoring the proactive_swappiness value passed > through scan_control. This caused the swappiness parameter > written to /sys/devices/system/node/nodeX/reclaim to have no > effect when CONFIG_MEMCG is disabled. > > Fix this by consolidating sc_swappiness() into a single definition > that checks sc->proactive_swappiness first, then falls back to > mem_cgroup_swappiness() which already handles both CONFIG_MEMCG > and !CONFIG_MEMCG. > > Before fix (swappiness=max ignored, mostly file pages reclaimed): > > # cat /proc/sys/vm/swappiness > 60 > # cat /proc/vmstat | grep pgsteal > pgsteal_kswapd 0 > pgsteal_direct 0 > pgsteal_khugepaged 0 > pgsteal_proactive 1840 > pgsteal_anon 25 > pgsteal_file 1815 > # echo "64M swappiness=max" > /sys/devices/system/node/node0/reclaim > # cat /proc/vmstat | grep pgsteal > pgsteal_kswapd 0 > pgsteal_direct 0 > pgsteal_khugepaged 0 > pgsteal_proactive 18013 > pgsteal_anon 337 > pgsteal_file 17676 > > After fix (swappiness=max honored, anon pages reclaimed as expected): > > # cat /proc/vmstat | grep pgsteal > pgsteal_kswapd 0 > pgsteal_direct 0 > pgsteal_khugepaged 0 > pgsteal_proactive 0 > pgsteal_anon 0 > pgsteal_file 0 > # echo "64M swappiness=max" > /sys/devices/system/node/node0/reclaim > # cat /proc/vmstat | grep pgsteal > pgsteal_kswapd 0 > pgsteal_direct 0 > pgsteal_khugepaged 0 > pgsteal_proactive 16283 > pgsteal_anon 16283 > pgsteal_file 0 > > Fixes: 68cd9050d871 ("mm: add swappiness= arg to memory.reclaim") > Signed-off-by: Ridong Chen <chenridong@xiaomi.com> Reviewed-by: Barry Song <baohua@kernel.org> As pointed out by Johannes, the Fixes tag should be b980077899ea. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter 2026-07-13 15:16 ` Barry Song @ 2026-07-14 1:10 ` Ridong Chen 0 siblings, 0 replies; 15+ messages in thread From: Ridong Chen @ 2026-07-14 1:10 UTC (permalink / raw) To: Barry Song Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt, Muchun Song, Chris Li, Kairui Song, David Hildenbrand, Yuanchu Xie, linux-mm, cgroups, linux-kernel, Ridong Chen On 7/13/2026 11:16 PM, Barry Song wrote: > On Sat, Jul 11, 2026 at 5:12 PM Ridong Chen <ridong.chen@linux.dev> wrote: >> >> From: Ridong Chen <chenridong@xiaomi.com> >> >> sc_swappiness() had two separate definitions depending on >> CONFIG_MEMCG. The !CONFIG_MEMCG variant simply returned >> vm_swappiness, ignoring the proactive_swappiness value passed >> through scan_control. This caused the swappiness parameter >> written to /sys/devices/system/node/nodeX/reclaim to have no >> effect when CONFIG_MEMCG is disabled. >> >> Fix this by consolidating sc_swappiness() into a single definition >> that checks sc->proactive_swappiness first, then falls back to >> mem_cgroup_swappiness() which already handles both CONFIG_MEMCG >> and !CONFIG_MEMCG. >> >> Before fix (swappiness=max ignored, mostly file pages reclaimed): >> >> # cat /proc/sys/vm/swappiness >> 60 >> # cat /proc/vmstat | grep pgsteal >> pgsteal_kswapd 0 >> pgsteal_direct 0 >> pgsteal_khugepaged 0 >> pgsteal_proactive 1840 >> pgsteal_anon 25 >> pgsteal_file 1815 >> # echo "64M swappiness=max" > /sys/devices/system/node/node0/reclaim >> # cat /proc/vmstat | grep pgsteal >> pgsteal_kswapd 0 >> pgsteal_direct 0 >> pgsteal_khugepaged 0 >> pgsteal_proactive 18013 >> pgsteal_anon 337 >> pgsteal_file 17676 >> >> After fix (swappiness=max honored, anon pages reclaimed as expected): >> >> # cat /proc/vmstat | grep pgsteal >> pgsteal_kswapd 0 >> pgsteal_direct 0 >> pgsteal_khugepaged 0 >> pgsteal_proactive 0 >> pgsteal_anon 0 >> pgsteal_file 0 >> # echo "64M swappiness=max" > /sys/devices/system/node/node0/reclaim >> # cat /proc/vmstat | grep pgsteal >> pgsteal_kswapd 0 >> pgsteal_direct 0 >> pgsteal_khugepaged 0 >> pgsteal_proactive 16283 >> pgsteal_anon 16283 >> pgsteal_file 0 >> >> Fixes: 68cd9050d871 ("mm: add swappiness= arg to memory.reclaim") >> Signed-off-by: Ridong Chen <chenridong@xiaomi.com> > > Reviewed-by: Barry Song <baohua@kernel.org> > > As pointed out by Johannes, the Fixes tag should be > b980077899ea. Hi Johannes and Barry, Thank you for your review. You are right, will update it. -- Best regards Ridong ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2026-07-14 13:47 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-07-11 9:11 [PATCH 0/2] mm: fix node reclaim swappiness handling Ridong Chen 2026-07-11 9:11 ` [PATCH 1/2] memcg: move mem_cgroup_swappiness to memcontrol.h Ridong Chen 2026-07-13 15:08 ` Barry Song 2026-07-14 1:19 ` Ridong Chen 2026-07-14 1:43 ` Barry Song 2026-07-14 1:48 ` Barry Song 2026-07-14 7:42 ` Ridong Chen 2026-07-14 10:21 ` Barry Song 2026-07-14 11:31 ` Ridong Chen 2026-07-14 13:46 ` Barry Song 2026-07-11 9:11 ` [PATCH 2/2] mm: vmscan: fix node reclaim ignoring swappiness parameter Ridong Chen 2026-07-13 11:28 ` Johannes Weiner 2026-07-14 7:58 ` Ridong Chen 2026-07-13 15:16 ` Barry Song 2026-07-14 1:10 ` Ridong Chen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox