]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Mar 2021 11:32:03 +0000 (12:32 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Mar 2021 11:32:03 +0000 (12:32 +0100)
added patches:
x86-reboot-force-all-cpus-to-exit-vmx-root-if-vmx-is-supported.patch

queue-4.4/series
queue-4.4/x86-reboot-force-all-cpus-to-exit-vmx-root-if-vmx-is-supported.patch [new file with mode: 0644]

index 4b4ddd5ddbf0c680825dc05bb8078fc8c708dda6..5a2896e50893fdabff34194d760eedcd862f2d95 100644 (file)
@@ -73,3 +73,4 @@ keys-trusted-fix-migratable-1-failing.patch
 btrfs-fix-reloc-root-leak-with-0-ref-reloc-roots-on-recovery.patch
 drivers-misc-vmw_vmci-restrict-too-big-queue-size-in-qp_host_alloc_queue.patch
 staging-rtl8188eu-add-edimax-ew-7811un-v2-to-device-table.patch
+x86-reboot-force-all-cpus-to-exit-vmx-root-if-vmx-is-supported.patch
diff --git a/queue-4.4/x86-reboot-force-all-cpus-to-exit-vmx-root-if-vmx-is-supported.patch b/queue-4.4/x86-reboot-force-all-cpus-to-exit-vmx-root-if-vmx-is-supported.patch
new file mode 100644 (file)
index 0000000..fcdced3
--- /dev/null
@@ -0,0 +1,70 @@
+From ed72736183c45a413a8d6974dd04be90f514cb6b Mon Sep 17 00:00:00 2001
+From: Sean Christopherson <seanjc@google.com>
+Date: Wed, 30 Dec 2020 16:26:55 -0800
+Subject: x86/reboot: Force all cpus to exit VMX root if VMX is supported
+
+From: Sean Christopherson <seanjc@google.com>
+
+commit ed72736183c45a413a8d6974dd04be90f514cb6b upstream.
+
+Force all CPUs to do VMXOFF (via NMI shootdown) during an emergency
+reboot if VMX is _supported_, as VMX being off on the current CPU does
+not prevent other CPUs from being in VMX root (post-VMXON).  This fixes
+a bug where a crash/panic reboot could leave other CPUs in VMX root and
+prevent them from being woken via INIT-SIPI-SIPI in the new kernel.
+
+Fixes: d176720d34c7 ("x86: disable VMX on all CPUs on reboot")
+Cc: stable@vger.kernel.org
+Suggested-by: Sean Christopherson <seanjc@google.com>
+Signed-off-by: David P. Reed <dpreed@deepplum.com>
+[sean: reworked changelog and further tweaked comment]
+Signed-off-by: Sean Christopherson <seanjc@google.com>
+Message-Id: <20201231002702.2223707-3-seanjc@google.com>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/kernel/reboot.c |   29 ++++++++++-------------------
+ 1 file changed, 10 insertions(+), 19 deletions(-)
+
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -479,29 +479,20 @@ static void emergency_vmx_disable_all(vo
+       local_irq_disable();
+       /*
+-       * We need to disable VMX on all CPUs before rebooting, otherwise
+-       * we risk hanging up the machine, because the CPU ignore INIT
+-       * signals when VMX is enabled.
++       * Disable VMX on all CPUs before rebooting, otherwise we risk hanging
++       * the machine, because the CPU blocks INIT when it's in VMX root.
+        *
+-       * We can't take any locks and we may be on an inconsistent
+-       * state, so we use NMIs as IPIs to tell the other CPUs to disable
+-       * VMX and halt.
++       * We can't take any locks and we may be on an inconsistent state, so
++       * use NMIs as IPIs to tell the other CPUs to exit VMX root and halt.
+        *
+-       * For safety, we will avoid running the nmi_shootdown_cpus()
+-       * stuff unnecessarily, but we don't have a way to check
+-       * if other CPUs have VMX enabled. So we will call it only if the
+-       * CPU we are running on has VMX enabled.
+-       *
+-       * We will miss cases where VMX is not enabled on all CPUs. This
+-       * shouldn't do much harm because KVM always enable VMX on all
+-       * CPUs anyway. But we can miss it on the small window where KVM
+-       * is still enabling VMX.
++       * Do the NMI shootdown even if VMX if off on _this_ CPU, as that
++       * doesn't prevent a different CPU from being in VMX root operation.
+        */
+-      if (cpu_has_vmx() && cpu_vmx_enabled()) {
+-              /* Disable VMX on this CPU. */
+-              cpu_vmxoff();
++      if (cpu_has_vmx()) {
++              /* Safely force _this_ CPU out of VMX root operation. */
++              __cpu_emergency_vmxoff();
+-              /* Halt and disable VMX on the other CPUs */
++              /* Halt and exit VMX root operation on the other CPUs. */
+               nmi_shootdown_cpus(vmxoff_nmi);
+       }