From: sashiko-bot@kernel.org
To: "Barry Song (Xiaomi)" <baohua@kernel.org>,
akpm@linux-foundation.org, linux-mm@kvack.org
Cc: hui.zhu@linux.dev, axelrasmussen@google.com,
baolin.wang@linux.alibaba.com, david@kernel.org,
hannes@cmpxchg.org, ljs@kernel.org, mhocko@kernel.org,
qi.zheng@linux.dev, ryncsn@gmail.com, shakeel.butt@linux.dev,
weixugc@google.com, yuanchu@google.com, zhuhui@kylinos.cn,
baoquan.he@linux.dev, liuxiang.277@bytedance.com,
wangzicheng@honor.com, lianux.mm@gmail.com, kasong@tencent.com,
liam@infradead.org, surenb@google.com, mhocko@suse.com,
rppt@kernel.org, zhangbo56@xiaomi.com, lyugaofei@xiaomi.com,
ridong.chen@linux.dev, kunwu.chan@gmail.com
Subject: Re: [RFC PATCH v5 08/14] mm/mglru: lift youngest gen protection for higher priority
Date: Fri, 23 Oct 2026 22:03:40 +0000 [thread overview]
Message-ID: <sashiko-outbox-183274@kernel.org> (raw)
In-Reply-To: <20261022220203.91911-9-baohua@kernel.org>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] mm/mglru: scan_folios() scans expired gen < min_seq at DEF_PRIORITY
--
commit 1329290ce5f86b7de9b77d6b22e4b265f16348ae
Author: Kairui Song <kasong@tencent.com>
mm/mglru: lift youngest gen protection for higher priority
This commit adjusts scan_folios() in mm/vmscan.c to choose the target
generation sequence number based on reclaim priority rather than using
lrugen->min_seq[type] at default priority. It aims to protect younger
generations at default priority while allowing higher-priority reclaim to
scan newer generations step by step.
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index fed39b0422e01..d1e14001f9346 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -4930,12 +4930,14 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
> VM_WARN_ON_ONCE(!list_empty(list));
>
> /*
> - * Respect the gen hotness distribution at low priority to avoid
> - * aging and scan cost, but prefer to satisfy the reclaimers request
> - * when under pressure to respect swappiness more and reduce IO cost.
> + * Respect hotness at default priority, and only reach into the
> + * newest generation when under severe pressure, so hot folios are
> + * not evicted as soon as priority is raised.
> */
> if (sc->priority == DEF_PRIORITY)
> - seq = lrugen->min_seq[type];
> + seq = lrugen->max_seq - MIN_NR_GENS;
> + else if (sc->priority > DEF_PRIORITY / 2)
> + seq = lrugen->max_seq - 1;
> else
> seq = lrugen->max_seq;
>
[Severity: Medium]
Can this cause scan_folios() in mm/vmscan.c to scan an already-evicted
generation when a type only has the minimum number of generations left?
In try_to_shrink_lruvec() -> evict_folio_lists() -> evict_folios() ->
scan_folios() at default priority, when get_nr_gens(lruvec, type) is at the
minimum (2 generations), lrugen->min_seq[type] is lrugen->max_seq - 1, while
scan_folios() sets seq to lrugen->max_seq - 2 and passes it as max_seq to
lruvec_populated_min_seq():
mm/vmscan.c:scan_folios() {
if (sc->priority == DEF_PRIORITY)
seq = lrugen->max_seq - MIN_NR_GENS;
...
seq = lruvec_populated_min_seq(lruvec, type, sc->reclaim_idx + 1, seq);
gen = lru_gen_from_seq(seq);
}
In lruvec_populated_min_seq(), because min_seq (lrugen->max_seq - 1) is
greater than max_seq (lrugen->max_seq - 2), the while loop is skipped and
max_seq is returned directly:
mm/vmscan.c:lruvec_populated_min_seq() {
min_seq = READ_ONCE(lrugen->min_seq[type]);
while (min_seq <= max_seq) {
gen = lru_gen_from_seq(min_seq);
for (zone = 0; zone < zone_limit; zone++) {
if (!list_empty(&lrugen->folios[gen][type][zone]))
return min_seq;
}
min_seq++;
}
return max_seq;
}
When scan_folios() previously scanned younger generations (lrugen->max_seq - 1
or lrugen->max_seq) at elevated priority while get_nr_gens(lruvec, type) had
fewer than the maximum number of generations, sort_folio() can move folios
with a stale folio_lru_gen() value (such as after __lru_gen_reparent_memcg()
or when inc_min_seq() skipped draining old_gen) into that expired
lrugen->folios[gen][type][zone] list:
mm/vmscan.c:sort_folio() {
/* promoted, or moved due to reparenting. */
if (gen != min_gen) {
list_move(&folio->lru, &lrugen->folios[gen][type][zone]);
return true;
}
}
A subsequent default-priority call to scan_folios() will then visit that
expired generation (< lrugen->min_seq[type]) and corrupt active/inactive size
accounting.
In addition, in lru_gen_seq_write() -> run_cmd() -> run_eviction(), debugfs
eviction runs at default priority. If a user requests evicting up to
lrugen->max_seq - 3 when four generations exist and one type has already
emptied lrugen->max_seq - 3 while the other type still has min_seq at
lrugen->max_seq - 3, wouldn't setting seq to lrugen->max_seq - 2 in
scan_folios() evict folios from generation lrugen->max_seq - 2, exceeding the
requested seq bound?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261022220203.91911-1-baohua@kernel.org?part=8
next prev parent reply other threads:[~2026-10-23 22:03 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-22 22:01 [RFC PATCH v5 00/14] mm: mglru: fix swappiness behavior Barry Song (Xiaomi)
2026-10-22 22:01 ` [RFC PATCH v5 01/14] mm/mglru: report evictable sizes per type Barry Song (Xiaomi)
2026-10-27 8:51 ` KunWu Chan
2026-10-22 22:01 ` [RFC PATCH v5 02/14] mm/mglru: extract lruvec_populated_min_seq() helper Barry Song (Xiaomi)
2026-10-27 9:39 ` KunWu Chan
2026-10-22 22:01 ` [RFC PATCH v5 03/14] mm/mglru: reclaim from the oldest populated gen Barry Song (Xiaomi)
2026-10-27 9:56 ` KunWu Chan
2026-10-22 22:01 ` [RFC PATCH v5 04/14] mm/mglru: lift the forced protection of reclaimer Barry Song (Xiaomi)
2026-10-28 4:14 ` KunWu Chan
2026-10-22 22:01 ` [RFC PATCH v5 05/14] mm/mglru: skip zones above reclaim_idx instead of rotating them Barry Song (Xiaomi)
2026-10-23 22:03 ` sashiko-bot
2026-10-24 16:19 ` Kairui Song
2026-10-22 22:01 ` [RFC PATCH v5 06/14] mm/mglru: return for unavailable anon reclaim earlier Barry Song (Xiaomi)
2026-10-22 22:01 ` [RFC PATCH v5 07/14] mm/mglru: balance anon and file scan budget by refault rate Barry Song (Xiaomi)
2026-10-23 22:03 ` sashiko-bot
2026-10-24 16:24 ` Kairui Song
2026-10-26 7:34 ` Barry Song
2026-10-22 22:01 ` [RFC PATCH v5 08/14] mm/mglru: lift youngest gen protection for higher priority Barry Song (Xiaomi)
2026-10-23 22:03 ` sashiko-bot [this message]
2026-10-24 18:08 ` Kairui Song
2026-10-22 22:01 ` [RFC PATCH v5 09/14] mm/mglru: Avoid placing rejected folios below populated gen Barry Song (Xiaomi)
2026-10-22 22:01 ` [RFC PATCH v5 10/14] mm/mglru: Run aging when pages are rare outside the youngest gen Barry Song (Xiaomi)
2026-10-22 22:02 ` [RFC PATCH v5 11/14] mm/mglru: Reduce LRU lock contention by shrinking folio batches in inc_min_seq Barry Song (Xiaomi)
2026-10-22 22:02 ` [RFC PATCH v5 12/14] mm/mglru: Avoid prolonged anon reclaim with swappiness=200 Barry Song (Xiaomi)
2026-10-22 22:02 ` [RFC PATCH v5 13/14] mm/mglru: Make swappiness=1 file reclaim more aggressive Barry Song (Xiaomi)
2026-10-22 22:02 ` [RFC PATCH v5 14/14] mm/mglru: Avoid scan anon while swapcache is low for GFP_NOIO allocation Barry Song (Xiaomi)
2026-10-23 22:03 ` sashiko-bot
2026-10-25 1:31 ` Bo Zhang
2026-10-26 8:43 ` KunWu Chan
2026-10-24 16:10 ` [RFC PATCH v5 00/14] mm: mglru: fix swappiness behavior Kairui Song
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=sashiko-outbox-183274@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=baoquan.he@linux.dev \
--cc=david@kernel.org \
--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-mm@kvack.org \
--cc=liuxiang.277@bytedance.com \
--cc=ljs@kernel.org \
--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=sashiko-reviews@lists.linux.dev \
--cc=shakeel.butt@linux.dev \
--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