From: Jiayuan Chen <jiayuan.chen@shopee.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@shopee.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
© 2016 - 2026 Red Hat, Inc.