public inbox for linux-mm@kvack.org
 help / color / mirror / Atom feed
* [PATCHv2] mm: remove '!root_reclaim' checking in should_abort_scan()
@ 2026-03-17 12:30 zhaoyang.huang
  2026-03-17 13:50 ` Michal Hocko
  0 siblings, 1 reply; 2+ messages in thread
From: zhaoyang.huang @ 2026-03-17 12:30 UTC (permalink / raw)
  To: Andrew Morton, Michal Hocko, T . J . Mercier, linux-mm,
	linux-kernel, Zhaoyang Huang, steve.kang

From: Zhaoyang Huang <zhaoyang.huang@unisoc.com>

Nowadays, ANDROID system replaces madivse with memory.reclaim to implement
user space memory management which desires to reclaim a certain amount of
memcg's memory. However, oversized reclaiming and high latency are observed
[1] as there is no limitation over nr_reclaimed inside try_to_shrink_lruvec
when MGLRU enabled. Besides, this could also affect all none root_reclaim
such as reclaim_high etc.
For try_to_free_mem_cgroup_pages -> shrink_node_memcgs ->
shrink_lruvec -> lru_gen_shrink_lruvec -> try_to_shrink_lruvec, the
!root_reclaim(sc) check was there for reclaim fairness, which was
necessary before commit 'b82b530740b9' ("mm: vmscan: restore
incremental cgroup iteration") because the fairness depended on
attempted proportional reclaim from every memcg under the target
memcg. However after commit 'b82b530740b9' there is no longer a need
to visit every memcg to ensure fairness, horray. The problem is for
large lruvecs, the lack of a check against sc->nr_to_reclaim inside
try_to_shrink_lruvec (caused by the continued presence of the
!root_reclaim(sc) check) can cause overreclaim. The non-MGLRU
implementation in shrink_lruvec already checks nr_reclaimed against
nr_to_reclaim.

[1]
test log which shows a nr_to_reclaim=32 pages proactive reclaim ended with
nr_reclaimed=394.

[  485.100981] memcg iter ffffff8086535a00 nr_to_reclaim 32 nr_reclaimed 0
[  485.106927] memcg iter ffffff8086535a00 nr_to_reclaim 32 nr_reclaimed 127
[  485.109652] memcg iter ffffff80744e1400 nr_to_reclaim 32 nr_reclaimed 127
[  485.112255] memcg iter ffffff80744e4600 nr_to_reclaim 32 nr_reclaimed 127
[  485.115766] memcg iter ffffff8150306e00 nr_to_reclaim 32 nr_reclaimed 191
[  485.125635] memcg iter ffffff8157608a00 nr_to_reclaim 32 nr_reclaimed 191
[  485.131366] memcg iter ffffff8157754600 nr_to_reclaim 32 nr_reclaimed 216
[  485.136688] memcg iter ffffff8157752800 nr_to_reclaim 32 nr_reclaimed 216
[  485.140495] memcg iter ffffff8157755000 nr_to_reclaim 32 nr_reclaimed 216
[  485.147322] memcg iter ffffff8159461400 nr_to_reclaim 32 nr_reclaimed 216
[  485.150605] memcg iter ffffff8159466400 nr_to_reclaim 32 nr_reclaimed 216
[  485.158260] memcg iter ffffff8159460a00 nr_to_reclaim 32 nr_reclaimed 216
[  485.160819] memcg iter ffffff8159460000 nr_to_reclaim 32 nr_reclaimed 216
[  485.163200] memcg iter ffffff8159463c00 nr_to_reclaim 32 nr_reclaimed 216
[  485.171778] memcg iter ffffff808912ee00 nr_to_reclaim 32 nr_reclaimed 216
[  485.174156] memcg iter ffffff808912a800 nr_to_reclaim 32 nr_reclaimed 216
[  485.179110] memcg iter ffffff814bd3a800 nr_to_reclaim 32 nr_reclaimed 216
[  485.181537] memcg iter ffffff814bd39e00 nr_to_reclaim 32 nr_reclaimed 216
[  485.184877] memcg iter ffffff814bd3da00 nr_to_reclaim 32 nr_reclaimed 219
[  485.187245] memcg iter ffffff814bd38a00 nr_to_reclaim 32 nr_reclaimed 219
[  485.189654] memcg iter ffffff814bd38000 nr_to_reclaim 32 nr_reclaimed 219
[  485.192029] memcg iter ffffff814bd3bc00 nr_to_reclaim 32 nr_reclaimed 219
[  485.194509] memcg iter ffffff814bd39400 nr_to_reclaim 32 nr_reclaimed 283
[  485.197107] memcg iter ffffff814bd3c600 nr_to_reclaim 32 nr_reclaimed 330
[  485.201361] memcg iter ffffff814bd3ee00 nr_to_reclaim 32 nr_reclaimed 394

Suggested-by: T.J.Mercier <tjmercier@google.com>
Reviewed-by: T.J.Mercier <tjmercier@google.com>
Reviewed-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
---
Patchv2: update commit message
---
---
 mm/vmscan.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 0fc9373e8251..10f1e7d716ca 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -4839,10 +4839,6 @@ static bool should_abort_scan(struct lruvec *lruvec, struct scan_control *sc)
 	int i;
 	enum zone_watermarks mark;
 
-	/* don't abort memcg reclaim to ensure fairness */
-	if (!root_reclaim(sc))
-		return false;
-
 	if (sc->nr_reclaimed >= max(sc->nr_to_reclaim, compact_gap(sc->order)))
 		return true;
 
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-03-17 13:51 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-17 12:30 [PATCHv2] mm: remove '!root_reclaim' checking in should_abort_scan() zhaoyang.huang
2026-03-17 13:50 ` Michal Hocko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox