* [PATCH v1 1/2] mm: multi-gen LRU: use mem_cgroup_lruvec() in get_lruvec() @ 2026-10-21 23:56 Siddharth Chintamaneni 2026-10-21 23:56 ` [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() Siddharth Chintamaneni 2026-10-26 2:31 ` [PATCH v1 1/2] mm: multi-gen LRU: use mem_cgroup_lruvec() in get_lruvec() Baolin Wang 0 siblings, 2 replies; 6+ messages in thread From: Siddharth Chintamaneni @ 2026-10-21 23:56 UTC (permalink / raw) To: akpm, hannes Cc: david, mhocko, qi.zheng, shakeel.butt, ljs, kasong, baohua, axelrasmussen, yuanchu, weixugc, baoquan.he, baolin.wang, yuzhao, linux-mm, linux-kernel, apais, rlmenge, Siddharth Chintamaneni, Hardik Garg Andrew Morton noted that get_lruvec() has the same pattern as lru_gen_shrink_node(): when memcg is disabled on the command line (cgroup_disable=memory), it returns &pgdat->__lruvec directly instead of going through mem_cgroup_lruvec(), which initializes lruvec->pgdat. In practice all callers of get_lruvec() run after kswapd_init() has already initialized pgdat->__lruvec.pgdat on every N_MEMORY node, so this is not a runtime bug. Have get_lruvec() delegate to mem_cgroup_lruvec() directly. Signed-off-by: Siddharth Chintamaneni <sidchintamaneni@gmail.com> Signed-off-by: Hardik Garg <hargar@linux.microsoft.com> --- mm/vmscan.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 0c57e4f1eb15..99e9f07fa2e1 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2745,20 +2745,9 @@ static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid) { struct pglist_data *pgdat = NODE_DATA(nid); -#ifdef CONFIG_MEMCG - if (memcg) { - struct lruvec *lruvec = &memcg->nodeinfo[nid]->lruvec; - - /* see the comment in mem_cgroup_lruvec() */ - if (!lruvec->pgdat) - lruvec->pgdat = pgdat; - - return lruvec; - } -#endif - VM_WARN_ON_ONCE(!mem_cgroup_disabled()); + VM_WARN_ON_ONCE(!memcg && !mem_cgroup_disabled()); - return &pgdat->__lruvec; + return mem_cgroup_lruvec(memcg, pgdat); } static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc) -- 2.45.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() 2026-10-21 23:56 [PATCH v1 1/2] mm: multi-gen LRU: use mem_cgroup_lruvec() in get_lruvec() Siddharth Chintamaneni @ 2026-10-21 23:56 ` Siddharth Chintamaneni 2026-10-26 2:35 ` Baolin Wang 2026-10-26 10:00 ` Barry Song 2026-10-26 2:31 ` [PATCH v1 1/2] mm: multi-gen LRU: use mem_cgroup_lruvec() in get_lruvec() Baolin Wang 1 sibling, 2 replies; 6+ messages in thread From: Siddharth Chintamaneni @ 2026-10-21 23:56 UTC (permalink / raw) To: akpm, hannes Cc: david, mhocko, qi.zheng, shakeel.butt, ljs, kasong, baohua, axelrasmussen, yuanchu, weixugc, baoquan.he, baolin.wang, yuzhao, linux-mm, linux-kernel, apais, rlmenge, Siddharth Chintamaneni, Hardik Garg get_lruvec() was originally introduced in commit ec1c86b25f4b ("mm: multi-gen LRU: groundwork") to guard against NULL NODE_DATA(nid) on uninitialized NUMA nodes (`return pgdat ? &pgdat->__lruvec : NULL;`). After commit 09f49dca570a ("mm: handle uninitialized numa nodes gracefully") and commit 931b6a8b36a2 ("mm: multi-gen LRU: remove NULL checks on NODE_DATA()"), that NULL check was removed, leaving get_lruvec() as a thin wrapper around mem_cgroup_lruvec(). Remove get_lruvec() and call mem_cgroup_lruvec() directly at all call sites. Cc: Barry Song <baohua@kernel.org> Signed-off-by: Siddharth Chintamaneni <sidchintamaneni@gmail.com> Signed-off-by: Hardik Garg <hargar@linux.microsoft.com> --- mm/vmscan.c | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 99e9f07fa2e1..5767b94fd8e8 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2741,15 +2741,6 @@ static bool should_clear_pmd_young(void) #define get_memcg_gen(seq) ((seq) % MEMCG_NR_GENS) #define get_memcg_bin(bin) ((bin) % MEMCG_NR_BINS) -static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid) -{ - struct pglist_data *pgdat = NODE_DATA(nid); - - VM_WARN_ON_ONCE(!memcg && !mem_cgroup_disabled()); - - return mem_cgroup_lruvec(memcg, pgdat); -} - static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc) { struct mem_cgroup *memcg = lruvec_memcg(lruvec); @@ -2942,7 +2933,7 @@ void lru_gen_add_mm(struct mm_struct *mm) spin_lock(&mm_list->lock); for_each_node_state(nid, N_MEMORY) { - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); struct lru_gen_mm_state *mm_state = get_mm_state(lruvec); /* the first addition since the last iteration */ @@ -2972,7 +2963,7 @@ void lru_gen_del_mm(struct mm_struct *mm) spin_lock(&mm_list->lock); for_each_node(nid) { - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); struct lru_gen_mm_state *mm_state = get_mm_state(lruvec); /* where the current iteration continues after */ @@ -4424,7 +4415,7 @@ void lru_gen_online_memcg(struct mem_cgroup *memcg) for_each_node(nid) { struct pglist_data *pgdat = NODE_DATA(nid); - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat); spin_lock_irq(&pgdat->memcg_lru.lock); @@ -4446,7 +4437,7 @@ void lru_gen_offline_memcg(struct mem_cgroup *memcg) int nid; for_each_node(nid) { - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); lru_gen_rotate_memcg(lruvec, MEMCG_LRU_OLD); } @@ -4459,7 +4450,7 @@ void lru_gen_release_memcg(struct mem_cgroup *memcg) for_each_node(nid) { struct pglist_data *pgdat = NODE_DATA(nid); - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat); spin_lock_irq(&pgdat->memcg_lru.lock); @@ -4480,7 +4471,7 @@ void lru_gen_release_memcg(struct mem_cgroup *memcg) void lru_gen_soft_reclaim(struct mem_cgroup *memcg, int nid) { - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); /* see the comment on MEMCG_NR_GENS */ if (READ_ONCE(lruvec->lrugen.seg) != MEMCG_LRU_HEAD) @@ -4489,7 +4480,7 @@ void lru_gen_soft_reclaim(struct mem_cgroup *memcg, int nid) bool recheck_lru_gen_max_memcg(struct mem_cgroup *memcg, int nid) { - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); int type; for (type = 0; type < ANON_AND_FILE; type++) { @@ -4536,7 +4527,7 @@ static void try_to_inc_max_seq_nowalk(struct mem_cgroup *memcg, */ void max_lru_gen_memcg(struct mem_cgroup *memcg, int nid) { - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); int type; for (type = 0; type < ANON_AND_FILE; type++) { @@ -4613,8 +4604,8 @@ void lru_gen_reparent_memcg(struct mem_cgroup *memcg, struct mem_cgroup *parent, struct zone *zone; enum lru_list lru; - child_lruvec = get_lruvec(memcg, nid); - parent_lruvec = get_lruvec(parent, nid); + child_lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); + parent_lruvec = mem_cgroup_lruvec(parent, NODE_DATA(nid)); for_each_managed_zone_pgdat(zone, NODE_DATA(nid), zid, MAX_NR_ZONES - 1) for (type = 0; type < ANON_AND_FILE; type++) @@ -5370,7 +5361,7 @@ static void lru_gen_change_state(bool enabled) int nid; for_each_node(nid) { - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); lruvec_lock_irq(lruvec); @@ -5501,7 +5492,7 @@ static void *lru_gen_seq_start(struct seq_file *m, loff_t *pos) for_each_node_state(nid, N_MEMORY) { if (!nr_to_skip--) - return get_lruvec(memcg, nid); + return mem_cgroup_lruvec(memcg, NODE_DATA(nid)); } } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL))); @@ -5533,7 +5524,7 @@ static void *lru_gen_seq_next(struct seq_file *m, void *v, loff_t *pos) nid = first_memory_node; } - return get_lruvec(memcg, nid); + return mem_cgroup_lruvec(memcg, NODE_DATA(nid)); } static void lru_gen_seq_show_full(struct seq_file *m, struct lruvec *lruvec, @@ -5715,7 +5706,7 @@ static int run_cmd(char cmd, u64 memcg_id, int nid, unsigned long seq, goto done; sc->target_mem_cgroup = memcg; - lruvec = get_lruvec(memcg, nid); + lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); if (swappiness < MIN_SWAPPINESS) swappiness = get_swappiness(lruvec, sc); @@ -5899,7 +5890,7 @@ void lru_gen_exit_memcg(struct mem_cgroup *memcg) VM_WARN_ON_ONCE(mm_list && !list_empty(&mm_list->fifo)); for_each_node(nid) { - struct lruvec *lruvec = get_lruvec(memcg, nid); + struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); struct lru_gen_mm_state *mm_state = get_mm_state(lruvec); VM_WARN_ON_ONCE(memchr_inv(lruvec->lrugen.nr_pages, 0, -- 2.45.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() 2026-10-21 23:56 ` [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() Siddharth Chintamaneni @ 2026-10-26 2:35 ` Baolin Wang 2026-10-26 10:00 ` Barry Song 1 sibling, 0 replies; 6+ messages in thread From: Baolin Wang @ 2026-10-26 2:35 UTC (permalink / raw) To: Siddharth Chintamaneni, akpm, hannes Cc: david, mhocko, qi.zheng, shakeel.butt, ljs, kasong, baohua, axelrasmussen, yuanchu, weixugc, baoquan.he, yuzhao, linux-mm, linux-kernel, apais, rlmenge, Hardik Garg On 10/22/26 7:56 AM, Siddharth Chintamaneni wrote: > get_lruvec() was originally introduced in commit ec1c86b25f4b ("mm: > multi-gen LRU: groundwork") to guard against NULL NODE_DATA(nid) on > uninitialized NUMA nodes (`return pgdat ? &pgdat->__lruvec : NULL;`). > After commit 09f49dca570a ("mm: handle uninitialized numa nodes > gracefully") and commit 931b6a8b36a2 ("mm: multi-gen LRU: remove NULL > checks on NODE_DATA()"), that NULL check was removed, leaving > get_lruvec() as a thin wrapper around mem_cgroup_lruvec(). > > Remove get_lruvec() and call mem_cgroup_lruvec() directly at all call > sites. > > Cc: Barry Song <baohua@kernel.org> > Signed-off-by: Siddharth Chintamaneni <sidchintamaneni@gmail.com> > Signed-off-by: Hardik Garg <hargar@linux.microsoft.com> > --- LGTM. Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() 2026-10-21 23:56 ` [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() Siddharth Chintamaneni 2026-10-26 2:35 ` Baolin Wang @ 2026-10-26 10:00 ` Barry Song 2026-10-26 20:28 ` Siddharth Chintamaneni 1 sibling, 1 reply; 6+ messages in thread From: Barry Song @ 2026-10-26 10:00 UTC (permalink / raw) To: Siddharth Chintamaneni Cc: akpm, hannes, david, mhocko, qi.zheng, shakeel.butt, ljs, kasong, axelrasmussen, yuanchu, weixugc, baoquan.he, baolin.wang, yuzhao, linux-mm, linux-kernel, apais, rlmenge, Hardik Garg On Thu, Oct 22, 2026 at 7:56 AM Siddharth Chintamaneni <sidchintamaneni@gmail.com> wrote: > > get_lruvec() was originally introduced in commit ec1c86b25f4b ("mm: > multi-gen LRU: groundwork") to guard against NULL NODE_DATA(nid) on > uninitialized NUMA nodes (`return pgdat ? &pgdat->__lruvec : NULL;`). > After commit 09f49dca570a ("mm: handle uninitialized numa nodes > gracefully") and commit 931b6a8b36a2 ("mm: multi-gen LRU: remove NULL > checks on NODE_DATA()"), that NULL check was removed, leaving > get_lruvec() as a thin wrapper around mem_cgroup_lruvec(). > > Remove get_lruvec() and call mem_cgroup_lruvec() directly at all call > sites. > > Cc: Barry Song <baohua@kernel.org> I guess the correct tag should be "Suggested-by" here? > Signed-off-by: Siddharth Chintamaneni <sidchintamaneni@gmail.com> > Signed-off-by: Hardik Garg <hargar@linux.microsoft.com> > --- Your patchset organization is a bit unusual. Patch 2/2 is sent as a reply to patch 1/2. I think adding a cover letter would help you organize the series properly? Thanks Barry ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() 2026-10-26 10:00 ` Barry Song @ 2026-10-26 20:28 ` Siddharth Chintamaneni 0 siblings, 0 replies; 6+ messages in thread From: Siddharth Chintamaneni @ 2026-10-26 20:28 UTC (permalink / raw) To: Barry Song Cc: akpm, hannes, david, mhocko, qi.zheng, shakeel.butt, ljs, kasong, axelrasmussen, yuanchu, weixugc, baoquan.he, baolin.wang, yuzhao, linux-mm, linux-kernel, apais, rlmenge, Hardik Garg On Mon, 26 Oct 2026 at 03:00, Barry Song <baohua@kernel.org> wrote: > > On Thu, Oct 22, 2026 at 7:56 AM Siddharth Chintamaneni > <sidchintamaneni@gmail.com> wrote: > > > > get_lruvec() was originally introduced in commit ec1c86b25f4b ("mm: > > multi-gen LRU: groundwork") to guard against NULL NODE_DATA(nid) on > > uninitialized NUMA nodes (`return pgdat ? &pgdat->__lruvec : NULL;`). > > After commit 09f49dca570a ("mm: handle uninitialized numa nodes > > gracefully") and commit 931b6a8b36a2 ("mm: multi-gen LRU: remove NULL > > checks on NODE_DATA()"), that NULL check was removed, leaving > > get_lruvec() as a thin wrapper around mem_cgroup_lruvec(). > > > > Remove get_lruvec() and call mem_cgroup_lruvec() directly at all call > > sites. > > > > Cc: Barry Song <baohua@kernel.org> > > I guess the correct tag should be "Suggested-by" here? > > > Signed-off-by: Siddharth Chintamaneni <sidchintamaneni@gmail.com> > > Signed-off-by: Hardik Garg <hargar@linux.microsoft.com> > > --- > > Your patchset organization is a bit unusual. Patch 2/2 is > sent as a reply to patch 1/2. I think adding a cover letter > would help you organize the series properly? > re-sent it with your suggestions, Thanks! > Thanks > Barry ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/2] mm: multi-gen LRU: use mem_cgroup_lruvec() in get_lruvec() 2026-10-21 23:56 [PATCH v1 1/2] mm: multi-gen LRU: use mem_cgroup_lruvec() in get_lruvec() Siddharth Chintamaneni 2026-10-21 23:56 ` [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() Siddharth Chintamaneni @ 2026-10-26 2:31 ` Baolin Wang 1 sibling, 0 replies; 6+ messages in thread From: Baolin Wang @ 2026-10-26 2:31 UTC (permalink / raw) To: Siddharth Chintamaneni, akpm, hannes Cc: david, mhocko, qi.zheng, shakeel.butt, ljs, kasong, baohua, axelrasmussen, yuanchu, weixugc, baoquan.he, yuzhao, linux-mm, linux-kernel, apais, rlmenge, Hardik Garg On 10/22/26 7:56 AM, Siddharth Chintamaneni wrote: > Andrew Morton noted that get_lruvec() has the same pattern as > lru_gen_shrink_node(): when memcg is disabled on the command line > (cgroup_disable=memory), it returns &pgdat->__lruvec directly instead of > going through mem_cgroup_lruvec(), which initializes lruvec->pgdat. > > In practice all callers of get_lruvec() run after kswapd_init() has > already initialized pgdat->__lruvec.pgdat on every N_MEMORY node, so > this is not a runtime bug. Have get_lruvec() delegate to > mem_cgroup_lruvec() directly. > > Signed-off-by: Siddharth Chintamaneni <sidchintamaneni@gmail.com> > Signed-off-by: Hardik Garg <hargar@linux.microsoft.com> > --- LGTM. Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-10-26 20:28 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-10-21 23:56 [PATCH v1 1/2] mm: multi-gen LRU: use mem_cgroup_lruvec() in get_lruvec() Siddharth Chintamaneni 2026-10-21 23:56 ` [PATCH v1 2/2] mm: multi-gen LRU: remove get_lruvec() Siddharth Chintamaneni 2026-10-26 2:35 ` Baolin Wang 2026-10-26 10:00 ` Barry Song 2026-10-26 20:28 ` Siddharth Chintamaneni 2026-10-26 2:31 ` [PATCH v1 1/2] mm: multi-gen LRU: use mem_cgroup_lruvec() in get_lruvec() Baolin Wang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®