Re: [RFC PATCH 4/6] mm/mglru: report hot PUDs from the rmap feedback path

Baoquan He <[email protected]>
Newsgroups org.kvack.linux-mm
Message-ID <aofuTK6OOzC4lGUK@fedora>
On 08/15/26 at 07:36am, Barry Song wrote:
> On Thu, Aug 6, 2026 at 6:30 PM Baoquan He <[email protected]> wrote:
> >
> > lru_gen_look_around() marks the PMD of a young PTE found during the
> > eviction rmap walk, feeding hot regions back to the aging walker.
> > With the PUD-level filter in place, that PMD marking alone is not
> > enough: the next aging walk would test the containing PUD first and
> > skip the whole 1GB subtree if the PUD is unmarked, never reaching the
> > PMD. Mark the covering PUD as well, so regions whose hotness is only
> > observed by eviction keep getting re-scanned by aging.
> >
> > The PUD entry is re-derived from the mm page tables via pgd_offset()/
> > p4d_offset()/pud_offset(); it is only hashed, never dereferenced, and
> > the mmap lock held by the rmap walk keeps the table chain valid.
> >
> > Signed-off-by: Baoquan He <[email protected]>
> > ---
> >  mm/vmscan.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/mm/vmscan.c b/mm/vmscan.c
> > index 74edfe2a747d..ca0f06641adc 100644
> > --- a/mm/vmscan.c
> > +++ b/mm/vmscan.c
> > @@ -4416,8 +4416,14 @@ bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw, unsigned int nr)
> >         lazy_mmu_mode_disable();
> >
> >         /* feedback from rmap walkers to page table walkers */
> > -       if (mm_state && suitable_to_scan(i, young))
> > +       if (mm_state && suitable_to_scan(i, young)) {
> > +               /* the PUD entry covering the young PTEs scanned above */
> > +               pud_t *pud_p = pud_offset(p4d_offset(pgd_offset(vma->vm_mm, pvmw->address),
> > +                                                    pvmw->address), pvmw->address);
> > +
> >                 update_bloom_filter(mm_state, max_seq, pvmw->pmd);
> > +               update_pud_bloom_filter(mm_state, max_seq, pud_p);
> 
> Is there a case where all PMDs return suitable_to_scan() == false,
> but the PUD is still worth updating? Or, if only one PMD returns
> suitable_to_scan() == true while the other 511 return false, is the
> PUD still worth updating?
> It seems we can keep it simple. I was just thinking through some
> extreme cases — maybe I'm overthinking it.

Good questions.

The PUD update uses the same suitable_to_scan() gate as the PMD filter: 
walk_pte_range() returns suitable_to_scan(), just as lru_gen_look_around()
does. So a PUD is marked if any of its PMDs shows dense enough young
activity. If no PMD passes, the PUD is left unmarked by both paths on
purpose: sparse young pages don't justify walking the whole 1GB subtree. 
Those young pages in unmarked PMD/PUDs are not lost: they are deferred
to eviction, which doesn't check filters but checks their actual PTE young
bits via folio_referenced(). Young ones are kept , and lru_gen_look_around() 
then re-marks the covering PUD, or cold ones are reclaimed. So I'll keep it
simple.

> 
> > +       }
> >
> >         mem_cgroup_put(memcg);
> >
> 
> Best Regards
> Barry
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.