From: Wei Liu Date: Wed, 29 Apr 2020 10:41:44 +0000 (+0100) Subject: x86/hyperv: stash and use the configured max VP index X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~301 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b58dc6dbfa3a038c5a22f06861a7652da80eca28;p=xen.git 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 Reviewed-by: Roger Pau Monné --- diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c index 91a6782cd9..84221b7514 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 354fc7f685..fea3e291e9 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 1d723d6ee6..f249b25925 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 bec61c2afd..2c5f421b7b 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 )