This patch apply unbalance reclaim into MGLRU, if unbalance reclaim, will not scan other type folios. Signed-off-by: Huan Yang <link@xxxxxxxx> --- mm/vmscan.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 6ed06e73143a..9243a1f0d606 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4481,6 +4481,7 @@ static int isolate_folios(struct lruvec *lruvec, struct scan_control *sc, int sw int type; int scanned; int tier = -1; + bool unbalance; DEFINE_MIN_SEQ(lruvec); /* @@ -4488,7 +4489,13 @@ static int isolate_folios(struct lruvec *lruvec, struct scan_control *sc, int sw * available from the same generation, interpret swappiness 1 as file * first and 200 as anon first. */ - if (!swappiness) + if (unlikely(unbalance_file_reclaim(sc, swappiness))) { + unbalance = true; + type = LRU_GEN_FILE; + } else if (unlikely(unbalance_anon_reclaim(sc, swappiness))) { + unbalance = true; + type = LRU_GEN_ANON; + } else if (!swappiness) type = LRU_GEN_FILE; else if (min_seq[LRU_GEN_ANON] < min_seq[LRU_GEN_FILE]) type = LRU_GEN_ANON; @@ -4504,7 +4511,7 @@ static int isolate_folios(struct lruvec *lruvec, struct scan_control *sc, int sw tier = get_tier_idx(lruvec, type); scanned = scan_folios(lruvec, sc, type, tier, list); - if (scanned) + if (scanned || unbalance) break; type = !type; -- 2.34.1