* Re: [PATCH] mm: vmscan: abort proactive reclaim early when freezing
2026-07-06 8:12 [PATCH] mm: vmscan: abort proactive reclaim early when freezing Richard Chang
@ 2026-07-06 12:54 ` Barry Song
2026-07-06 23:38 ` Andrew Morton
2026-07-07 2:20 ` Yosry Ahmed
2 siblings, 0 replies; 4+ messages in thread
From: Barry Song @ 2026-07-06 12:54 UTC (permalink / raw)
To: Richard Chang
Cc: Andrew Morton, Kairui Song, Qi Zheng, Shakeel Butt,
Axel Rasmussen, Yuanchu Xie, Wei Xu, Johannes Weiner,
David Hildenbrand, Michal Hocko, Lorenzo Stoakes,
Suren Baghdasaryan, T . J . Mercier, Martin Liu, Minchan Kim,
linux-mm, linux-kernel
On Mon, Jul 6, 2026 at 4:12 PM Richard Chang <richardycc@google.com> wrote:
>
> Proactive reclaim (via memory.reclaim or node reclaim) checks for pending
> signals in its outer loop in user_proactive_reclaim(). However, the inner
> reclaim loops—scanning cgroups in shrink_many() and evicting folios in
> try_to_shrink_lruvec() can run for a long time before returning to the
> outer loop, especially on systems with many cgroups or large memory sizes.
>
> This latency in responding to signals can block the freezer (both cgroup
> freezer and system suspend), leading to freezer timeouts. This issue was
> specifically observed on Android when attempting to freeze background
> cgroups while proactive reclaim was active.
>
> Add a signal_pending() check to should_abort_scan() for proactive reclaim
> paths. Since should_abort_scan() is called within the inner scanning and
> eviction loops, this allows proactive reclaim to abort early and return to
> the outer loop, ensuring the task can enter the refrigerator in a timely
> manner.
>
> This check is limited to proactive reclaim (sc->proactive) to avoid
> affecting reactive reclaim paths, and wrapped in unlikely() as it is a
> slow path.
>
> Signed-off-by: Richard Chang <richardycc@google.com>
> ---
> mm/vmscan.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 35c3bb15ae96..fb472e924fc7 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -4929,6 +4929,9 @@ static bool should_abort_scan(struct lruvec *lruvec, struct scan_control *sc)
> int i;
> enum zone_watermarks mark;
>
> + if (unlikely(sc->proactive && signal_pending(current)))
> + return true;
> +
Seems reasonable to me. I wonder if you have a script to
reproduce the issue. I'd like to test it.
Best Regards
Barry
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] mm: vmscan: abort proactive reclaim early when freezing
2026-07-06 8:12 [PATCH] mm: vmscan: abort proactive reclaim early when freezing Richard Chang
2026-07-06 12:54 ` Barry Song
@ 2026-07-06 23:38 ` Andrew Morton
2026-07-07 2:20 ` Yosry Ahmed
2 siblings, 0 replies; 4+ messages in thread
From: Andrew Morton @ 2026-07-06 23:38 UTC (permalink / raw)
To: Richard Chang
Cc: Kairui Song, Qi Zheng, Shakeel Butt, Barry Song, Axel Rasmussen,
Yuanchu Xie, Wei Xu, Johannes Weiner, David Hildenbrand,
Michal Hocko, Lorenzo Stoakes, Suren Baghdasaryan,
T . J . Mercier, Martin Liu, Minchan Kim, linux-mm, linux-kernel
On Mon, 6 Jul 2026 08:12:18 +0000 Richard Chang <richardycc@google.com> wrote:
> Proactive reclaim (via memory.reclaim or node reclaim) checks for pending
> signals in its outer loop in user_proactive_reclaim(). However, the inner
> reclaim loops—scanning cgroups in shrink_many() and evicting folios in
> try_to_shrink_lruvec() can run for a long time before returning to the
> outer loop, especially on systems with many cgroups or large memory sizes.
>
> This latency in responding to signals can block the freezer (both cgroup
> freezer and system suspend), leading to freezer timeouts. This issue was
> specifically observed on Android when attempting to freeze background
> cgroups while proactive reclaim was active.
>
> Add a signal_pending() check to should_abort_scan() for proactive reclaim
> paths. Since should_abort_scan() is called within the inner scanning and
> eviction loops, this allows proactive reclaim to abort early and return to
> the outer loop, ensuring the task can enter the refrigerator in a timely
> manner.
>
> This check is limited to proactive reclaim (sc->proactive) to avoid
> affecting reactive reclaim paths, and wrapped in unlikely() as it is a
> slow path.
There are a number of ways of getting into proactive reclaim. Have you
checked that all of them appropriately check and handle signal_pending()?
AI review thinks that classic LRU might need the same fix:
https://sashiko.dev/#/patchset/20260706081218.3438762-1-richardycc@google.com
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] mm: vmscan: abort proactive reclaim early when freezing
2026-07-06 8:12 [PATCH] mm: vmscan: abort proactive reclaim early when freezing Richard Chang
2026-07-06 12:54 ` Barry Song
2026-07-06 23:38 ` Andrew Morton
@ 2026-07-07 2:20 ` Yosry Ahmed
2 siblings, 0 replies; 4+ messages in thread
From: Yosry Ahmed @ 2026-07-07 2:20 UTC (permalink / raw)
To: Richard Chang
Cc: Andrew Morton, Kairui Song, Qi Zheng, Shakeel Butt, Barry Song,
Axel Rasmussen, Yuanchu Xie, Wei Xu, Johannes Weiner,
David Hildenbrand, Michal Hocko, Lorenzo Stoakes,
Suren Baghdasaryan, T . J . Mercier, Martin Liu, Minchan Kim,
linux-mm, linux-kernel
On Mon, Jul 06, 2026 at 08:12:18AM +0000, Richard Chang wrote:
> Proactive reclaim (via memory.reclaim or node reclaim) checks for pending
> signals in its outer loop in user_proactive_reclaim(). However, the inner
> reclaim loops—scanning cgroups in shrink_many() and evicting folios in
> try_to_shrink_lruvec() can run for a long time before returning to the
> outer loop, especially on systems with many cgroups or large memory sizes.
>
> This latency in responding to signals can block the freezer (both cgroup
> freezer and system suspend), leading to freezer timeouts. This issue was
> specifically observed on Android when attempting to freeze background
> cgroups while proactive reclaim was active.
>
> Add a signal_pending() check to should_abort_scan() for proactive reclaim
> paths. Since should_abort_scan() is called within the inner scanning and
> eviction loops, this allows proactive reclaim to abort early and return to
> the outer loop, ensuring the task can enter the refrigerator in a timely
> manner.
Do we still need the check in the outer loop?
>
> This check is limited to proactive reclaim (sc->proactive) to avoid
> affecting reactive reclaim paths, and wrapped in unlikely() as it is a
> slow path.
>
> Signed-off-by: Richard Chang <richardycc@google.com>
> ---
> mm/vmscan.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 35c3bb15ae96..fb472e924fc7 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -4929,6 +4929,9 @@ static bool should_abort_scan(struct lruvec *lruvec, struct scan_control *sc)
> int i;
> enum zone_watermarks mark;
>
> + if (unlikely(sc->proactive && signal_pending(current)))
> + return true;
> +
> if (sc->nr_reclaimed >= max(sc->nr_to_reclaim, compact_gap(sc->order)))
> return true;
>
> --
> 2.55.0.rc2.803.g1fd1e6609c-goog
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread