X86: Fix the circular dependency in IPI enlightenment.
Subsystems (2)
PATCH 1/1 X86: Fix the circular dependency in IPI enlightenment.
From: "K. Y. Srinivasan" <[email protected]>
The IPI hypercalls depend on being able to map the Linux notion of CPU ID to the hypervisor's notion of the CPU ID. The array hv_vp_index[] provides this mapping. Code for populating this array depends on the IPI functionality. Break this circular dependency.
--- arch/x86/hyperv/hv_apic.c | 5 +++++ arch/x86/hyperv/hv_init.c | 3 +++ arch/x86/include/asm/mshyperv.h | 2 ++ 3 files changed, 10 insertions(+)
arch/x86/hyperv/hv_apic.c +5 -0
@@ -114,6 +114,8 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector) ipi_arg->vp_set.format =HV_GENERIC_SET_SPARSE_4K ; nr_bank =cpumask_to_vpset (&(ipi_arg->vp_set), mask); } +if (nr_bank ==-1 ) + goto ipi_mask_ex_done;if (!nr_bank) ipi_arg->vp_set.format =HV_GENERIC_SET_ALL ;
@@ -158,6 +160,9 @@ static bool __send_ipi_mask(const struct cpumask *mask, int vector)for_each_cpu (cur_cpu, mask) { vcpu =hv_cpu_number_to_vp_number (cur_cpu); +if (vcpu ==-1 ) + goto ipi_mask_done; +/* * This particular version of the IPI hypercall can * only target upto 64 CPUs.
arch/x86/hyperv/hv_init.c +3 -0
@@ -293,6 +293,9 @@ void __init hyperv_init(void)if (!hv_vp_index)return ; +for (i =0 ; i <num_possible_cpus (); i++) + hv_vp_index[i] =-1 ; + hv_vp_assist_page =kcalloc (num_possible_cpus (),sizeof (*hv_vp_assist_page),GFP_KERNEL );if (!hv_vp_assist_page) {
arch/x86/include/asm/mshyperv.h +2 -0
@@ -285,6 +285,8 @@ static inline int cpumask_to_vpset(struct hv_vpset *vpset,*/ for_each_cpu (cpu, cpus) { vcpu =hv_cpu_number_to_vp_number (cpu); +if (vcpu ==-1 ) +return -1 ; vcpu_bank = vcpu /64 ; vcpu_offset = vcpu %64 ; __set_bit(vcpu_offset, (unsigned long *)
Signature · 1 line
2.17.1
Quoted 13 lines
-----Original Message-----
From: [email protected] <[email protected]>
Sent: Tuesday, July 3, 2018 3:37 PM
To: [email protected]; [email protected]; linux- [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Stephen Hemminger <[email protected]>; Michael Kelley (EOSG) <[email protected]>; [email protected]
Cc: KY Srinivasan <[email protected]>
Subject: [PATCH 1/1] X86: Fix the circular dependency in IPI enlightenment.
Quoted 8 lines
From: "K. Y. Srinivasan" <[email protected]>
The IPI hypercalls depend on being able to map the Linux notion of CPU ID to the hypervisor's notion of the CPU ID. The array hv_vp_index[] provides this mapping. Code for populating this array depends on the IPI functionality. Break this circular dependency.
Fixes 68bb7bfb7985 ("X86/Hyper-V: Enable IPI enlightenments")
Please drop this patch; I have sent the wrong patch.
Regards,
K. Y
Quoted 65 lines
Signed-off-by K. Y. Srinivasan <[email protected]>Tested-by Michael Kelley <[email protected]>--- arch/x86/hyperv/hv_apic.c | 5 +++++ arch/x86/hyperv/hv_init.c | 3 +++ arch/x86/include/asm/mshyperv.h | 2 ++ 3 files changed, 10 insertions(+)arch/x86/hyperv/hv_apic.c +5
-0@@ -114,6 +114,8 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector) ipi_arg->vp_set.format =HV_GENERIC_SET_SPARSE_4K ; nr_bank =cpumask_to_vpset (&(ipi_arg->vp_set), mask); } +if (nr_bank ==-1 ) + goto ipi_mask_ex_done;if (!nr_bank) ipi_arg->vp_set.format =HV_GENERIC_SET_ALL ;@@ -158,6 +160,9 @@ static bool __send_ipi_mask(const struct cpumask *mask, int vector)for_each_cpu (cur_cpu, mask) { vcpu =hv_cpu_number_to_vp_number (cur_cpu); +if (vcpu ==-1 ) + goto ipi_mask_done; +/* * This particular version of the IPI hypercall can arch/x86/hyperv/hv_apic.c +0
-0* only target upto 64 CPUs. arch/x86/hyperv/hv_init.c +3
-0@@ -293,6 +293,9 @@ void __init hyperv_init(void)if (!hv_vp_index)return ; +for (i =0 ; i <num_possible_cpus (); i++) + hv_vp_index[i] =-1 ; + hv_vp_assist_page =kcalloc (num_possible_cpus (),sizeof (*hv_vp_assist_page),GFP_KERNEL );if (!hv_vp_assist_page) {arch/x86/include/asm/mshyperv.h +2
-0@@ -285,6 +285,8 @@ static inline int cpumask_to_vpset(struct hv_vpset*vpset, */ for_each_cpu (cpu, cpus) { vcpu =hv_cpu_number_to_vp_number (cpu); +if (vcpu ==-1 ) +return -1 ; vcpu_bank = vcpu /64 ; vcpu_offset = vcpu %64 ;__set_bit(vcpu_offset, (unsigned long *)
--
2.17.1