• Rik van Riel's avatar
    x86/mm/tlb: Make lazy TLB mode lazier · ac031589
    Rik van Riel authored
    Lazy TLB mode can result in an idle CPU being woken up by a TLB flush,
    when all it really needs to do is reload %CR3 at the next context switch,
    assuming no page table pages got freed.
    
    Memory ordering is used to prevent race conditions between switch_mm_irqs_off,
    which checks whether .tlb_gen changed, and the TLB invalidation code, which
    increments .tlb_gen whenever page table entries get invalidated.
    
    The atomic increment in inc_mm_tlb_gen is its own barrier; the context
    switch code adds an explicit barrier between reading tlbstate.is_lazy and
    next->context.tlb_gen.
    
    Unlike the 2016 version of this patch, CPUs with cpu_tlbstate.is_lazy set
    are not removed from the mm_cpumask(mm), since that would prevent the TLB
    flush IPIs at page table free time from being sent to all the CPUs
    that need them.
    
    This patch reduces total CPU use in the system by about 1-2% for a
    memcache workload on two socket systems, and by about 1% for a heavily
    multi-process netperf between two systems.
    Tested-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarRik van Riel <riel@surriel.com>
    Acked-by: default avatarDave Hansen <dave.hansen@intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: efault@gmx.de
    Cc: kernel-team@fb.com
    Cc: luto@kernel.org
    Link: http://lkml.kernel.org/r/20180716190337.26133-5-riel@surriel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    ac031589
tlb.c 24.2 KB