[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260121123955.84806-2-jiayuan.chen@linux.dev>
Date: Wed, 21 Jan 2026 20:39:47 +0800
From: Jiayuan Chen <jiayuan.chen@...ux.dev>
To: linux-mm@...ck.org
Cc: Jiayuan Chen <jiayuan.chen@...pee.com>,
Tejun Heo <tj@...nel.org>,
Johannes Weiner <hannes@...xchg.org>,
Michal Koutný <mkoutny@...e.com>,
Jonathan Corbet <corbet@....net>,
Andrew Morton <akpm@...ux-foundation.org>,
David Hildenbrand <david@...nel.org>,
Lorenzo Stoakes <lorenzo.stoakes@...cle.com>,
"Liam R. Howlett" <Liam.Howlett@...cle.com>,
Vlastimil Babka <vbabka@...e.cz>,
Mike Rapoport <rppt@...nel.org>,
Suren Baghdasaryan <surenb@...gle.com>,
Michal Hocko <mhocko@...e.com>,
Axel Rasmussen <axelrasmussen@...gle.com>,
Yuanchu Xie <yuanchu@...gle.com>,
Wei Xu <weixugc@...gle.com>,
Roman Gushchin <roman.gushchin@...ux.dev>,
Shakeel Butt <shakeel.butt@...ux.dev>,
Muchun Song <muchun.song@...ux.dev>,
Qi Zheng <zhengqi.arch@...edance.com>,
cgroups@...r.kernel.org,
linux-doc@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: [RFC PATCH 1/3] mm/lru_gen: refactor to extract helper functions
From: Jiayuan Chen <jiayuan.chen@...pee.com>
Extract helper functions from debugfs interface for code reuse:
- lru_gen_print_lruvec(): Print generations for a single lruvec,
extracted from lru_gen_seq_show().
- __run_cmd(): Core command execution logic, extracted from run_cmd().
These helpers will be used by the upcoming memcg interface.
No functional change.
Signed-off-by: Jiayuan Chen <jiayuan.chen@...pee.com>
---
mm/vmscan.c | 82 +++++++++++++++++++++++++++++++----------------------
1 file changed, 48 insertions(+), 34 deletions(-)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 619691aa4393..8ea5b67daa36 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -5397,29 +5397,13 @@ static void lru_gen_seq_show_full(struct seq_file *m, struct lruvec *lruvec,
seq_putc(m, '\n');
}
-/* see Documentation/admin-guide/mm/multigen_lru.rst for details */
-static int lru_gen_seq_show(struct seq_file *m, void *v)
+/* Print generations for a single lruvec - helper for debugfs and memcg */
+static void lru_gen_print_lruvec(struct seq_file *m, struct lruvec *lruvec,
+ unsigned long max_seq, unsigned long *min_seq,
+ bool full)
{
unsigned long seq;
- bool full = debugfs_get_aux_num(m->file);
- struct lruvec *lruvec = v;
struct lru_gen_folio *lrugen = &lruvec->lrugen;
- int nid = lruvec_pgdat(lruvec)->node_id;
- struct mem_cgroup *memcg = lruvec_memcg(lruvec);
- DEFINE_MAX_SEQ(lruvec);
- DEFINE_MIN_SEQ(lruvec);
-
- if (nid == first_memory_node) {
- const char *path = memcg ? m->private : "";
-
-#ifdef CONFIG_MEMCG
- if (memcg)
- cgroup_path(memcg->css.cgroup, m->private, PATH_MAX);
-#endif
- seq_printf(m, "memcg %5hu %s\n", mem_cgroup_id(memcg), path);
- }
-
- seq_printf(m, " node %5d\n", nid);
if (!full)
seq = evictable_min_seq(min_seq, MAX_SWAPPINESS / 2);
@@ -5431,7 +5415,7 @@ static int lru_gen_seq_show(struct seq_file *m, void *v)
for (; seq <= max_seq; seq++) {
int type, zone;
int gen = lru_gen_from_seq(seq);
- unsigned long birth = READ_ONCE(lruvec->lrugen.timestamps[gen]);
+ unsigned long birth = READ_ONCE(lrugen->timestamps[gen]);
seq_printf(m, " %10lu %10u", seq, jiffies_to_msecs(jiffies - birth));
@@ -5450,7 +5434,31 @@ static int lru_gen_seq_show(struct seq_file *m, void *v)
if (full)
lru_gen_seq_show_full(m, lruvec, max_seq, min_seq, seq);
}
+}
+
+/* see Documentation/admin-guide/mm/multigen_lru.rst for details */
+static int lru_gen_seq_show(struct seq_file *m, void *v)
+{
+ bool full = debugfs_get_aux_num(m->file);
+ struct lruvec *lruvec = v;
+ int nid = lruvec_pgdat(lruvec)->node_id;
+ struct mem_cgroup *memcg = lruvec_memcg(lruvec);
+ DEFINE_MAX_SEQ(lruvec);
+ DEFINE_MIN_SEQ(lruvec);
+
+ if (nid == first_memory_node) {
+ const char *path = memcg ? m->private : "";
+
+#ifdef CONFIG_MEMCG
+ if (memcg)
+ cgroup_path(memcg->css.cgroup, m->private, PATH_MAX);
+#endif
+ seq_printf(m, "memcg %5hu %s\n", mem_cgroup_id(memcg), path);
+ }
+ seq_printf(m, " node %5d\n", nid);
+
+ lru_gen_print_lruvec(m, lruvec, max_seq, min_seq, full);
return 0;
}
@@ -5501,6 +5509,24 @@ static int run_eviction(struct lruvec *lruvec, unsigned long seq, struct scan_co
return -EINTR;
}
+/* Core command execution - helper for debugfs and memcg */
+static int __run_cmd(char cmd, struct lruvec *lruvec, unsigned long seq,
+ struct scan_control *sc, int swappiness, unsigned long opt)
+{
+ if (swappiness < MIN_SWAPPINESS)
+ swappiness = get_swappiness(lruvec, sc);
+ else if (swappiness > SWAPPINESS_ANON_ONLY)
+ return -EINVAL;
+
+ switch (cmd) {
+ case '+':
+ return run_aging(lruvec, seq, swappiness, opt);
+ case '-':
+ return run_eviction(lruvec, seq, sc, swappiness, opt);
+ }
+ return -EINVAL;
+}
+
static int run_cmd(char cmd, int memcg_id, int nid, unsigned long seq,
struct scan_control *sc, int swappiness, unsigned long opt)
{
@@ -5530,19 +5556,7 @@ static int run_cmd(char cmd, int memcg_id, int nid, unsigned long seq,
sc->target_mem_cgroup = memcg;
lruvec = get_lruvec(memcg, nid);
- if (swappiness < MIN_SWAPPINESS)
- swappiness = get_swappiness(lruvec, sc);
- else if (swappiness > SWAPPINESS_ANON_ONLY)
- goto done;
-
- switch (cmd) {
- case '+':
- err = run_aging(lruvec, seq, swappiness, opt);
- break;
- case '-':
- err = run_eviction(lruvec, seq, sc, swappiness, opt);
- break;
- }
+ err = __run_cmd(cmd, lruvec, seq, sc, swappiness, opt);
done:
mem_cgroup_put(memcg);
--
2.43.0
Powered by blists - more mailing lists