| From de81c2f912ef57917bdc6d63b410c534c3e07982 Mon Sep 17 00:00:00 2001 |
| From: Sean Christopherson <sean.j.christopherson@intel.com> |
| Date: Wed, 23 Jan 2019 09:22:40 -0800 |
| Subject: KVM: x86: WARN_ONCE if sending a PV IPI returns a fatal error |
| |
| From: Sean Christopherson <sean.j.christopherson@intel.com> |
| |
| commit de81c2f912ef57917bdc6d63b410c534c3e07982 upstream. |
| |
| KVM hypercalls return a negative value error code in case of a fatal |
| error, e.g. when the hypercall isn't supported or was made with invalid |
| parameters. WARN_ONCE on fatal errors when sending PV IPIs as any such |
| error all but guarantees an SMP system will hang due to a missing IPI. |
| |
| Fixes: aaffcfd1e82d ("KVM: X86: Implement PV IPIs in linux guest") |
| Cc: stable@vger.kernel.org |
| Cc: Wanpeng Li <wanpengli@tencent.com> |
| Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/kvm.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/kernel/kvm.c |
| +++ b/arch/x86/kernel/kvm.c |
| @@ -457,6 +457,7 @@ static void __send_ipi_mask(const struct |
| #else |
| u64 ipi_bitmap = 0; |
| #endif |
| + long ret; |
| |
| if (cpumask_empty(mask)) |
| return; |
| @@ -482,8 +483,9 @@ static void __send_ipi_mask(const struct |
| } else if (apic_id < min + KVM_IPI_CLUSTER_SIZE) { |
| max = apic_id < max ? max : apic_id; |
| } else { |
| - kvm_hypercall4(KVM_HC_SEND_IPI, (unsigned long)ipi_bitmap, |
| + ret = kvm_hypercall4(KVM_HC_SEND_IPI, (unsigned long)ipi_bitmap, |
| (unsigned long)(ipi_bitmap >> BITS_PER_LONG), min, icr); |
| + WARN_ONCE(ret < 0, "KVM: failed to send PV IPI: %ld", ret); |
| min = max = apic_id; |
| ipi_bitmap = 0; |
| } |
| @@ -491,8 +493,9 @@ static void __send_ipi_mask(const struct |
| } |
| |
| if (ipi_bitmap) { |
| - kvm_hypercall4(KVM_HC_SEND_IPI, (unsigned long)ipi_bitmap, |
| + ret = kvm_hypercall4(KVM_HC_SEND_IPI, (unsigned long)ipi_bitmap, |
| (unsigned long)(ipi_bitmap >> BITS_PER_LONG), min, icr); |
| + WARN_ONCE(ret < 0, "KVM: failed to send PV IPI: %ld", ret); |
| } |
| |
| local_irq_restore(flags); |