[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v5] x86/hvm/viridian: flush remote tlbs by hypercall



On Fri, Nov 20, 2015 at 09:55:12AM +0000, Paul Durrant wrote:
> The Microsoft Hypervisor Top Level Functional Spec. (section 3.4) defines
> two bits in CPUID leaf 0x40000004:EAX for the hypervisor to recommend
> whether or not to issue a hypercall for local or remote TLB flush.
> 
> Whilst it's doubtful whether using a hypercall for local TLB flush would
> be any more efficient than a specific INVLPG VMEXIT, a remote TLB flush
> may well be more efficiently done. This is because the alternative
> mechanism is to IPI all the vCPUs in question which (in the absence of
> APIC virtualisation) will require emulation and scheduling of the vCPUs
> only to have them immediately VMEXIT for local TLB flush.
> 
> This patch therefore adds a viridian option which, if selected, enables
> the hypercall for remote TLB flush and implements it using ASID
> invalidation for targetted vCPUs followed by an IPI only to the set of
> CPUs that happened to be running a targetted vCPU (which may be the empty
> set). The flush may be more severe than requested since the hypercall can
> request flush only for a specific address space (CR3) but Xen neither
> keeps a mapping of ASID to guest CR3 nor allows invalidation of a specific
> ASID, but on a host with contended CPUs performance is still likely to
> be better than a more specific flush using IPIs.
> 
> The implementation of the patch introduces per-vCPU viridian_init() and
> viridian_deinit() functions to allow a scratch cpumask to be allocated.
> This avoids needing to put this potentially large data structure on stack
> during hypercall processing. It also modifies the hypercall input and
> output bit-fields to allow a check for the 'fast' calling convention,
> and a white-space fix in the definition of HVMPV_feature_mask (to remove
> hard tabs).
> 
> Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
> Cc: Keir Fraser <keir@xxxxxxx>
> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> 
> v5:
>  - Make sure vcpu_mask is only compared against vcpu_id < 64
> 
> v4:
>  - Remove extraneous blank line in params.h
>  - Use __cpumask_set_cpu() rather than cpumask_set_cpu()
> 
> v3:
>  - Correct use of cpumask_var_t
>  - Extend comment to explain pcpu_mask flush
>  - Other cosmetic changes
> 
> v2:
>  - Re-name viridian_init/deinit() to viridian_vcpu_init/deinit()
>  - Use alloc/free_cpumask_var()
>  - Use hvm_copy_from_guest_phys() to get hypercall arguments
> ---
>  docs/man/xl.cfg.pod.5              |   6 ++
>  tools/libxl/libxl_dom.c            |   3 +
>  tools/libxl/libxl_types.idl        |   1 +
>  xen/arch/x86/hvm/hvm.c             |  12 ++++
>  xen/arch/x86/hvm/viridian.c        | 123 
> +++++++++++++++++++++++++++++++++----
>  xen/include/asm-x86/hvm/viridian.h |   4 ++
>  xen/include/asm-x86/perfc_defn.h   |   1 +
>  xen/include/public/hvm/params.h    |  13 ++--
>  8 files changed, 146 insertions(+), 17 deletions(-)
> 
> diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5
> index b63846a..1a88e36 100644
> --- a/docs/man/xl.cfg.pod.5
> +++ b/docs/man/xl.cfg.pod.5
> @@ -1466,6 +1466,12 @@ This set incorporates the Partition Reference TSC MSR. 
> This
>  enlightenment can improve performance of Windows 7 and Windows
>  Server 2008 R2 onwards.
>  
> +=item B<hcall_remote_tlb_flush>
> +
> +This set incorporates use of hypercalls for remote TLB flushing.
> +This enlightenment may improve performance of Windows guests running
> +on hosts with higher levels of (physical) CPU contention.
> +
>  =item B<defaults>
>  
>  This is a special value that enables the default set of groups, which
> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> index 44d481b..009ca9c 100644
> --- a/tools/libxl/libxl_dom.c
> +++ b/tools/libxl/libxl_dom.c
> @@ -251,6 +251,9 @@ static int hvm_set_viridian_features(libxl__gc *gc, 
> uint32_t domid,
>      if (libxl_bitmap_test(&enlightenments, 
> LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_TSC))
>          mask |= HVMPV_reference_tsc;
>  
> +    if (libxl_bitmap_test(&enlightenments, 
> LIBXL_VIRIDIAN_ENLIGHTENMENT_HCALL_REMOTE_TLB_FLUSH))
> +        mask |= HVMPV_hcall_remote_tlb_flush;
> +
>      if (mask != 0 &&
>          xc_hvm_param_set(CTX->xch,
>                           domid,
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 4d78f86..0aa5b9d 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -219,6 +219,7 @@ libxl_viridian_enlightenment = 
> Enumeration("viridian_enlightenment", [
>      (1, "freq"),
>      (2, "time_ref_count"),
>      (3, "reference_tsc"),
> +    (4, "hcall_remote_tlb_flush"),
>      ])
>  

Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.