[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/hyperv: stash and use the configured max VP index
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@xxxxxxxxxxxxx> --- 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |