From: Ridong Chen <[email protected]>

Both lruvec_evictable_size() and the debugfs lru_gen_seq_show() compute
the number of pages in a generation the same way: sum lrugen->nr_pages
over all zones for a given (gen, type) and clamp each term to >= 0.

Factor that out into lru_gen_seq_nr_pages() so the open-coded zone loop
lives in one place. No functional change.

A follow-up patch adds a tracepoint that needs the same per-generation
page count, and will reuse this helper instead of open-coding it again.

Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Ridong Chen <[email protected]>
---
 mm/vmscan.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 40d3f1b48a74..2554a6513aa8 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2813,6 +2813,18 @@ static int get_nr_gens(struct lruvec *lruvec, int type)
        return lruvec->lrugen.max_seq - lruvec->lrugen.min_seq[type] + 1;
 }
 
+/* the number of pages in a generation, summed over zones and clamped to >= 0 
*/
+static unsigned long lru_gen_seq_nr_pages(struct lru_gen_folio *lrugen, int 
gen, int type)
+{
+       int zone;
+       unsigned long size = 0;
+
+       for (zone = 0; zone < MAX_NR_ZONES; zone++)
+               size += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L);
+
+       return size;
+}
+
 static bool __maybe_unused seq_is_valid(struct lruvec *lruvec)
 {
        int type;
@@ -4239,7 +4251,7 @@ static void set_initial_priority(struct pglist_data 
*pgdat, struct scan_control
 
 static unsigned long lruvec_evictable_size(struct lruvec *lruvec, int 
swappiness)
 {
-       int gen, type, zone;
+       int gen, type;
        unsigned long seq, total = 0;
        struct lru_gen_folio *lrugen = &lruvec->lrugen;
        DEFINE_MAX_SEQ(lruvec);
@@ -4248,8 +4260,7 @@ static unsigned long lruvec_evictable_size(struct lruvec 
*lruvec, int swappiness
        for_each_evictable_type(type, swappiness) {
                for (seq = min_seq[type]; seq <= max_seq; seq++) {
                        gen = lru_gen_from_seq(seq);
-                       for (zone = 0; zone < MAX_NR_ZONES; zone++)
-                               total += 
max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L);
+                       total += lru_gen_seq_nr_pages(lrugen, gen, type);
                }
        }
 
@@ -5738,19 +5749,16 @@ static int lru_gen_seq_show(struct seq_file *m, void *v)
                seq = 0;
 
        for (; seq <= max_seq; seq++) {
-               int type, zone;
+               int type;
                int gen = lru_gen_from_seq(seq);
                unsigned long birth = READ_ONCE(lruvec->lrugen.timestamps[gen]);
 
                seq_printf(m, " %10lu %10u", seq, jiffies_to_msecs(jiffies - 
birth));
 
                for (type = 0; type < ANON_AND_FILE; type++) {
-                       unsigned long size = 0;
+                       unsigned long size = lru_gen_seq_nr_pages(lrugen, gen, 
type);
                        char mark = full && seq < min_seq[type] ? 'x' : ' ';
 
-                       for (zone = 0; zone < MAX_NR_ZONES; zone++)
-                               size += 
max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L);
-
                        seq_printf(m, " %10lu%c", size, mark);
                }
 
-- 
2.34.1


Reply via email to