diff options
author | Vitaly Kuznetsov <vkuznets@redhat.com> | 2020-07-10 17:11:56 +0300 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2020-07-10 19:59:39 +0300 |
commit | d82aaef9c88aa27bce63751d6d6329920b1fe8da (patch) | |
tree | 8d200f4be04e00a7ac633b3fdd93ad17b2b7c09d /arch/x86/kvm | |
parent | a506fdd22342606d22645a6bf90a2d848e92e5d7 (diff) | |
download | linux-d82aaef9c88aa27bce63751d6d6329920b1fe8da.tar.xz |
KVM: nSVM: use nested_svm_load_cr3() on guest->host switch
Make nSVM code resemble nVMX where nested_vmx_load_cr3() is used on
both guest->host and host->guest transitions. Also, we can now
eliminate unconditional kvm_mmu_reset_context() and speed things up.
Note, nVMX has two different paths: load_vmcs12_host_state() and
nested_vmx_restore_host_state() and the later is used to restore from
'partial' switch to L2, it always uses kvm_mmu_reset_context().
nSVM doesn't have this yet. Also, nested_svm_vmexit()'s return value
is almost always ignored nowadays.
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Message-Id: <20200710141157.1640173-9-vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r-- | arch/x86/kvm/svm/nested.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c index f7d5bafd3b14..7b331e3da3eb 100644 --- a/arch/x86/kvm/svm/nested.c +++ b/arch/x86/kvm/svm/nested.c @@ -342,8 +342,8 @@ static inline bool nested_npt_enabled(struct vcpu_svm *svm) } /* - * Load guest's cr3 at nested entry. @nested_npt is true if we are - * emulating VM-Entry into a guest with NPT enabled. + * Load guest's/host's cr3 on nested vmentry or vmexit. @nested_npt is true + * if we are emulating VM-Entry into a guest with NPT enabled. */ static int nested_svm_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3, bool nested_npt) @@ -676,15 +676,12 @@ int nested_svm_vmexit(struct vcpu_svm *svm) nested_svm_uninit_mmu_context(&svm->vcpu); - if (npt_enabled) { - svm->vmcb->save.cr3 = hsave->save.cr3; - svm->vcpu.arch.cr3 = hsave->save.cr3; - } else { - (void)kvm_set_cr3(&svm->vcpu, hsave->save.cr3); - } + rc = nested_svm_load_cr3(&svm->vcpu, hsave->save.cr3, false); + if (rc) + return 1; - kvm_mmu_reset_context(&svm->vcpu); - kvm_mmu_load(&svm->vcpu); + if (npt_enabled) + svm->vmcb->save.cr3 = hsave->save.cr3; /* * Drop what we picked up for L2 via svm_complete_interrupts() so it |