OSDN Git Service

x86/mm/tlb: Flush remote and local TLBs concurrently
authorNadav Amit <namit@vmware.com>
Sat, 20 Feb 2021 23:17:07 +0000 (15:17 -0800)
committerIngo Molnar <mingo@kernel.org>
Sat, 6 Mar 2021 11:59:10 +0000 (12:59 +0100)
commit4ce94eabac16b1d2c95762b40f49e5654ab288d7
tree16fd5d3124ad8ae61e9c22fecc24f9c91adec4e9
parent6035152d8eebe16a5bb60398d3e05dc7799067b0
x86/mm/tlb: Flush remote and local TLBs concurrently

To improve TLB shootdown performance, flush the remote and local TLBs
concurrently. Introduce flush_tlb_multi() that does so. Introduce
paravirtual versions of flush_tlb_multi() for KVM, Xen and hyper-v (Xen
and hyper-v are only compile-tested).

While the updated smp infrastructure is capable of running a function on
a single local core, it is not optimized for this case. The multiple
function calls and the indirect branch introduce some overhead, and
might make local TLB flushes slower than they were before the recent
changes.

Before calling the SMP infrastructure, check if only a local TLB flush
is needed to restore the lost performance in this common case. This
requires to check mm_cpumask() one more time, but unless this mask is
updated very frequently, this should impact performance negatively.

Signed-off-by: Nadav Amit <namit@vmware.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Michael Kelley <mikelley@microsoft.com> # Hyper-v parts
Reviewed-by: Juergen Gross <jgross@suse.com> # Xen and paravirt parts
Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: https://lore.kernel.org/r/20210220231712.2475218-5-namit@vmware.com
arch/x86/hyperv/mmu.c
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/paravirt_types.h
arch/x86/include/asm/tlbflush.h
arch/x86/include/asm/trace/hyperv.h
arch/x86/kernel/kvm.c
arch/x86/kernel/paravirt.c
arch/x86/mm/tlb.c
arch/x86/xen/mmu_pv.c
include/trace/events/xen.h