* [PATCH] x86/hyperv: stash and use the configured max VP index
@ 2020-04-29 10:41 Wei Liu
2020-04-29 11:47 ` Wei Liu
0 siblings, 1 reply; 5+ messages in thread
From: Wei Liu @ 2020-04-29 10:41 UTC (permalink / raw)
To: Xen Development List
Cc: Wei Liu, Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Roger Pau Monné
The value returned from CPUID is the maximum number for virtual
processors supported by Hyper-V. It could be larger than the maximum
number of virtual processors configured.
Stash the configured number into a variable and use it in calculations.
Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
xen/arch/x86/guest/hyperv/hyperv.c | 4 ++++
xen/arch/x86/guest/hyperv/private.h | 1 +
xen/arch/x86/guest/hyperv/tlb.c | 2 +-
xen/arch/x86/guest/hyperv/util.c | 2 +-
4 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c
index 91a6782cd986..84221b751453 100644
--- a/xen/arch/x86/guest/hyperv/hyperv.c
+++ b/xen/arch/x86/guest/hyperv/hyperv.c
@@ -33,6 +33,7 @@ DEFINE_PER_CPU_READ_MOSTLY(void *, hv_input_page);
DEFINE_PER_CPU_READ_MOSTLY(void *, hv_vp_assist);
DEFINE_PER_CPU_READ_MOSTLY(unsigned int, hv_vp_index);
+unsigned int __read_mostly hv_max_vp_index;
static bool __read_mostly hcall_page_ready;
static uint64_t generate_guest_id(void)
@@ -143,6 +144,9 @@ static int setup_hypercall_pcpu_arg(void)
rdmsrl(HV_X64_MSR_VP_INDEX, vp_index_msr);
this_cpu(hv_vp_index) = vp_index_msr;
+ if ( vp_index_msr > hv_max_vp_index )
+ hv_max_vp_index = vp_index_msr;
+
return 0;
}
diff --git a/xen/arch/x86/guest/hyperv/private.h b/xen/arch/x86/guest/hyperv/private.h
index 354fc7f685a7..fea3e291e944 100644
--- a/xen/arch/x86/guest/hyperv/private.h
+++ b/xen/arch/x86/guest/hyperv/private.h
@@ -28,6 +28,7 @@
DECLARE_PER_CPU(void *, hv_input_page);
DECLARE_PER_CPU(void *, hv_vp_assist);
DECLARE_PER_CPU(unsigned int, hv_vp_index);
+extern unsigned int hv_max_vp_index;
static inline unsigned int hv_vp_index(unsigned int cpu)
{
diff --git a/xen/arch/x86/guest/hyperv/tlb.c b/xen/arch/x86/guest/hyperv/tlb.c
index 1d723d6ee679..0a44071481bd 100644
--- a/xen/arch/x86/guest/hyperv/tlb.c
+++ b/xen/arch/x86/guest/hyperv/tlb.c
@@ -166,7 +166,7 @@ int hyperv_flush_tlb(const cpumask_t *mask, const void *va,
{
unsigned int vpid = hv_vp_index(cpu);
- if ( vpid >= ms_hyperv.max_vp_index )
+ if ( vpid >= hv_max_vp_index )
{
local_irq_restore(irq_flags);
return -ENXIO;
diff --git a/xen/arch/x86/guest/hyperv/util.c b/xen/arch/x86/guest/hyperv/util.c
index bec61c2afd87..2c5f421b7bd9 100644
--- a/xen/arch/x86/guest/hyperv/util.c
+++ b/xen/arch/x86/guest/hyperv/util.c
@@ -33,7 +33,7 @@ int cpumask_to_vpset(struct hv_vpset *vpset,
{
int nr = 1;
unsigned int cpu, vcpu_bank, vcpu_offset;
- unsigned int max_banks = ms_hyperv.max_vp_index / 64;
+ unsigned int max_banks = hv_max_vp_index / 64;
/* Up to 64 banks can be represented by valid_bank_mask */
if ( max_banks > 64 )
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] x86/hyperv: stash and use the configured max VP index
2020-04-29 10:41 [PATCH] x86/hyperv: stash and use the configured max VP index Wei Liu
@ 2020-04-29 11:47 ` Wei Liu
2020-04-30 10:15 ` Roger Pau Monné
0 siblings, 1 reply; 5+ messages in thread
From: Wei Liu @ 2020-04-29 11:47 UTC (permalink / raw)
To: Xen Development List
Cc: Wei Liu, Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Roger Pau Monné
On Wed, Apr 29, 2020 at 11:41:44AM +0100, Wei Liu wrote:
> The value returned from CPUID is the maximum number for virtual
> processors supported by Hyper-V. It could be larger than the maximum
> number of virtual processors configured.
>
> Stash the configured number into a variable and use it in calculations.
>
> Signed-off-by: Wei Liu <liuwe@microsoft.com>
> ---
> xen/arch/x86/guest/hyperv/hyperv.c | 4 ++++
> xen/arch/x86/guest/hyperv/private.h | 1 +
> xen/arch/x86/guest/hyperv/tlb.c | 2 +-
> xen/arch/x86/guest/hyperv/util.c | 2 +-
> 4 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c
> index 91a6782cd986..84221b751453 100644
> --- a/xen/arch/x86/guest/hyperv/hyperv.c
> +++ b/xen/arch/x86/guest/hyperv/hyperv.c
> @@ -33,6 +33,7 @@ DEFINE_PER_CPU_READ_MOSTLY(void *, hv_input_page);
> DEFINE_PER_CPU_READ_MOSTLY(void *, hv_vp_assist);
> DEFINE_PER_CPU_READ_MOSTLY(unsigned int, hv_vp_index);
>
> +unsigned int __read_mostly hv_max_vp_index;
> static bool __read_mostly hcall_page_ready;
>
> static uint64_t generate_guest_id(void)
> @@ -143,6 +144,9 @@ static int setup_hypercall_pcpu_arg(void)
> rdmsrl(HV_X64_MSR_VP_INDEX, vp_index_msr);
> this_cpu(hv_vp_index) = vp_index_msr;
>
> + if ( vp_index_msr > hv_max_vp_index )
> + hv_max_vp_index = vp_index_msr;
> +
> return 0;
> }
>
> diff --git a/xen/arch/x86/guest/hyperv/private.h b/xen/arch/x86/guest/hyperv/private.h
> index 354fc7f685a7..fea3e291e944 100644
> --- a/xen/arch/x86/guest/hyperv/private.h
> +++ b/xen/arch/x86/guest/hyperv/private.h
> @@ -28,6 +28,7 @@
> DECLARE_PER_CPU(void *, hv_input_page);
> DECLARE_PER_CPU(void *, hv_vp_assist);
> DECLARE_PER_CPU(unsigned int, hv_vp_index);
> +extern unsigned int hv_max_vp_index;
>
> static inline unsigned int hv_vp_index(unsigned int cpu)
> {
> diff --git a/xen/arch/x86/guest/hyperv/tlb.c b/xen/arch/x86/guest/hyperv/tlb.c
> index 1d723d6ee679..0a44071481bd 100644
> --- a/xen/arch/x86/guest/hyperv/tlb.c
> +++ b/xen/arch/x86/guest/hyperv/tlb.c
> @@ -166,7 +166,7 @@ int hyperv_flush_tlb(const cpumask_t *mask, const void *va,
> {
> unsigned int vpid = hv_vp_index(cpu);
>
> - if ( vpid >= ms_hyperv.max_vp_index )
> + if ( vpid >= hv_max_vp_index )
I think the >= should be changed to > here.
Wei.
> {
> local_irq_restore(irq_flags);
> return -ENXIO;
> diff --git a/xen/arch/x86/guest/hyperv/util.c b/xen/arch/x86/guest/hyperv/util.c
> index bec61c2afd87..2c5f421b7bd9 100644
> --- a/xen/arch/x86/guest/hyperv/util.c
> +++ b/xen/arch/x86/guest/hyperv/util.c
> @@ -33,7 +33,7 @@ int cpumask_to_vpset(struct hv_vpset *vpset,
> {
> int nr = 1;
> unsigned int cpu, vcpu_bank, vcpu_offset;
> - unsigned int max_banks = ms_hyperv.max_vp_index / 64;
> + unsigned int max_banks = hv_max_vp_index / 64;
>
> /* Up to 64 banks can be represented by valid_bank_mask */
> if ( max_banks > 64 )
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] x86/hyperv: stash and use the configured max VP index
2020-04-29 11:47 ` Wei Liu
@ 2020-04-30 10:15 ` Roger Pau Monné
2020-04-30 10:21 ` Roger Pau Monné
0 siblings, 1 reply; 5+ messages in thread
From: Roger Pau Monné @ 2020-04-30 10:15 UTC (permalink / raw)
To: Wei Liu
Cc: Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Xen Development List
On Wed, Apr 29, 2020 at 11:47:18AM +0000, Wei Liu wrote:
> On Wed, Apr 29, 2020 at 11:41:44AM +0100, Wei Liu wrote:
> > The value returned from CPUID is the maximum number for virtual
> > processors supported by Hyper-V. It could be larger than the maximum
> > number of virtual processors configured.
> >
> > Stash the configured number into a variable and use it in calculations.
> >
> > Signed-off-by: Wei Liu <liuwe@microsoft.com>
> > ---
> > xen/arch/x86/guest/hyperv/hyperv.c | 4 ++++
> > xen/arch/x86/guest/hyperv/private.h | 1 +
> > xen/arch/x86/guest/hyperv/tlb.c | 2 +-
> > xen/arch/x86/guest/hyperv/util.c | 2 +-
> > 4 files changed, 7 insertions(+), 2 deletions(-)
> >
> > diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c
> > index 91a6782cd986..84221b751453 100644
> > --- a/xen/arch/x86/guest/hyperv/hyperv.c
> > +++ b/xen/arch/x86/guest/hyperv/hyperv.c
> > @@ -33,6 +33,7 @@ DEFINE_PER_CPU_READ_MOSTLY(void *, hv_input_page);
> > DEFINE_PER_CPU_READ_MOSTLY(void *, hv_vp_assist);
> > DEFINE_PER_CPU_READ_MOSTLY(unsigned int, hv_vp_index);
> >
> > +unsigned int __read_mostly hv_max_vp_index;
> > static bool __read_mostly hcall_page_ready;
> >
> > static uint64_t generate_guest_id(void)
> > @@ -143,6 +144,9 @@ static int setup_hypercall_pcpu_arg(void)
> > rdmsrl(HV_X64_MSR_VP_INDEX, vp_index_msr);
> > this_cpu(hv_vp_index) = vp_index_msr;
> >
> > + if ( vp_index_msr > hv_max_vp_index )
> > + hv_max_vp_index = vp_index_msr;
> > +
> > return 0;
> > }
> >
> > diff --git a/xen/arch/x86/guest/hyperv/private.h b/xen/arch/x86/guest/hyperv/private.h
> > index 354fc7f685a7..fea3e291e944 100644
> > --- a/xen/arch/x86/guest/hyperv/private.h
> > +++ b/xen/arch/x86/guest/hyperv/private.h
> > @@ -28,6 +28,7 @@
> > DECLARE_PER_CPU(void *, hv_input_page);
> > DECLARE_PER_CPU(void *, hv_vp_assist);
> > DECLARE_PER_CPU(unsigned int, hv_vp_index);
> > +extern unsigned int hv_max_vp_index;
> >
> > static inline unsigned int hv_vp_index(unsigned int cpu)
> > {
> > diff --git a/xen/arch/x86/guest/hyperv/tlb.c b/xen/arch/x86/guest/hyperv/tlb.c
> > index 1d723d6ee679..0a44071481bd 100644
> > --- a/xen/arch/x86/guest/hyperv/tlb.c
> > +++ b/xen/arch/x86/guest/hyperv/tlb.c
> > @@ -166,7 +166,7 @@ int hyperv_flush_tlb(const cpumask_t *mask, const void *va,
> > {
> > unsigned int vpid = hv_vp_index(cpu);
> >
> > - if ( vpid >= ms_hyperv.max_vp_index )
> > + if ( vpid >= hv_max_vp_index )
>
> I think the >= should be changed to > here.
I agree. With this fixed:
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Thanks!
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] x86/hyperv: stash and use the configured max VP index
2020-04-30 10:15 ` Roger Pau Monné
@ 2020-04-30 10:21 ` Roger Pau Monné
2020-05-06 9:37 ` Wei Liu
0 siblings, 1 reply; 5+ messages in thread
From: Roger Pau Monné @ 2020-04-30 10:21 UTC (permalink / raw)
To: Wei Liu
Cc: Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Xen Development List
On Thu, Apr 30, 2020 at 12:15:58PM +0200, Roger Pau Monné wrote:
> On Wed, Apr 29, 2020 at 11:47:18AM +0000, Wei Liu wrote:
> > On Wed, Apr 29, 2020 at 11:41:44AM +0100, Wei Liu wrote:
> > > The value returned from CPUID is the maximum number for virtual
> > > processors supported by Hyper-V. It could be larger than the maximum
> > > number of virtual processors configured.
> > >
> > > Stash the configured number into a variable and use it in calculations.
> > >
> > > Signed-off-by: Wei Liu <liuwe@microsoft.com>
> > > ---
> > > xen/arch/x86/guest/hyperv/hyperv.c | 4 ++++
> > > xen/arch/x86/guest/hyperv/private.h | 1 +
> > > xen/arch/x86/guest/hyperv/tlb.c | 2 +-
> > > xen/arch/x86/guest/hyperv/util.c | 2 +-
> > > 4 files changed, 7 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c
> > > index 91a6782cd986..84221b751453 100644
> > > --- a/xen/arch/x86/guest/hyperv/hyperv.c
> > > +++ b/xen/arch/x86/guest/hyperv/hyperv.c
> > > @@ -33,6 +33,7 @@ DEFINE_PER_CPU_READ_MOSTLY(void *, hv_input_page);
> > > DEFINE_PER_CPU_READ_MOSTLY(void *, hv_vp_assist);
> > > DEFINE_PER_CPU_READ_MOSTLY(unsigned int, hv_vp_index);
> > >
> > > +unsigned int __read_mostly hv_max_vp_index;
> > > static bool __read_mostly hcall_page_ready;
> > >
> > > static uint64_t generate_guest_id(void)
> > > @@ -143,6 +144,9 @@ static int setup_hypercall_pcpu_arg(void)
> > > rdmsrl(HV_X64_MSR_VP_INDEX, vp_index_msr);
> > > this_cpu(hv_vp_index) = vp_index_msr;
> > >
> > > + if ( vp_index_msr > hv_max_vp_index )
> > > + hv_max_vp_index = vp_index_msr;
> > > +
> > > return 0;
> > > }
> > >
> > > diff --git a/xen/arch/x86/guest/hyperv/private.h b/xen/arch/x86/guest/hyperv/private.h
> > > index 354fc7f685a7..fea3e291e944 100644
> > > --- a/xen/arch/x86/guest/hyperv/private.h
> > > +++ b/xen/arch/x86/guest/hyperv/private.h
> > > @@ -28,6 +28,7 @@
> > > DECLARE_PER_CPU(void *, hv_input_page);
> > > DECLARE_PER_CPU(void *, hv_vp_assist);
> > > DECLARE_PER_CPU(unsigned int, hv_vp_index);
> > > +extern unsigned int hv_max_vp_index;
> > >
> > > static inline unsigned int hv_vp_index(unsigned int cpu)
> > > {
> > > diff --git a/xen/arch/x86/guest/hyperv/tlb.c b/xen/arch/x86/guest/hyperv/tlb.c
> > > index 1d723d6ee679..0a44071481bd 100644
> > > --- a/xen/arch/x86/guest/hyperv/tlb.c
> > > +++ b/xen/arch/x86/guest/hyperv/tlb.c
> > > @@ -166,7 +166,7 @@ int hyperv_flush_tlb(const cpumask_t *mask, const void *va,
> > > {
> > > unsigned int vpid = hv_vp_index(cpu);
> > >
> > > - if ( vpid >= ms_hyperv.max_vp_index )
> > > + if ( vpid >= hv_max_vp_index )
> >
> > I think the >= should be changed to > here.
>
> I agree. With this fixed:
>
> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
FWIW, I think it should also be nice to add an ASSERT_UNREACHABLE in
the if body, as now it shouldn't be possible for vpid to be greater
than hv_max_vp_index unless something has gone really wrong?
Roger.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] x86/hyperv: stash and use the configured max VP index
2020-04-30 10:21 ` Roger Pau Monné
@ 2020-05-06 9:37 ` Wei Liu
0 siblings, 0 replies; 5+ messages in thread
From: Wei Liu @ 2020-05-06 9:37 UTC (permalink / raw)
To: Roger Pau Monné
Cc: Wei Liu, Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Xen Development List
On Thu, Apr 30, 2020 at 12:21:18PM +0200, Roger Pau Monné wrote:
> On Thu, Apr 30, 2020 at 12:15:58PM +0200, Roger Pau Monné wrote:
> > On Wed, Apr 29, 2020 at 11:47:18AM +0000, Wei Liu wrote:
> > > On Wed, Apr 29, 2020 at 11:41:44AM +0100, Wei Liu wrote:
> > > > The value returned from CPUID is the maximum number for virtual
> > > > processors supported by Hyper-V. It could be larger than the maximum
> > > > number of virtual processors configured.
> > > >
> > > > Stash the configured number into a variable and use it in calculations.
> > > >
> > > > Signed-off-by: Wei Liu <liuwe@microsoft.com>
> > > > ---
> > > > xen/arch/x86/guest/hyperv/hyperv.c | 4 ++++
> > > > xen/arch/x86/guest/hyperv/private.h | 1 +
> > > > xen/arch/x86/guest/hyperv/tlb.c | 2 +-
> > > > xen/arch/x86/guest/hyperv/util.c | 2 +-
> > > > 4 files changed, 7 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c
> > > > index 91a6782cd986..84221b751453 100644
> > > > --- a/xen/arch/x86/guest/hyperv/hyperv.c
> > > > +++ b/xen/arch/x86/guest/hyperv/hyperv.c
> > > > @@ -33,6 +33,7 @@ DEFINE_PER_CPU_READ_MOSTLY(void *, hv_input_page);
> > > > DEFINE_PER_CPU_READ_MOSTLY(void *, hv_vp_assist);
> > > > DEFINE_PER_CPU_READ_MOSTLY(unsigned int, hv_vp_index);
> > > >
> > > > +unsigned int __read_mostly hv_max_vp_index;
> > > > static bool __read_mostly hcall_page_ready;
> > > >
> > > > static uint64_t generate_guest_id(void)
> > > > @@ -143,6 +144,9 @@ static int setup_hypercall_pcpu_arg(void)
> > > > rdmsrl(HV_X64_MSR_VP_INDEX, vp_index_msr);
> > > > this_cpu(hv_vp_index) = vp_index_msr;
> > > >
> > > > + if ( vp_index_msr > hv_max_vp_index )
> > > > + hv_max_vp_index = vp_index_msr;
> > > > +
> > > > return 0;
> > > > }
> > > >
> > > > diff --git a/xen/arch/x86/guest/hyperv/private.h b/xen/arch/x86/guest/hyperv/private.h
> > > > index 354fc7f685a7..fea3e291e944 100644
> > > > --- a/xen/arch/x86/guest/hyperv/private.h
> > > > +++ b/xen/arch/x86/guest/hyperv/private.h
> > > > @@ -28,6 +28,7 @@
> > > > DECLARE_PER_CPU(void *, hv_input_page);
> > > > DECLARE_PER_CPU(void *, hv_vp_assist);
> > > > DECLARE_PER_CPU(unsigned int, hv_vp_index);
> > > > +extern unsigned int hv_max_vp_index;
> > > >
> > > > static inline unsigned int hv_vp_index(unsigned int cpu)
> > > > {
> > > > diff --git a/xen/arch/x86/guest/hyperv/tlb.c b/xen/arch/x86/guest/hyperv/tlb.c
> > > > index 1d723d6ee679..0a44071481bd 100644
> > > > --- a/xen/arch/x86/guest/hyperv/tlb.c
> > > > +++ b/xen/arch/x86/guest/hyperv/tlb.c
> > > > @@ -166,7 +166,7 @@ int hyperv_flush_tlb(const cpumask_t *mask, const void *va,
> > > > {
> > > > unsigned int vpid = hv_vp_index(cpu);
> > > >
> > > > - if ( vpid >= ms_hyperv.max_vp_index )
> > > > + if ( vpid >= hv_max_vp_index )
> > >
> > > I think the >= should be changed to > here.
> >
> > I agree. With this fixed:
> >
> > Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
>
> FWIW, I think it should also be nice to add an ASSERT_UNREACHABLE in
> the if body, as now it shouldn't be possible for vpid to be greater
> than hv_max_vp_index unless something has gone really wrong?
At some point I will initialise vpid to (uint32_t)-1 so it could go over
hv_max_vp_index if there is a bug in code.
Wei.
>
> Roger.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-05-06 9:38 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-29 10:41 [PATCH] x86/hyperv: stash and use the configured max VP index Wei Liu
2020-04-29 11:47 ` Wei Liu
2020-04-30 10:15 ` Roger Pau Monné
2020-04-30 10:21 ` Roger Pau Monné
2020-05-06 9:37 ` Wei Liu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).