From df91dc967a07c5d69b67048ecf2650f16ea5a016 Mon Sep 17 00:00:00 2001 From: Yu Zhao Date: Wed, 21 Dec 2022 21:19:00 -0700 Subject: [PATCH] BACKPORT: mm: multi-gen LRU: rename lrugen->lists[] to lrugen->pages[] lru_gen_page will be chained into per-node lists by the coming lrugen->list. Link: https://lkml.kernel.org/r/20221222041905.2431096-3-yuzhao@google.com Signed-off-by: Yu Zhao Cc: Johannes Weiner Cc: Jonathan Corbet Cc: Michael Larabel Cc: Michal Hocko Cc: Mike Rapoport Cc: Roman Gushchin Cc: Suren Baghdasaryan Signed-off-by: Andrew Morton Bug: 274865848 (cherry picked from commit 6df1b2212950aae2b2188c6645ea18e2a9e3fdd5) [Yu: Resolve conflicts over absence of folios on 5.15] Change-Id: Ic1ea00e3b4777ac9869b7a916eaff9000cc939fd Signed-off-by: T.J. Mercier --- include/linux/mm_inline.h | 4 ++-- include/linux/mmzone.h | 8 ++++---- mm/vmscan.c | 20 ++++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index 47910ce57cf5..2e6d6518ba55 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h @@ -247,9 +247,9 @@ static inline bool lru_gen_add_page(struct lruvec *lruvec, struct page *page, bo lru_gen_update_size(lruvec, page, -1, gen); /* for rotate_reclaimable_page() */ if (reclaiming) - list_add_tail(&page->lru, &lrugen->lists[gen][type][zone]); + list_add_tail(&page->lru, &lrugen->pages[gen][type][zone]); else - list_add(&page->lru, &lrugen->lists[gen][type][zone]); + list_add(&page->lru, &lrugen->pages[gen][type][zone]); return true; } diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index b641d3127c9f..67a93720eaa5 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -310,7 +310,7 @@ enum lruvec_flags { * They form a sliding window of a variable size [MIN_NR_GENS, MAX_NR_GENS]. An * offset within MAX_NR_GENS, i.e., gen, indexes the LRU list of the * corresponding generation. The gen counter in page->flags stores gen+1 while - * a page is on one of lrugen->lists[]. Otherwise it stores 0. + * a page is on one of lrugen->pages[]. Otherwise it stores 0. * * A page is added to the youngest generation on faulting. The aging needs to * check the accessed bit at least twice before handing this page over to the @@ -322,8 +322,8 @@ enum lruvec_flags { * rest of generations, if they exist, are considered inactive. See * lru_gen_is_active(). * - * PG_active is always cleared while a page is on one of lrugen->lists[] so that - * the aging needs not to worry about it. And it's set again when a page + * PG_active is always cleared while a page is on one of lrugen->pages[] so + * that the aging needs not to worry about it. And it's set again when a page * considered active is isolated for non-reclaiming purposes, e.g., migration. * See lru_gen_add_page() and lru_gen_del_page(). * @@ -410,7 +410,7 @@ struct lru_gen_page { /* the birth time of each generation in jiffies */ unsigned long timestamps[MAX_NR_GENS]; /* the multi-gen LRU lists, lazily sorted on eviction */ - struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; + struct list_head pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; /* the multi-gen LRU sizes, eventually consistent */ long nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; /* the exponential moving average of refaulted */ diff --git a/mm/vmscan.c b/mm/vmscan.c index 4aa979fc21dd..c5ab1e73339f 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4032,7 +4032,7 @@ static bool inc_min_seq(struct lruvec *lruvec, int type, bool can_swap) /* prevent cold/hot inversion if force_scan is true */ for (zone = 0; zone < MAX_NR_ZONES; zone++) { - struct list_head *head = &lrugen->lists[old_gen][type][zone]; + struct list_head *head = &lrugen->pages[old_gen][type][zone]; while (!list_empty(head)) { struct page *page = lru_to_page(head); @@ -4043,7 +4043,7 @@ static bool inc_min_seq(struct lruvec *lruvec, int type, bool can_swap) VM_WARN_ON_ONCE_PAGE(page_zonenum(page) != zone, page); new_gen = page_inc_gen(lruvec, page, false); - list_move_tail(&page->lru, &lrugen->lists[new_gen][type][zone]); + list_move_tail(&page->lru, &lrugen->pages[new_gen][type][zone]); if (!--remaining) return false; @@ -4071,7 +4071,7 @@ static bool try_to_inc_min_seq(struct lruvec *lruvec, bool can_swap) gen = lru_gen_from_seq(min_seq[type]); for (zone = 0; zone < MAX_NR_ZONES; zone++) { - if (!list_empty(&lrugen->lists[gen][type][zone])) + if (!list_empty(&lrugen->pages[gen][type][zone])) goto next; } @@ -4536,7 +4536,7 @@ static bool sort_page(struct lruvec *lruvec, struct page *page, int tier_idx) /* promoted */ if (gen != lru_gen_from_seq(lrugen->min_seq[type])) { - list_move(&page->lru, &lrugen->lists[gen][type][zone]); + list_move(&page->lru, &lrugen->pages[gen][type][zone]); return true; } @@ -4545,7 +4545,7 @@ static bool sort_page(struct lruvec *lruvec, struct page *page, int tier_idx) int hist = lru_hist_from_seq(lrugen->min_seq[type]); gen = page_inc_gen(lruvec, page, false); - list_move_tail(&page->lru, &lrugen->lists[gen][type][zone]); + list_move_tail(&page->lru, &lrugen->pages[gen][type][zone]); WRITE_ONCE(lrugen->protected[hist][type][tier - 1], lrugen->protected[hist][type][tier - 1] + delta); @@ -4557,7 +4557,7 @@ static bool sort_page(struct lruvec *lruvec, struct page *page, int tier_idx) if (PageLocked(page) || PageWriteback(page) || (type == LRU_GEN_FILE && PageDirty(page))) { gen = page_inc_gen(lruvec, page, true); - list_move(&page->lru, &lrugen->lists[gen][type][zone]); + list_move(&page->lru, &lrugen->pages[gen][type][zone]); return true; } @@ -4624,7 +4624,7 @@ static int scan_pages(struct lruvec *lruvec, struct scan_control *sc, for (zone = sc->reclaim_idx; zone >= 0; zone--) { LIST_HEAD(moved); int skipped = 0; - struct list_head *head = &lrugen->lists[gen][type][zone]; + struct list_head *head = &lrugen->pages[gen][type][zone]; while (!list_empty(head)) { struct page *page = lru_to_page(head); @@ -4998,7 +4998,7 @@ static bool __maybe_unused state_is_valid(struct lruvec *lruvec) int gen, type, zone; for_each_gen_type_zone(gen, type, zone) { - if (!list_empty(&lrugen->lists[gen][type][zone])) + if (!list_empty(&lrugen->pages[gen][type][zone])) return false; } } @@ -5043,7 +5043,7 @@ static bool drain_evictable(struct lruvec *lruvec) int remaining = MAX_LRU_BATCH; for_each_gen_type_zone(gen, type, zone) { - struct list_head *head = &lruvec->lrugen.lists[gen][type][zone]; + struct list_head *head = &lruvec->lrugen.pages[gen][type][zone]; while (!list_empty(head)) { bool success; @@ -5580,7 +5580,7 @@ void lru_gen_init_lruvec(struct lruvec *lruvec) lrugen->timestamps[i] = jiffies; for_each_gen_type_zone(gen, type, zone) - INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]); + INIT_LIST_HEAD(&lrugen->pages[gen][type][zone]); lruvec->mm_state.seq = MIN_NR_GENS; init_waitqueue_head(&lruvec->mm_state.wait);