Re: [PATCH v10 07/14] mm: multi-gen LRU: exploit locality in rmap

From: Yu Zhao
Date: Wed Apr 27 2022 - 02:01:29 EST


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().