FAILED: patch "[PATCH] KVM: nVMX: do not use dangling shadow VMCS after guest reset" failed to apply to 5.2-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 88dddc11a8d6b09201b4db9d255b3394d9bc9e57 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <[email protected]>
Date: Fri, 19 Jul 2019 18:41:10 +0200
Subject: [PATCH] KVM: nVMX: do not use dangling shadow VMCS after guest reset
If a KVM guest is reset while running a nested guest, free_nested will disable the shadow VMCS execution control in the vmcs01. However, on the next KVM_RUN vmx_vcpu_run would nevertheless try to sync the VMCS12 to the shadow VMCS which has since been freed.
This causes a vmptrld of a NULL pointer on my machime, but Jan reports the host to hang altogether. Let's see how much this trivial patch fixes.
arch/x86/kvm/vmx/nested.c +7 -1
@@ -194,6 +194,7 @@ static void vmx_disable_shadow_vmcs(struct vcpu_vmx *vmx) {secondary_exec_controls_clearbit (vmx,SECONDARY_EXEC_SHADOW_VMCS );vmcs_write64 (VMCS_LINK_POINTER ,-1ull ); + vmx->nested.need_vmcs12_to_shadow_sync = false; }static inline void nested_release_evmcs (struct kvm_vcpu *vcpu)
@@ -1341,6 +1342,9 @@ static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx)unsigned long val;int i; +if (WARN_ON (!shadow_vmcs)) +return ; +preempt_disable ();vmcs_load (shadow_vmcs);
@@ -1373,6 +1377,9 @@ static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx)unsigned long val;int i, q; +if (WARN_ON (!shadow_vmcs)) +return ; +vmcs_load (shadow_vmcs);for (q =0 ; q <ARRAY_SIZE (fields); q++) {
@@ -4436,7 +4443,6 @@ static inline void nested_release_vmcs12(struct kvm_vcpu *vcpu)/* copy to memory all shadowed fields in case they were modified */ copy_shadow_to_vmcs12 (vmx); - vmx->nested.need_vmcs12_to_shadow_sync = false;vmx_disable_shadow_vmcs (vmx); } vmx->nested.posted_intr_nv =-1 ;