x86/reboot: Assert that IRQs are disabled when turning off virtualization
authorSean Christopherson <seanjc@google.com>
Fri, 21 Jul 2023 20:18:45 +0000 (13:18 -0700)
committerSean Christopherson <seanjc@google.com>
Thu, 3 Aug 2023 22:37:14 +0000 (15:37 -0700)
Assert that IRQs are disabled when turning off virtualization in an
emergency.  KVM enables hardware via on_each_cpu(), i.e. could re-enable
hardware if a pending IPI were delivered after disabling virtualization.

Remove a misleading comment from emergency_reboot_disable_virtualization()
about "just" needing to guarantee the CPU is stable (see above).

Reviewed-by: Kai Huang <kai.huang@intel.com>
Link: https://lore.kernel.org/r/20230721201859.2307736-6-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kernel/reboot.c

index 48ad2d1ff83d56fa7ead07c7c82c7d5967d0ef66..4cad7183b89e9ccdbf7b9c2d1bffc6c6fb94fe86 100644 (file)
@@ -532,7 +532,6 @@ static inline void nmi_shootdown_cpus_on_restart(void);
 
 static void emergency_reboot_disable_virtualization(void)
 {
-       /* Just make sure we won't change CPUs while doing this */
        local_irq_disable();
 
        /*
@@ -821,6 +820,13 @@ void cpu_emergency_disable_virtualization(void)
 {
        cpu_emergency_virt_cb *callback;
 
+       /*
+        * IRQs must be disabled as KVM enables virtualization in hardware via
+        * function call IPIs, i.e. IRQs need to be disabled to guarantee
+        * virtualization stays disabled.
+        */
+       lockdep_assert_irqs_disabled();
+
        rcu_read_lock();
        callback = rcu_dereference(cpu_emergency_virt_callback);
        if (callback)