On Tue, Apr 26, 2022 at 11:31 PM Aneesh Kumar K V <aneesh.kumar@xxxxxxxxxxxxx> wrote: > > On 4/27/22 10:08 AM, Yu Zhao wrote: > > On Tue, Apr 26, 2022 at 10:33 PM Aneesh Kumar K.V > > <aneesh.kumar@xxxxxxxxxxxxx> wrote: > >> > >> Yu Zhao <yuzhao@xxxxxxxxxx> writes: > >> > >> .... > >> > >> diff --git a/mm/rmap.c b/mm/rmap.c > >>> index fedb82371efe..7cb7ef29088a 100644 > >>> --- a/mm/rmap.c > >>> +++ b/mm/rmap.c > >>> @@ -73,6 +73,7 @@ > >>> #include <linux/page_idle.h> > >>> #include <linux/memremap.h> > >>> #include <linux/userfaultfd_k.h> > >>> +#include <linux/mm_inline.h> > >>> > >>> #include <asm/tlbflush.h> > >>> > >>> @@ -821,6 +822,12 @@ static bool folio_referenced_one(struct folio *folio, > >>> } > >>> > >>> if (pvmw.pte) { > >>> + if (lru_gen_enabled() && pte_young(*pvmw.pte) && > >>> + !(vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ))) { > >>> + lru_gen_look_around(&pvmw); > >>> + referenced++; > >>> + } > >> > >> Is it required to update referenced here? we do that below after > >> clearing the young bit. Or is the goal to identify whether we found any > >> young pte around? > > > > referenced++ is needed because lru_gen_look_around() also clears the > > young bit in pvmw.pte. And ptep_clear_flush_young_notify() will return > > false unless mmu notifier returns true. > > should we then use a mmu notifier variant of clear_young in > lru_gen_look_around() ? Generally multiple sets of page tables don't share the same memory locality. E.g., for kvm, its secondary page tables map to guest physical address space, whose locality is very different from typical virtual address space. In this case lru_gen_look_around() is generally not helpful. For this reason, we don't use the mmu notifier variants of pte_young() or clear_young().