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

Re: [Xen-devel] [PATCH 6/8] x86/hyperv: provide percpu hypercall input page



On Sun, 29 Dec 2019 at 18:35, Wei Liu <wl@xxxxxxx> wrote:
>
> Hyper-V's input / output argument must be 8 bytes aligned an not cross
> page boundary. The easiest way to satisfy those requirements is to use
> percpu page.
>
> For the foreseeable future we only need to provide input for TLB
> and APIC hypercalls, so skip setting up an output page.
>
> The page tracking structure is not bound to hypercall because it is a
> common pattern for Xen to write guest physical address to Hyper-V while
> at the same time accessing the page via a pointer.
>
> We will also need to provide an ap_setup hook for secondary cpus to
> setup its own input page.
>
> Signed-off-by: Wei Liu <liuwe@xxxxxxxxxxxxx>

Reviewed-by: Paul Durrant <paul@xxxxxxx>

> ---
>  xen/arch/x86/guest/hyperv/hyperv.c | 26 ++++++++++++++++++++++++++
>  xen/include/asm-x86/guest/hyperv.h |  8 ++++++++
>  2 files changed, 34 insertions(+)
>
> diff --git a/xen/arch/x86/guest/hyperv/hyperv.c 
> b/xen/arch/x86/guest/hyperv/hyperv.c
> index 438910c8cb..67667936e9 100644
> --- a/xen/arch/x86/guest/hyperv/hyperv.c
> +++ b/xen/arch/x86/guest/hyperv/hyperv.c
> @@ -28,6 +28,7 @@ struct ms_hyperv_info __read_mostly ms_hyperv;
>
>  void *hv_hypercall;
>  static struct page_info *hv_hypercall_page;
> +DEFINE_PER_CPU_READ_MOSTLY(struct hyperv_pcpu_page, hv_pcpu_input_arg);
>
>  static const struct hypervisor_ops ops;
>  const struct hypervisor_ops *__init hyperv_probe(void)
> @@ -96,14 +97,39 @@ static void __init setup_hypercall_page(void)
>      wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
>  }
>
> +static void setup_hypercall_pcpu_arg(void)
> +{
> +    struct page_info *pg;
> +    void *mapping;
> +    unsigned int cpu = smp_processor_id();
> +
> +    pg = alloc_domheap_page(NULL, 0);
> +    if ( !pg )
> +        panic("Failed to setup hypercall input page for %u\n", cpu);
> +
> +    mapping = __map_domain_page_global(pg);
> +    if ( !mapping )
> +        panic("Failed to map hypercall input page for %u\n", cpu);
> +
> +    this_cpu(hv_pcpu_input_arg).maddr = page_to_maddr(pg);
> +    this_cpu(hv_pcpu_input_arg).mapping = mapping;
> +}
> +
>  static void __init setup(void)
>  {
>      setup_hypercall_page();
> +    setup_hypercall_pcpu_arg();
> +}
> +
> +static void ap_setup(void)
> +{
> +    setup_hypercall_pcpu_arg();
>  }
>
>  static const struct hypervisor_ops ops = {
>      .name = "Hyper-V",
>      .setup = setup,
> +    .ap_setup = ap_setup,
>  };
>
>  /*
> diff --git a/xen/include/asm-x86/guest/hyperv.h 
> b/xen/include/asm-x86/guest/hyperv.h
> index c7a7f32bd5..83f297468f 100644
> --- a/xen/include/asm-x86/guest/hyperv.h
> +++ b/xen/include/asm-x86/guest/hyperv.h
> @@ -51,6 +51,8 @@ static inline uint64_t hv_scale_tsc(uint64_t tsc, uint64_t 
> scale,
>
>  #ifdef CONFIG_HYPERV_GUEST
>
> +#include <xen/percpu.h>
> +
>  #include <asm/guest/hypervisor.h>
>
>  struct ms_hyperv_info {
> @@ -63,6 +65,12 @@ struct ms_hyperv_info {
>  };
>  extern struct ms_hyperv_info ms_hyperv;
>
> +struct hyperv_pcpu_page {
> +    paddr_t maddr;
> +    void *mapping;
> +};
> +DECLARE_PER_CPU(struct hyperv_pcpu_page, hv_pcpu_input_arg);
> +
>  const struct hypervisor_ops *hyperv_probe(void);
>
>  #else
> --
> 2.20.1
>

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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