diff mbox series

[v3,4/5] x86/hyperv: retrieve vp_index from Hyper-V

Message ID 20200105164801.26278-5-liuwe@microsoft.com (mailing list archive)
State Superseded
Headers show
Series More Hyper-V infrastructure | expand

Commit Message

Wei Liu Jan. 5, 2020, 4:48 p.m. UTC
This will be useful when invoking hypercall that targets specific
vcpu(s).

Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
v2:
1. Fold into setup_pcpu_arg function
---
 xen/arch/x86/guest/hyperv/hyperv.c | 5 +++++
 xen/include/asm-x86/guest/hyperv.h | 1 +
 2 files changed, 6 insertions(+)

Comments

Paul Durrant Jan. 6, 2020, 9:59 a.m. UTC | #1
On Sun, 5 Jan 2020 at 16:49, Wei Liu <wl@xen.org> wrote:
>
> This will be useful when invoking hypercall that targets specific
> vcpu(s).
>
> Signed-off-by: Wei Liu <liuwe@microsoft.com>

Reviewed-by: Paul Durrant <paul@xen.org>

> ---
> v2:
> 1. Fold into setup_pcpu_arg function
> ---
>  xen/arch/x86/guest/hyperv/hyperv.c | 5 +++++
>  xen/include/asm-x86/guest/hyperv.h | 1 +
>  2 files changed, 6 insertions(+)
>
> diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c
> index 7e046dfc04..e5f258c946 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;
>
>  extern char hv_hypercall_page[];
>  DEFINE_PER_CPU_READ_MOSTLY(void *, hv_pcpu_input_arg);
> +DEFINE_PER_CPU_READ_MOSTLY(unsigned int, hv_vp_index);
>
>  static const struct hypervisor_ops ops;
>  const struct hypervisor_ops *__init hyperv_probe(void)
> @@ -87,6 +88,7 @@ static void __init setup_hypercall_page(void)
>  static void setup_hypercall_pcpu_arg(void)
>  {
>      void *mapping;
> +    uint64_t vp_index_msr;
>
>      mapping = alloc_xenheap_page();
>      if ( !mapping )
> @@ -94,6 +96,9 @@ static void setup_hypercall_pcpu_arg(void)
>                smp_processor_id());
>
>      this_cpu(hv_pcpu_input_arg) = mapping;
> +
> +    rdmsrl(HV_X64_MSR_VP_INDEX, vp_index_msr);
> +    this_cpu(hv_vp_index) = vp_index_msr;
>  }
>
>  static void __init setup(void)
> diff --git a/xen/include/asm-x86/guest/hyperv.h b/xen/include/asm-x86/guest/hyperv.h
> index 6cf2eab62f..bae06c8a3a 100644
> --- a/xen/include/asm-x86/guest/hyperv.h
> +++ b/xen/include/asm-x86/guest/hyperv.h
> @@ -66,6 +66,7 @@ struct ms_hyperv_info {
>  extern struct ms_hyperv_info ms_hyperv;
>
>  DECLARE_PER_CPU(void *, hv_pcpu_input_arg);
> +DECLARE_PER_CPU(unsigned int, hv_vp_index);
>
>  const struct hypervisor_ops *hyperv_probe(void);
>
> --
> 2.20.1
>
Jan Beulich Jan. 6, 2020, 10:31 a.m. UTC | #2
On 05.01.2020 17:48, Wei Liu wrote:
> --- a/xen/include/asm-x86/guest/hyperv.h
> +++ b/xen/include/asm-x86/guest/hyperv.h
> @@ -66,6 +66,7 @@ struct ms_hyperv_info {
>  extern struct ms_hyperv_info ms_hyperv;
>  
>  DECLARE_PER_CPU(void *, hv_pcpu_input_arg);
> +DECLARE_PER_CPU(unsigned int, hv_vp_index);

Same question here - will this need to be visible outside of the
file defining the variable? In the other patch as well as here,
if the answer is yes, the next question would be whether it needs
to be visible outside of xen/arch/x86/guest/hyperv/ (i.e. whether
it shouldn't live in a private header).

Jan
Wei Liu Jan. 7, 2020, 4:34 p.m. UTC | #3
On Mon, Jan 06, 2020 at 11:31:50AM +0100, Jan Beulich wrote:
> On 05.01.2020 17:48, Wei Liu wrote:
> > --- a/xen/include/asm-x86/guest/hyperv.h
> > +++ b/xen/include/asm-x86/guest/hyperv.h
> > @@ -66,6 +66,7 @@ struct ms_hyperv_info {
> >  extern struct ms_hyperv_info ms_hyperv;
> >  
> >  DECLARE_PER_CPU(void *, hv_pcpu_input_arg);
> > +DECLARE_PER_CPU(unsigned int, hv_vp_index);
> 
> Same question here - will this need to be visible outside of the
> file defining the variable? In the other patch as well as here,
> if the answer is yes, the next question would be whether it needs
> to be visible outside of xen/arch/x86/guest/hyperv/ (i.e. whether
> it shouldn't live in a private header).

Private header should be fine for now.

Wei.

> 
> Jan
diff mbox series

Patch

diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c
index 7e046dfc04..e5f258c946 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;
 
 extern char hv_hypercall_page[];
 DEFINE_PER_CPU_READ_MOSTLY(void *, hv_pcpu_input_arg);
+DEFINE_PER_CPU_READ_MOSTLY(unsigned int, hv_vp_index);
 
 static const struct hypervisor_ops ops;
 const struct hypervisor_ops *__init hyperv_probe(void)
@@ -87,6 +88,7 @@  static void __init setup_hypercall_page(void)
 static void setup_hypercall_pcpu_arg(void)
 {
     void *mapping;
+    uint64_t vp_index_msr;
 
     mapping = alloc_xenheap_page();
     if ( !mapping )
@@ -94,6 +96,9 @@  static void setup_hypercall_pcpu_arg(void)
               smp_processor_id());
 
     this_cpu(hv_pcpu_input_arg) = mapping;
+
+    rdmsrl(HV_X64_MSR_VP_INDEX, vp_index_msr);
+    this_cpu(hv_vp_index) = vp_index_msr;
 }
 
 static void __init setup(void)
diff --git a/xen/include/asm-x86/guest/hyperv.h b/xen/include/asm-x86/guest/hyperv.h
index 6cf2eab62f..bae06c8a3a 100644
--- a/xen/include/asm-x86/guest/hyperv.h
+++ b/xen/include/asm-x86/guest/hyperv.h
@@ -66,6 +66,7 @@  struct ms_hyperv_info {
 extern struct ms_hyperv_info ms_hyperv;
 
 DECLARE_PER_CPU(void *, hv_pcpu_input_arg);
+DECLARE_PER_CPU(unsigned int, hv_vp_index);
 
 const struct hypervisor_ops *hyperv_probe(void);