Re: [PATCH] KVM: VMX: Flush shadow VMCS on emergency reboot

From: Huang, Kai
Date: Mon Mar 31 2025 - 19:18:05 EST


On Mon, 2025-03-24 at 22:08 +0800, Chao Gao wrote:
> Ensure the shadow VMCS cache is evicted during an emergency reboot to
> prevent potential memory corruption if the cache is evicted after reboot.
>
> This issue was identified through code inspection, as __loaded_vmcs_clear()
> flushes both the normal VMCS and the shadow VMCS.
>
> Avoid checking the "launched" state during an emergency reboot, unlike the
> behavior in __loaded_vmcs_clear(). This is important because reboot NMIs
> can interfere with operations like copy_shadow_to_vmcs12(), where shadow
> VMCSes are loaded directly using VMPTRLD. In such cases, if NMIs occur
> right after the VMCS load, the shadow VMCSes will be active but the
> "launched" state may not be set.
>
> Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>

Reviewed-by: Kai Huang <kai.huang@xxxxxxxxx>

> ---
> arch/x86/kvm/vmx/vmx.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index b70ed72c1783..dccd1c9939b8 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -769,8 +769,11 @@ void vmx_emergency_disable_virtualization_cpu(void)
> return;
>
> list_for_each_entry(v, &per_cpu(loaded_vmcss_on_cpu, cpu),
> - loaded_vmcss_on_cpu_link)
> + loaded_vmcss_on_cpu_link) {
> vmcs_clear(v->vmcs);
> + if (v->shadow_vmcs)
> + vmcs_clear(v->shadow_vmcs);
> + }
>
> kvm_cpu_vmxoff();
> }