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
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.