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: 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


  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