lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sat, 25 May 2019 10:54:50 +0200 From: Juergen Gross <jgross@...e.com> To: Nadav Amit <namit@...are.com>, Ingo Molnar <mingo@...hat.com>, Peter Zijlstra <peterz@...radead.org>, Andy Lutomirski <luto@...nel.org> Cc: Borislav Petkov <bp@...en8.de>, linux-kernel@...r.kernel.org, "K. Y. Srinivasan" <kys@...rosoft.com>, Haiyang Zhang <haiyangz@...rosoft.com>, Stephen Hemminger <sthemmin@...rosoft.com>, Sasha Levin <sashal@...nel.org>, Thomas Gleixner <tglx@...utronix.de>, x86@...nel.org, Paolo Bonzini <pbonzini@...hat.com>, Dave Hansen <dave.hansen@...ux.intel.com>, Boris Ostrovsky <boris.ostrovsky@...cle.com>, linux-hyperv@...r.kernel.org, virtualization@...ts.linux-foundation.org, kvm@...r.kernel.org, xen-devel@...ts.xenproject.org Subject: Re: [RFC PATCH 5/6] x86/mm/tlb: Flush remote and local TLBs concurrently On 25/05/2019 10:22, Nadav Amit wrote: > To improve TLB shootdown performance, flush the remote and local TLBs > concurrently. Introduce flush_tlb_multi() that does so. The current > flush_tlb_others() interface is kept, since paravirtual interfaces need > to be adapted first before it can be removed. This is left for future > work. In such PV environments, TLB flushes are not performed, at this > time, concurrently. > > Add a static key to tell whether this new interface is supported. > > Cc: "K. Y. Srinivasan" <kys@...rosoft.com> > Cc: Haiyang Zhang <haiyangz@...rosoft.com> > Cc: Stephen Hemminger <sthemmin@...rosoft.com> > Cc: Sasha Levin <sashal@...nel.org> > Cc: Thomas Gleixner <tglx@...utronix.de> > Cc: Ingo Molnar <mingo@...hat.com> > Cc: Borislav Petkov <bp@...en8.de> > Cc: x86@...nel.org > Cc: Juergen Gross <jgross@...e.com> > Cc: Paolo Bonzini <pbonzini@...hat.com> > Cc: Dave Hansen <dave.hansen@...ux.intel.com> > Cc: Andy Lutomirski <luto@...nel.org> > Cc: Peter Zijlstra <peterz@...radead.org> > Cc: Boris Ostrovsky <boris.ostrovsky@...cle.com> > Cc: linux-hyperv@...r.kernel.org > Cc: linux-kernel@...r.kernel.org > Cc: virtualization@...ts.linux-foundation.org > Cc: kvm@...r.kernel.org > Cc: xen-devel@...ts.xenproject.org > Signed-off-by: Nadav Amit <namit@...are.com> > --- > arch/x86/hyperv/mmu.c | 2 + > arch/x86/include/asm/paravirt.h | 8 +++ > arch/x86/include/asm/paravirt_types.h | 6 ++ > arch/x86/include/asm/tlbflush.h | 6 ++ > arch/x86/kernel/kvm.c | 1 + > arch/x86/kernel/paravirt.c | 3 + > arch/x86/mm/tlb.c | 80 +++++++++++++++++++++++---- > arch/x86/xen/mmu_pv.c | 2 + > 8 files changed, 96 insertions(+), 12 deletions(-) > > diff --git a/arch/x86/hyperv/mmu.c b/arch/x86/hyperv/mmu.c > index e65d7fe6489f..ca28b400c87c 100644 > --- a/arch/x86/hyperv/mmu.c > +++ b/arch/x86/hyperv/mmu.c > @@ -233,4 +233,6 @@ void hyperv_setup_mmu_ops(void) > pr_info("Using hypercall for remote TLB flush\n"); > pv_ops.mmu.flush_tlb_others = hyperv_flush_tlb_others; > pv_ops.mmu.tlb_remove_table = tlb_remove_table; > + > + static_key_disable(&flush_tlb_multi_enabled.key); > } > diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h > index c25c38a05c1c..192be7254457 100644 > --- a/arch/x86/include/asm/paravirt.h > +++ b/arch/x86/include/asm/paravirt.h > @@ -47,6 +47,8 @@ static inline void slow_down_io(void) > #endif > } > > +DECLARE_STATIC_KEY_TRUE(flush_tlb_multi_enabled); > + > static inline void __flush_tlb(void) > { > PVOP_VCALL0(mmu.flush_tlb_user); > @@ -62,6 +64,12 @@ static inline void __flush_tlb_one_user(unsigned long addr) > PVOP_VCALL1(mmu.flush_tlb_one_user, addr); > } > > +static inline void flush_tlb_multi(const struct cpumask *cpumask, > + const struct flush_tlb_info *info) > +{ > + PVOP_VCALL2(mmu.flush_tlb_multi, cpumask, info); > +} > + > static inline void flush_tlb_others(const struct cpumask *cpumask, > const struct flush_tlb_info *info) > { > diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h > index 946f8f1f1efc..3a156e63c57d 100644 > --- a/arch/x86/include/asm/paravirt_types.h > +++ b/arch/x86/include/asm/paravirt_types.h > @@ -211,6 +211,12 @@ struct pv_mmu_ops { > void (*flush_tlb_user)(void); > void (*flush_tlb_kernel)(void); > void (*flush_tlb_one_user)(unsigned long addr); > + /* > + * flush_tlb_multi() is the preferred interface. When it is used, > + * flush_tlb_others() should return false. This comment does not make sense. flush_tlb_others() return type is void. Juergen
Powered by blists - more mailing lists