Re: [PATCH RFC 05/15] mm/mglru: move max_seq read into walk_update_folio
Baoquan He <[email protected]>
| Newsgroups | gmane.linux.kernel.cgroups,gmane.linux.kernel.mm,gmane.linux.kernel |
|---|---|
| Message-ID | <aoPCNxyRVpQFulwS@MiWiFi-R3L-srv> |
On 08/04/26 at 03:47am, Kairui Song via B4 Relay wrote: > From: Kairui Song <[email protected]> > > walk_pte_range(), walk_pmd_range_locked(), and lru_gen_look_around() > each read lrugen->max_seq to compute the target generation for > folio_update_gen(), then pass it as a parameter to > walk_update_folio(). Move the read into walk_update_folio() itself > so the callers no longer need to compute or pass the value. > > This is a pure refactoring: no functional change. > > Signed-off-by: Kairui Song <[email protected]> > --- > mm/vmscan.c | 29 ++++++++++++----------------- > 1 file changed, 12 insertions(+), 17 deletions(-) Nice clean up. Reviewed-by: Baoquan He <[email protected]> > > diff --git a/mm/vmscan.c b/mm/vmscan.c > index b02d2ec8ff4b..c2ea92c2b69e 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -3511,13 +3511,15 @@ static bool suitable_to_scan(int total, int young) > } > > static void walk_update_folio(struct lru_gen_mm_walk *walk, struct vm_area_struct *vma, > - struct folio *folio, int new_gen, bool dirty) > + struct lruvec *lruvec, struct folio *folio, bool dirty) > { > - int old_gen; > + int new_gen, old_gen; > > if (!folio) > return; > > + new_gen = lru_gen_from_seq(READ_ONCE(lruvec->lrugen.max_seq)); > + > if (dirty && !folio_test_dirty(folio) && > !(folio_test_anon(folio) && folio_test_swapbacked(folio) && > !folio_test_swapcache(folio))) > @@ -3548,8 +3550,6 @@ static bool walk_pte_range(pmd_t *pmd, unsigned long start, unsigned long end, > struct lru_gen_mm_walk *walk = args->private; > struct mem_cgroup *memcg = lruvec_memcg(walk->lruvec); > struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec); > - DEFINE_MAX_SEQ(walk->lruvec); > - int gen = lru_gen_from_seq(max_seq); > unsigned int nr; > pmd_t pmdval; > > @@ -3600,7 +3600,7 @@ static bool walk_pte_range(pmd_t *pmd, unsigned long start, unsigned long end, > continue; > > if (last != folio) { > - walk_update_folio(walk, args->vma, last, gen, dirty); > + walk_update_folio(walk, args->vma, walk->lruvec, last, dirty); > > last = folio; > dirty = false; > @@ -3613,7 +3613,7 @@ static bool walk_pte_range(pmd_t *pmd, unsigned long start, unsigned long end, > walk->mm_stats[MM_LEAF_YOUNG] += nr; > } > > - walk_update_folio(walk, args->vma, last, gen, dirty); > + walk_update_folio(walk, args->vma, walk->lruvec, last, dirty); > last = NULL; > > if (i < PTRS_PER_PTE && get_next_vma(PMD_MASK, PAGE_SIZE, args, &start, &end)) > @@ -3636,8 +3636,6 @@ static void walk_pmd_range_locked(pud_t *pud, unsigned long addr, struct vm_area > struct lru_gen_mm_walk *walk = args->private; > struct mem_cgroup *memcg = lruvec_memcg(walk->lruvec); > struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec); > - DEFINE_MAX_SEQ(walk->lruvec); > - int gen = lru_gen_from_seq(max_seq); > > VM_WARN_ON_ONCE(pud_leaf(*pud)); > > @@ -3691,7 +3689,7 @@ static void walk_pmd_range_locked(pud_t *pud, unsigned long addr, struct vm_area > goto next; > > if (last != folio) { > - walk_update_folio(walk, vma, last, gen, dirty); > + walk_update_folio(walk, vma, walk->lruvec, last, dirty); > > last = folio; > dirty = false; > @@ -3705,7 +3703,7 @@ static void walk_pmd_range_locked(pud_t *pud, unsigned long addr, struct vm_area > i = i > MIN_LRU_BATCH ? 0 : find_next_bit(bitmap, MIN_LRU_BATCH, i) + 1; > } while (i <= MIN_LRU_BATCH); > > - walk_update_folio(walk, vma, last, gen, dirty); > + walk_update_folio(walk, vma, walk->lruvec, last, dirty); > > lazy_mmu_mode_disable(); > spin_unlock(ptl); > @@ -4270,8 +4268,6 @@ bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw, unsigned int nr) > struct pglist_data *pgdat = folio_pgdat(folio); > struct lruvec *lruvec; > struct lru_gen_mm_state *mm_state; > - unsigned long max_seq; > - int gen; > > lockdep_assert_held(pvmw->ptl); > VM_WARN_ON_ONCE_FOLIO(folio_test_lru(folio), folio); > @@ -4308,8 +4304,6 @@ bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw, unsigned int nr) > > memcg = get_mem_cgroup_from_folio(folio); > lruvec = mem_cgroup_lruvec(memcg, pgdat); > - max_seq = READ_ONCE((lruvec)->lrugen.max_seq); > - gen = lru_gen_from_seq(max_seq); > mm_state = get_mm_state(lruvec); > > lazy_mmu_mode_enable(); > @@ -4341,7 +4335,7 @@ bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw, unsigned int nr) > continue; > > if (last != folio) { > - walk_update_folio(walk, vma, last, gen, dirty); > + walk_update_folio(walk, vma, lruvec, last, dirty); > > last = folio; > dirty = false; > @@ -4353,13 +4347,14 @@ bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw, unsigned int nr) > young += nr; > } > > - walk_update_folio(walk, vma, last, gen, dirty); > + walk_update_folio(walk, vma, lruvec, last, dirty); > > lazy_mmu_mode_disable(); > > /* feedback from rmap walkers to page table walkers */ > if (mm_state && suitable_to_scan(i, young)) > - update_bloom_filter(mm_state, max_seq, pvmw->pmd); > + update_bloom_filter(mm_state, READ_ONCE(lruvec->lrugen.max_seq), > + pvmw->pmd); > > mem_cgroup_put(memcg); > > > -- > 2.55.0 > >