]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/mglru: relocate the LRU scan batch limit to callers
authorKairui Song <kasong@tencent.com>
Mon, 27 Apr 2026 18:06:54 +0000 (02:06 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 4 Jun 2026 21:45:03 +0000 (14:45 -0700)
Same as active / inactive LRU, MGLRU isolates and scans folios in batches.
The batch split is done hidden deep in the helper, which makes the code
harder to follow.  The helper's arguments are also confusing since callers
usually request more folios than the batch size, so the helper almost
never processes the full requested amount.

Move the batch splitting into the top loop to make it cleaner, there
should be no behavior change.

Link: https://lore.kernel.org/20260428-mglru-reclaim-v7-3-02fabb92dc43@tencent.com
Signed-off-by: Kairui Song <kasong@tencent.com>
Reviewed-by: Axel Rasmussen <axelrasmussen@google.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Reviewed-by: Barry Song <baohua@kernel.org>
Reviewed-by: Chen Ridong <chenridong@huaweicloud.com>
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Chris Li <chrisl@kernel.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: David Stevens <stevensd@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Kalesh Singh <kaleshsingh@google.com>
Cc: Leno Hou <lenohou@gmail.com>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vernon Yang <vernon2gm@gmail.com>
Cc: Wei Xu <weixugc@google.com>
Cc: Yafang <laoar.shao@gmail.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Yu Zhao <yuzhao@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/vmscan.c

index 9c47a4aa825aa512397d5c066f41e8d1e54ec8bc..abe2ace8e326567b6a31a3915f59609af8638c92 100644 (file)
@@ -4699,10 +4699,10 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
        int scanned = 0;
        int isolated = 0;
        int skipped = 0;
-       int scan_batch = min(nr_to_scan, MAX_LRU_BATCH);
-       int remaining = scan_batch;
+       unsigned long remaining = nr_to_scan;
        struct lru_gen_folio *lrugen = &lruvec->lrugen;
 
+       VM_WARN_ON_ONCE(nr_to_scan > MAX_LRU_BATCH);
        VM_WARN_ON_ONCE(!list_empty(list));
 
        if (get_nr_gens(lruvec, type) == MIN_NR_GENS)
@@ -4755,7 +4755,7 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
        mod_lruvec_state(lruvec, item, isolated);
        mod_lruvec_state(lruvec, PGREFILL, sorted);
        mod_lruvec_state(lruvec, PGSCAN_ANON + type, isolated);
-       trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, scan_batch,
+       trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan,
                                scanned, skipped, isolated,
                                type ? LRU_INACTIVE_FILE : LRU_INACTIVE_ANON);
        if (type == LRU_GEN_FILE)
@@ -4991,7 +4991,7 @@ static bool should_abort_scan(struct lruvec *lruvec, struct scan_control *sc)
 
 static bool try_to_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
 {
-       long nr_to_scan;
+       long nr_batch, nr_to_scan;
        unsigned long scanned = 0;
        int swappiness = get_swappiness(lruvec, sc);
 
@@ -5002,7 +5002,8 @@ static bool try_to_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
                if (nr_to_scan <= 0)
                        break;
 
-               delta = evict_folios(nr_to_scan, lruvec, sc, swappiness);
+               nr_batch = min(nr_to_scan, MAX_LRU_BATCH);
+               delta = evict_folios(nr_batch, lruvec, sc, swappiness);
                if (!delta)
                        break;
 
@@ -5627,6 +5628,7 @@ static int run_aging(struct lruvec *lruvec, unsigned long seq,
 static int run_eviction(struct lruvec *lruvec, unsigned long seq, struct scan_control *sc,
                        int swappiness, unsigned long nr_to_reclaim)
 {
+       int nr_batch;
        DEFINE_MAX_SEQ(lruvec);
 
        if (seq + MIN_NR_GENS > max_seq)
@@ -5643,8 +5645,8 @@ static int run_eviction(struct lruvec *lruvec, unsigned long seq, struct scan_co
                if (sc->nr_reclaimed >= nr_to_reclaim)
                        return 0;
 
-               if (!evict_folios(nr_to_reclaim - sc->nr_reclaimed, lruvec, sc,
-                                 swappiness))
+               nr_batch = min(nr_to_reclaim - sc->nr_reclaimed, MAX_LRU_BATCH);
+               if (!evict_folios(nr_batch, lruvec, sc, swappiness))
                        return 0;
 
                cond_resched();