[0/2] x86/hyperv: Exclude lazy TLB mode CPUs from enlightened TLB flushes

Message ID 1679922967-26582-1-git-send-email-mikelley@microsoft.com
Headers
Series x86/hyperv: Exclude lazy TLB mode CPUs from enlightened TLB flushes |

Message

Michael Kelley (LINUX) March 27, 2023, 1:16 p.m. UTC
  The Hyper-V enlightened TLB remote flush function does not exclude
lazy TLB mode CPUs like the equivalent native function. Limited
telemetry shows that up to 80% of the CPUs being flushed are in
lazy mode, so flushing them is unnecessary and wasteful.

The best place to exclude the lazy TLB mode CPUs is when copying
the Linux cpumask to the Hyper-V VPset data structure, since the
copying already processes CPUs one-by-one. Currently this copying
function has the capabilty to exclude the calling CPU. Generalize
this exclusion functionality to exclude CPUs based on a callback
function that is invoked for each CPU.  Then for TLB flushing,
use this callback function to check the lazy TLB mode status of
each targeted CPU.

Patch 1 of this series does the generalization, and fixes up the
one caller of the existing "exclude self" capability.

Patch 2 then implements the exclusion based on lazy TLB mode,
using the generalization from Patch 1.

Michael Kelley (2):
  x86/hyperv: Add callback filter to cpumask_to_vpset()
  x86/hyperv: Exclude lazy TLB mode CPUs from enlightened TLB flushes

 arch/x86/hyperv/hv_apic.c      | 12 ++++++++----
 arch/x86/hyperv/mmu.c          | 11 ++++++++++-
 include/asm-generic/mshyperv.h | 22 ++++++++++++++--------
 3 files changed, 32 insertions(+), 13 deletions(-)
  

Comments

Wei Liu April 13, 2023, 1:34 a.m. UTC | #1
On Mon, Mar 27, 2023 at 06:16:05AM -0700, Michael Kelley wrote:
> The Hyper-V enlightened TLB remote flush function does not exclude
> lazy TLB mode CPUs like the equivalent native function. Limited
> telemetry shows that up to 80% of the CPUs being flushed are in
> lazy mode, so flushing them is unnecessary and wasteful.
> 
> The best place to exclude the lazy TLB mode CPUs is when copying
> the Linux cpumask to the Hyper-V VPset data structure, since the
> copying already processes CPUs one-by-one. Currently this copying
> function has the capabilty to exclude the calling CPU. Generalize
> this exclusion functionality to exclude CPUs based on a callback
> function that is invoked for each CPU.  Then for TLB flushing,
> use this callback function to check the lazy TLB mode status of
> each targeted CPU.
> 
> Patch 1 of this series does the generalization, and fixes up the
> one caller of the existing "exclude self" capability.
> 
> Patch 2 then implements the exclusion based on lazy TLB mode,
> using the generalization from Patch 1.
> 
> Michael Kelley (2):
>   x86/hyperv: Add callback filter to cpumask_to_vpset()
>   x86/hyperv: Exclude lazy TLB mode CPUs from enlightened TLB flushes
> 
>  arch/x86/hyperv/hv_apic.c      | 12 ++++++++----
>  arch/x86/hyperv/mmu.c          | 11 ++++++++++-
>  include/asm-generic/mshyperv.h | 22 ++++++++++++++--------
>  3 files changed, 32 insertions(+), 13 deletions(-)

Applied to hyperv-next. Thanks.

> 
> -- 
> 1.8.3.1
>