From: "Barry Song (Xiaomi)" <baohua@kernel.org>
To: akpm@linux-foundation.org, linux-mm@kvack.org
Cc: axelrasmussen@google.com, baolin.wang@linux.alibaba.com,
baoquan.he@linux.dev, hannes@cmpxchg.org, hui.zhu@linux.dev,
kasong@tencent.com, kunwu.chan@gmail.com, liam@infradead.org,
lianux.mm@gmail.com, linux-kernel@vger.kernel.org,
liuxiang.277@bytedance.com, lyugaofei@xiaomi.com,
mhocko@kernel.org, mhocko@suse.com, qi.zheng@linux.dev,
ridong.chen@linux.dev, rppt@kernel.org, ryncsn@gmail.com,
shakeel.butt@linux.dev, surenb@google.com, wangzicheng@honor.com,
weixugc@google.com, yuanchu@google.com, zhangbo56@xiaomi.com,
zhuhui@kylinos.cn, sidchintamaneni@gmail.com,
Barry Song <baohua@kernel.org>
Subject: [PATCH v6 10/15] mm/mglru: Run aging when pages are rare outside the youngest gen
Date: Wed, 11 Nov 2026 04:20:20 +0800 [thread overview]
Message-ID: <20261110202025.25736-11-baohua@kernel.org> (raw)
In-Reply-To: <20261110202025.25736-1-baohua@kernel.org>
From: lyugaofei <lyugaofei@xiaomi.com>
Run aging when the total number of pages outside the youngest
generation across both types falls below 1/MAX_NR_GENS of the number
of pages in the youngest generation. For extreme swappiness values
such as 1 and 200, also consider the balance of the corresponding
type.
This improves reclaim efficiency, especially at extreme swappiness
values, while reducing system time.
To avoid the overhead of aging, we only allow imbalance-based aging
when the reclaim priority is low enough that we might reclaim the
youngest generation. We also limit it to once per priority.
Signed-off-by: lyugaofei <lyugaofei@xiaomi.com>
Co-developed-by: Barry Song (Xiaomi) <baohua@kernel.org>
Signed-off-by: Barry Song (Xiaomi) <baohua@kernel.org>
---
mm/vmscan.c | 45 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 42 insertions(+), 3 deletions(-)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index bde67da7db57..8014a90e4bc2 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -5068,8 +5068,41 @@ static int evict_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
return scanned;
}
+static bool lru_gen_imbalanced(struct lruvec *lruvec, struct scan_control *sc,
+ int swappiness)
+{
+ unsigned long youngest[ANON_AND_FILE] = {0}, old[ANON_AND_FILE] = {0};
+ struct lru_gen_folio *lrugen = &lruvec->lrugen;
+ DEFINE_MAX_SEQ(lruvec);
+ DEFINE_MIN_SEQ(lruvec);
+ int type;
+
+ for_each_evictable_type(type, swappiness) {
+ unsigned long seq;
+
+ youngest[type] = lruvec_gen_size(lrugen, type, max_seq);
+ for (seq = min_seq[type]; seq < max_seq; seq++)
+ old[type] += lruvec_gen_size(lrugen, type, seq);
+ }
+
+ /* the vast majority of pages sit in the youngest gen */
+ if (youngest[LRU_GEN_ANON] + youngest[LRU_GEN_FILE] >
+ (old[LRU_GEN_ANON] + old[LRU_GEN_FILE]) * MAX_NR_GENS)
+ return true;
+
+ /* Swappiness extremes: the corresponding type matters */
+ if (swappiness == MIN_SWAPPINESS + 1)
+ return youngest[LRU_GEN_FILE] > old[LRU_GEN_FILE] * MAX_NR_GENS;
+
+ if (swappiness == MAX_SWAPPINESS)
+ return youngest[LRU_GEN_ANON] > old[LRU_GEN_ANON] * MAX_NR_GENS;
+
+ return false;
+}
+
static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq,
- struct scan_control *sc, int swappiness)
+ struct scan_control *sc, int swappiness,
+ bool do_balance)
{
DEFINE_MIN_SEQ(lruvec);
@@ -5082,7 +5115,11 @@ static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq,
return false;
/* better to run aging even though eviction is still possible */
- return evictable_min_seq(min_seq, swappiness) + MIN_NR_GENS == max_seq;
+ if (evictable_min_seq(min_seq, swappiness) + MIN_NR_GENS == max_seq)
+ return true;
+
+ /* run aging when folios outside the youngest gen are rare */
+ return do_balance && lru_gen_imbalanced(lruvec, sc, swappiness);
}
static void lru_gen_prepare_scan(struct lruvec *lruvec, struct scan_control *sc,
@@ -5168,6 +5205,7 @@ static bool try_to_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
bool need_rotate = false, should_age = false;
int swappiness = get_swappiness(lruvec, sc);
struct mem_cgroup *memcg = lruvec_memcg(lruvec);
+ bool do_balance = (sc->priority <= DEF_PRIORITY / 2);
/*
* Proactive reclaim initiated by userspace for anonymous memory only.
@@ -5192,12 +5230,13 @@ static bool try_to_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
break;
}
- if (should_run_aging(lruvec, max_seq, sc, swappiness)) {
+ if (should_run_aging(lruvec, max_seq, sc, swappiness, do_balance)) {
trace_mm_mglru_aging(lruvec, sc, swappiness);
if (try_to_inc_max_seq(lruvec, max_seq, swappiness, false))
need_rotate = true;
should_age = true;
}
+ do_balance = false;
if (!evict_folio_lists(nr, lruvec, sc, swappiness, MIN_LRU_BATCH))
break;
--
2.34.1
next prev parent reply other threads:[~2026-11-10 20:21 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 20:20 [PATCH v6 00/15] mm: mglru: fix swappiness behavior Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 01/15] mm/mglru: report evictable sizes per type Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 02/15] mm/mglru: extract lruvec_populated_min_seq() helper Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 03/15] mm/mglru: reclaim from the oldest populated gen Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 04/15] mm/mglru: lift the forced protection of reclaimer Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 05/15] mm/mglru: skip zones above reclaim_idx instead of rotating them Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 06/15] mm/mglru: return for unavailable anon reclaim earlier Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 07/15] mm/mglru: balance anon and file scan budget by refault rate Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 08/15] mm/mglru: lift youngest gen protection for higher priority Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 09/15] mm/mglru: Avoid placing rejected folios below populated gen Barry Song (Xiaomi)
2026-11-10 20:20 ` Barry Song (Xiaomi) [this message]
2026-11-10 20:20 ` [PATCH v6 11/15] mm/mglru: Restrict eviction accounting to eligible zones Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 12/15] mm/mglru: Reduce LRU lock contention by shrinking folio batches in inc_min_seq Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 13/15] mm/mglru: Avoid prolonged anon reclaim with swappiness=200 Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 14/15] mm/mglru: Make swappiness=1 file reclaim more aggressive Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 15/15] mm/mglru: Avoid scan anon while swapcache is low for GFP_NOIO allocation Barry Song (Xiaomi)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261110202025.25736-11-baohua@kernel.org \
--to=baohua@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=baolin.wang@linux.alibaba.com \
--cc=baoquan.he@linux.dev \
--cc=hannes@cmpxchg.org \
--cc=hui.zhu@linux.dev \
--cc=kasong@tencent.com \
--cc=kunwu.chan@gmail.com \
--cc=liam@infradead.org \
--cc=lianux.mm@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=liuxiang.277@bytedance.com \
--cc=lyugaofei@xiaomi.com \
--cc=mhocko@kernel.org \
--cc=mhocko@suse.com \
--cc=qi.zheng@linux.dev \
--cc=ridong.chen@linux.dev \
--cc=rppt@kernel.org \
--cc=ryncsn@gmail.com \
--cc=shakeel.butt@linux.dev \
--cc=sidchintamaneni@gmail.com \
--cc=surenb@google.com \
--cc=wangzicheng@honor.com \
--cc=weixugc@google.com \
--cc=yuanchu@google.com \
--cc=zhangbo56@xiaomi.com \
--cc=zhuhui@kylinos.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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®