From: sashiko-bot@kernel.org
To: "Barry Song (Xiaomi)" <baohua@kernel.org>,
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, 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
Subject: Re: [PATCH v6 05/15] mm/mglru: skip zones above reclaim_idx instead of rotating them
Date: Tue, 10 Nov 2026 20:56:29 +0000 [thread overview]
Message-ID: <sashiko-outbox-207742@kernel.org> (raw)
In-Reply-To: <20261110202025.25736-6-baohua@kernel.org>
Thank you for your contribution! Sashiko AI review found no new issues
in this patch, but noticed 1 related pre-existing issue it does not
introduce:
- [Medium] mm: inconsistent PGSCAN stat accounting in scan_folios() [1]
--
commit 91b0962145533fb9dabae36c077150538170ace0
Author: Kairui Song <kasong@tencent.com>
mm/mglru: skip zones above reclaim_idx instead of rotating them
This commit restricts scan_folios() and lruvec_populated_min_seq() to zones
up to sc->reclaim_idx rather than rotating folios in ineligible zones to a
younger generation.
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index db0a8a3e88872..6b16706779744 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
[ ... ]
> @@ -4758,16 +4750,17 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
> struct scan_control *sc, int type, int tier,
> struct list_head *list, int *isolatedp)
> {
> - int i;
> enum node_stat_item item;
> + int zone_idx;
> int sorted = 0;
> int scanned = 0;
> int isolated = 0;
> int skipped = 0;
> int gen, max_gen;
> - unsigned long min_seq;
> + unsigned long seq;
> unsigned long remaining = nr_to_scan;
> struct lru_gen_folio *lrugen = &lruvec->lrugen;
> + struct pglist_data *pgdat = lruvec_pgdat(lruvec);
> DEFINE_MAX_SEQ(lruvec);
>
> VM_WARN_ON_ONCE(nr_to_scan > MAX_LRU_BATCH);
> @@ -4779,24 +4772,22 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
> * when under pressure to respect swappiness more and reduce IO cost.
> */
> if (sc->priority == DEF_PRIORITY)
> - min_seq = lrugen->min_seq[type];
> + seq = lrugen->min_seq[type];
> else
> - min_seq = lruvec_populated_min_seq(lruvec, type, lrugen->max_seq);
> + seq = lrugen->max_seq;
>
> - gen = lru_gen_from_seq(min_seq);
> + seq = lruvec_populated_min_seq(lruvec, type, sc->reclaim_idx + 1, seq);
> + gen = lru_gen_from_seq(seq);
> max_gen = lru_gen_from_seq(max_seq);
>
> - for (i = MAX_NR_ZONES; i > 0; i--) {
> + /* Scan eligible zones in descending order. */
> + for (zone_idx = sc->reclaim_idx; zone_idx >= 0; zone_idx--) {
> LIST_HEAD(moved);
> int skipped_zone = 0;
> - int zone = (sc->reclaim_idx + i) % MAX_NR_ZONES;
> - struct list_head *head = &lrugen->folios[gen][type][zone];
> + struct zone *zone = &pgdat->node_zones[zone_idx];
> + struct list_head *head = &lrugen->folios[gen][type][zone_idx];
>
> - /*
> - * If there is only one gen left, rotating the unreclaimable
> - * zone become meaningless, just skip them.
> - */
> - if (gen == max_gen && zone > sc->reclaim_idx)
> + if (!managed_zone(zone))
> continue;
>
> while (!list_empty(head)) {
> @@ -4806,7 +4797,7 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
> VM_WARN_ON_ONCE_FOLIO(folio_test_unevictable(folio), folio);
> VM_WARN_ON_ONCE_FOLIO(folio_test_active(folio), folio);
> VM_WARN_ON_ONCE_FOLIO(folio_is_file_lru(folio) != type, folio);
> - VM_WARN_ON_ONCE_FOLIO(folio_zonenum(folio) != zone, folio);
> + VM_WARN_ON_ONCE_FOLIO(folio_zonenum(folio) != zone_idx, folio);
>
> scanned += delta;
> if (sort_folio(lruvec, folio, sc, gen, max_gen, tier))
> @@ -4825,7 +4816,7 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
>
> if (skipped_zone) {
> list_splice(&moved, head);
> - __count_zid_vm_events(PGSCAN_SKIP, zone, skipped_zone);
> + __count_zid_vm_events(PGSCAN_SKIP, zone_idx, skipped_zone);
> skipped += skipped_zone;
> }
>
[Severity: Medium]
This problem wasn't introduced by this patch, but should scan_folios() pass
scanned rather than isolated to mod_lruvec_state() for PGSCAN_KSWAPD and
PGSCAN_ANON + type [1]?
mm/vmscan.c:scan_folios() {
...
item = PGSCAN_KSWAPD + reclaimer_offset(sc);
mod_lruvec_state(lruvec, item, isolated);
mod_lruvec_state(lruvec, PGREFILL, sorted);
mod_lruvec_state(lruvec, PGSCAN_ANON + type, isolated);
...
}
Folios that are promoted via sort_folio() or skipped are counted in
scanned, but passing isolated here omits them from the PGSCAN vmstat
counters and underreports the scan rate compared to the classic LRU path.
[1] https://sashiko.dev/#/bug/linux-ebd28175-5aad-4454-b9f3-a9510e3c4655
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261110202025.25736-1-baohua@kernel.org?part=5
next prev parent reply other threads:[~2026-11-10 20:56 UTC|newest]
Thread overview: 26+ 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:56 ` sashiko-bot [this message]
2026-11-10 21:25 ` Barry Song
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:56 ` sashiko-bot
2026-11-11 22:01 ` Barry Song
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:56 ` sashiko-bot
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:56 ` sashiko-bot
2026-11-11 0:09 ` Barry Song
2026-11-10 20:20 ` [PATCH v6 10/15] mm/mglru: Run aging when pages are rare outside the youngest gen Barry Song (Xiaomi)
2026-11-10 20:20 ` [PATCH v6 11/15] mm/mglru: Restrict eviction accounting to eligible zones Barry Song (Xiaomi)
2026-11-10 20:56 ` sashiko-bot
2026-11-10 21:08 ` Barry Song
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)
2026-11-10 20:56 ` sashiko-bot
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-207742@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=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=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=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