mm-mglru-batch-move-folios-to-the-second-oldest-gens-lru.patch removed from -mm tree
The quilt patch titled
Subject: mm/mglru: batch move folios to the second-oldest gen's LRU
has been removed from the -mm tree. Its filename was
mm-mglru-batch-move-folios-to-the-second-oldest-gens-lru.patch
This patch was dropped because it was merged into the mm-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: "Barry Song (Xiaomi)" <[email protected]>
Subject: mm/mglru: batch move folios to the second-oldest gen's LRU
Date: Wed, 2 Sep 2026 07:24:21 +0800
Detect folios that need to move from the oldest generation to the second-oldest generation, and batch-move them together. This can significantly reduce the sys time of inc_min_seq(), especially when the other type is significantly behind the preferred type.
---
mm/vmscan.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
mm/vmscan.c renamed from mm/vmscan.c~mm-mglru-batch-move-folios-to-the-second-oldest-gens-lru +19 -1
@@ -3936,6 +3936,19 @@ static void clear_mm_walk(void)kfree (walk); } +static inline void flush_lru_batch (struct list_head *head,struct list_head **batch_end, +struct list_head *dst) +{ +LIST_HEAD (movable); + +if (!*batch_end) +return ; + +list_cut_position (&movable, head, *batch_end); +list_splice_tail_init (&movable, dst); + *batch_end =NULL ; +} +static bool inc_min_seq (struct lruvec *lruvec,int type,int swappiness) {int zone;
@@ -3958,8 +3971,10 @@ static bool inc_min_seq(struct lruvec *l lru_gen_is_active(lruvec, target_gen));/* prevent cold/hot inversion if the type is evictable */ for (zone =0 ; zone <MAX_NR_ZONES ; zone++) { +struct list_head *target_list = &lrugen->folios[target_gen][type][zone];struct list_head *head = &lrugen->folios[old_gen][type][zone];struct list_head *pos = head->next; +struct list_head *batch_end =NULL ;long delta =0 ;while (pos != head) {
@@ -3984,7 +3999,7 @@ static bool inc_min_seq(struct lruvec *l*/ if (gen_increased) { delta += nr_pages; -list_move_tail (&folio->lru, &lrugen->folios[new_gen][type][zone]); + batch_end = &folio->lru;/* don't count the workingset being lazily promoted */ if (refs + workingset !=BIT (LRU_REFS_WIDTH ) +1 ) {
@@ -3994,11 +4009,14 @@ static bool inc_min_seq(struct lruvec *l lrugen->protected[hist][type][tier] + nr_pages); } }else { +flush_lru_batch (head, &batch_end, target_list);list_move (&folio->lru, &lrugen->folios[new_gen][type][zone]); }if (!--remaining)break ; } +flush_lru_batch (head, &batch_end, target_list); +WRITE_ONCE (lrugen->nr_pages[old_gen][type][zone], lrugen->nr_pages[old_gen][type][zone] - delta); WRITE_ONCE(lrugen->nr_pages[target_gen][type][zone],
_
Patches currently in -mm which might be from [email protected] are
mm-mglru-restore-accidentally-removed-seq-max_seq-check.patch