On Thu, Jun 9, 2022 at 3:52 AM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > On Tue, Jun 7, 2022 at 5:43 PM Barry Song <21cnbao@xxxxxxxxx> wrote: > > > > Given we used to have a flush for clear pte young in LRU, right now we are > > moving to nop in almost all cases for the flush unless the address becomes > > young exactly after look_around and before ptep_clear_flush_young_notify. > > It means we are actually dropping flush. So the question is, were we > > overcautious? we actually don't need the flush at all even without mglru? > > We stopped flushing the TLB on A bit clears on x86 back in 2014. > > See commit b13b1d2d8692 ("x86/mm: In the PTE swapout page reclaim case > clear the accessed bit instead of flushing the TLB"). This is true for x86, RISC-V, powerpc and S390. but it is not true for most platforms. There was an attempt to do the same thing in arm64: https://www.mail-archive.com/linux-kernel@xxxxxxxxxxxxxxx/msg1793830.html but arm64 still sent a nosync tlbi and depent on a deferred to dsb : https://www.mail-archive.com/linux-kernel@xxxxxxxxxxxxxxx/msg1794484.html Plus, generic code will also send a tlb flush: int ptep_clear_flush_young(struct vm_area_struct *vma, unsigned long address, pte_t *ptep) { int young; young = ptep_test_and_clear_young(vma, address, ptep); if (young) flush_tlb_page(vma, address); return young; } We used to use ptep_test_and_clear_young() only in rmap.c for page_referenced() in 2.6.0: https://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux-fullhistory.git/tree/mm/rmap.c?h=v2.6.0 int page_referenced(struct page * page) { ... if (ptep_test_and_clear_young(p)) ... } but in 2.6.12, it has been already ptep_clear_flush_young() in page_referenced_one() https://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux-fullhistory.git/tree/mm/rmap.c?h=v2.6.12 I failed to find the history to figure out the motivation for 2.6.12 to use ptep_clear_flush_young() in LRU, but I am still curious how using flush or not will affect LRU on those platforms whose ptep_clear_flush_young() and ptep_test_and_clear_young() are different. > > Linus Thanks Barry