lkml.org 
[lkml]   [2022]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [PATCH 2/2] x86/reboot: Disable virtualization in an emergency if SVM is supported
    Date
    Sean Christopherson <seanjc@google.com> writes:

    > Disable SVM on all CPUs via NMI shootdown during an emergency reboot.
    > Like VMX, SVM can block INIT and thus prevent bringing up other CPUs via
    > INIT-SIPI-SIPI.
    >
    > Cc: stable@vger.kernel.org
    > Signed-off-by: Sean Christopherson <seanjc@google.com>
    > ---
    > arch/x86/kernel/reboot.c | 26 ++++++++++++++------------
    > 1 file changed, 14 insertions(+), 12 deletions(-)
    >
    > diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
    > index f9543a4e9b09..33c1f4883b27 100644
    > --- a/arch/x86/kernel/reboot.c
    > +++ b/arch/x86/kernel/reboot.c
    > @@ -533,27 +533,29 @@ static void nmi_shootdown_nop(int cpu, struct pt_regs *regs)
    > /* Nothing to do, the NMI shootdown handler disables virtualization. */
    > }
    >
    > -/* Use NMIs as IPIs to tell all CPUs to disable virtualization */
    > -static void emergency_vmx_disable_all(void)
    > +static void emergency_reboot_disable_virtualization(void)
    > {
    > /* Just make sure we won't change CPUs while doing this */
    > local_irq_disable();
    >
    > /*
    > - * Disable VMX on all CPUs before rebooting, otherwise we risk hanging
    > - * the machine, because the CPU blocks INIT when it's in VMX root.
    > + * Disable virtualization on all CPUs before rebooting to avoid hanging
    > + * the system, as VMX and SVM block INIT when running in the host
    > *
    > * 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.
    > + * use NMIs as IPIs to tell the other CPUs to disable VMX/SVM and halt.
    > *
    > - * 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.
    > + * Do the NMI shootdown even if virtualization is off on _this_ CPU, as
    > + * other CPUs may have virtualization enabled.
    > */
    > - if (cpu_has_vmx()) {
    > - /* Safely force _this_ CPU out of VMX root operation. */
    > - __cpu_emergency_vmxoff();
    > + if (cpu_has_vmx() || cpu_has_svm(NULL)) {
    > + /* Safely force _this_ CPU out of VMX/SVM operation. */
    > + if (cpu_has_vmx())
    > + __cpu_emergency_vmxoff();
    > + else
    > + cpu_emergency_svm_disable();
    >
    > - /* Halt and exit VMX root operation on the other CPUs. */
    > + /* Disable VMX/SVM and halt on other CPUs. */
    > nmi_shootdown_cpus(nmi_shootdown_nop);
    > }

    Nitpicking: we can get rid of the second cpu_has_vmx() if we write this
    as:

    if (cpu_has_vmx())
    __cpu_emergency_vmxoff();
    else if (cpu_has_svm(NULL))
    cpu_emergency_svm_disable();
    else
    return;

    nmi_shootdown_cpus(nmi_shootdown_nop);

    > }
    > @@ -590,7 +592,7 @@ static void native_machine_emergency_restart(void)
    > unsigned short mode;
    >
    > if (reboot_emergency)
    > - emergency_vmx_disable_all();
    > + emergency_reboot_disable_virtualization();
    >
    > tboot_shutdown(TB_SHUTDOWN_REBOOT);

    Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>

    --
    Vitaly

    \
     
     \ /
      Last update: 2022-05-12 10:38    [W:3.940 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site