From nobody Sun Feb 8 12:36:59 2026 Received: from out-180.mta0.migadu.com (out-180.mta0.migadu.com [91.218.175.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0B3548166B; Wed, 21 Jan 2026 12:40:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768999221; cv=none; b=tPwoxBKVKar5bR2qiMOXisAtzGampz2bDcZyIogUNfvJQgLzAy1RJlI9yVsAjklEXVF5DlwkBmiwKG1ECGEErXvFoJ8y69812hxSSQZtYVLKDn8gfSYSd0gC+e/AYJD43Saw+aBskVd7Sro35reKtCydpsUoa0BPf9K47/nrAdw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768999221; c=relaxed/simple; bh=o2PQazJGiOOsfBalbp7C2mvB9kNuqvABUGRvq8ihU8c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KIhmXZOXzqrghwE9S9uQBCWGx78t1aVGd7YvPvUbPEmF8McdYweJWFPjEwY/zX3E0Y+9h7+816Kf+wVV6cjkQVAi+algbx6GRCwbmD9JxXlm/HXEgKu5iFggaeTXtmGLFn+ysJBbj+DaJKthm8U8wQqM554mgxCPiscmnFPrhXY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=FXaeL+YP; arc=none smtp.client-ip=91.218.175.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="FXaeL+YP" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1768999215; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T/OqE0ydtm9JkTAiuYuoK4hbHLjWKG5nWVyw4vzq10Y=; b=FXaeL+YPA/JmFJNJXBNvEweyQrlFdOfXe48axrvpijrU//10I6yRcz2r0gEpEw/qP/JWeW t8KRG2OxI5b5PhB9BBxnR1zwPG6G2ieHEW46c6c6HTk0bz9Etrn9GRQi4P1dm8p1saIdJu YNOBF1YssN94gM/XXAVWojOZGtqtIdI= From: Jiayuan Chen To: linux-mm@kvack.org Cc: Jiayuan Chen , Tejun Heo , Johannes Weiner , =?UTF-8?q?Michal=20Koutn=C3=BD?= , Jonathan Corbet , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Axel Rasmussen , Yuanchu Xie , Wei Xu , Roman Gushchin , Shakeel Butt , Muchun Song , Qi Zheng , cgroups@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 1/3] mm/lru_gen: refactor to extract helper functions Date: Wed, 21 Jan 2026 20:39:47 +0800 Message-ID: <20260121123955.84806-2-jiayuan.chen@linux.dev> In-Reply-To: <20260121123955.84806-1-jiayuan.chen@linux.dev> References: <20260121123955.84806-1-jiayuan.chen@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Jiayuan Chen 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 --- 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'); } =20 -/* 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 =3D debugfs_get_aux_num(m->file); - struct lruvec *lruvec =3D v; struct lru_gen_folio *lrugen =3D &lruvec->lrugen; - int nid =3D lruvec_pgdat(lruvec)->node_id; - struct mem_cgroup *memcg =3D lruvec_memcg(lruvec); - DEFINE_MAX_SEQ(lruvec); - DEFINE_MIN_SEQ(lruvec); - - if (nid =3D=3D first_memory_node) { - const char *path =3D 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); =20 if (!full) seq =3D 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 <=3D max_seq; seq++) { int type, zone; int gen =3D lru_gen_from_seq(seq); - unsigned long birth =3D READ_ONCE(lruvec->lrugen.timestamps[gen]); + unsigned long birth =3D READ_ONCE(lrugen->timestamps[gen]); =20 seq_printf(m, " %10lu %10u", seq, jiffies_to_msecs(jiffies - birth)); =20 @@ -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 =3D debugfs_get_aux_num(m->file); + struct lruvec *lruvec =3D v; + int nid =3D lruvec_pgdat(lruvec)->node_id; + struct mem_cgroup *memcg =3D lruvec_memcg(lruvec); + DEFINE_MAX_SEQ(lruvec); + DEFINE_MIN_SEQ(lruvec); + + if (nid =3D=3D first_memory_node) { + const char *path =3D 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); + } =20 + seq_printf(m, " node %5d\n", nid); + + lru_gen_print_lruvec(m, lruvec, max_seq, min_seq, full); return 0; } =20 @@ -5501,6 +5509,24 @@ static int run_eviction(struct lruvec *lruvec, unsig= ned long seq, struct scan_co return -EINTR; } =20 +/* 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 =3D 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 =3D memcg; lruvec =3D get_lruvec(memcg, nid); =20 - if (swappiness < MIN_SWAPPINESS) - swappiness =3D get_swappiness(lruvec, sc); - else if (swappiness > SWAPPINESS_ANON_ONLY) - goto done; - - switch (cmd) { - case '+': - err =3D run_aging(lruvec, seq, swappiness, opt); - break; - case '-': - err =3D run_eviction(lruvec, seq, sc, swappiness, opt); - break; - } + err =3D __run_cmd(cmd, lruvec, seq, sc, swappiness, opt); done: mem_cgroup_put(memcg); =20 --=20 2.43.0