]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
KVM: nSVM: do not mark all VMCB01 fields dirty on nested vmexit
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 16 Nov 2020 11:38:19 +0000 (06:38 -0500)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 26 Feb 2021 13:36:01 +0000 (08:36 -0500)
Since L1 and L2 now use different VMCBs, most of the fields remain
the same from one L1 run to the next.  svm_set_cr0 and other functions
called by nested_svm_vmexit already take care of clearing the
corresponding clean bits; only the TSC offset is special.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm/nested.c

index f88d0614d9b85f9a0a9ac29a0e9143f02cbdf174..4fc742ba1f1f1fa7557799b33e3cc9383165f1c1 100644 (file)
@@ -698,8 +698,11 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
        svm_set_gif(svm, false);
        svm->vmcb->control.exit_int_info = 0;
 
-       svm->vmcb->control.tsc_offset = svm->vcpu.arch.tsc_offset =
-               svm->vcpu.arch.l1_tsc_offset;
+       svm->vcpu.arch.tsc_offset = svm->vcpu.arch.l1_tsc_offset;
+       if (svm->vmcb->control.tsc_offset != svm->vcpu.arch.tsc_offset) {
+               svm->vmcb->control.tsc_offset = svm->vcpu.arch.tsc_offset;
+               vmcb_mark_dirty(svm->vmcb, VMCB_INTERCEPTS);
+       }
 
        svm->nested.ctl.nested_cr3 = 0;
 
@@ -717,8 +720,6 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
        svm->vcpu.arch.dr7 = DR7_FIXED_1;
        kvm_update_dr7(&svm->vcpu);
 
-       vmcb_mark_all_dirty(svm->vmcb);
-
        trace_kvm_nested_vmexit_inject(vmcb12->control.exit_code,
                                       vmcb12->control.exit_info_1,
                                       vmcb12->control.exit_info_2,