Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
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


  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