OSDN Git Service

KVM: nSVM: Track whether changes in L0 require MSR bitmap for L2 to be rebuilt
authorVitaly Kuznetsov <vkuznets@redhat.com>
Wed, 2 Feb 2022 09:50:57 +0000 (10:50 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 10 Feb 2022 18:50:44 +0000 (13:50 -0500)
Similar to nVMX commit ed2a4800ae9d ("KVM: nVMX: Track whether changes in
L0 require MSR bitmap for L2 to be rebuilt"), introduce a flag to keep
track of whether MSR bitmap for L2 needs to be rebuilt due to changes in
MSR bitmap for L1 or switching to a different L2.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Message-Id: <20220202095100.129834-2-vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm/nested.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/svm/svm.h

index 39d280e..74c218b 100644 (file)
@@ -193,6 +193,8 @@ static bool nested_svm_vmrun_msrpm(struct vcpu_svm *svm)
                svm->nested.msrpm[p] = svm->msrpm[p] | value;
        }
 
+       svm->nested.force_msr_bitmap_recalc = false;
+
        svm->vmcb->control.msrpm_base_pa = __sme_set(__pa(svm->nested.msrpm));
 
        return true;
@@ -494,6 +496,7 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12
        if (svm->nested.vmcb12_gpa != svm->nested.last_vmcb12_gpa) {
                new_vmcb12 = true;
                svm->nested.last_vmcb12_gpa = svm->nested.vmcb12_gpa;
+               svm->nested.force_msr_bitmap_recalc = true;
        }
 
        if (unlikely(new_vmcb12 || vmcb_is_dirty(vmcb12, VMCB_SEG))) {
@@ -1495,6 +1498,7 @@ static int svm_set_nested_state(struct kvm_vcpu *vcpu,
        if (WARN_ON_ONCE(ret))
                goto out_free;
 
+       svm->nested.force_msr_bitmap_recalc = true;
 
        kvm_make_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu);
        ret = 0;
index 339fb97..ea0d128 100644 (file)
@@ -668,6 +668,7 @@ static bool msr_write_intercepted(struct kvm_vcpu *vcpu, u32 msr)
 static void set_msr_interception_bitmap(struct kvm_vcpu *vcpu, u32 *msrpm,
                                        u32 msr, int read, int write)
 {
+       struct vcpu_svm *svm = to_svm(vcpu);
        u8 bit_read, bit_write;
        unsigned long tmp;
        u32 offset;
@@ -698,7 +699,7 @@ static void set_msr_interception_bitmap(struct kvm_vcpu *vcpu, u32 *msrpm,
        msrpm[offset] = tmp;
 
        svm_hv_vmcb_dirty_nested_enlightenments(vcpu);
-
+       svm->nested.force_msr_bitmap_recalc = true;
 }
 
 void set_msr_interception(struct kvm_vcpu *vcpu, u32 *msrpm, u32 msr,
index ffc2430..365c17b 100644 (file)
@@ -163,6 +163,15 @@ struct svm_nested_state {
        struct vmcb_save_area_cached save;
 
        bool initialized;
+
+       /*
+        * Indicates whether MSR bitmap for L2 needs to be rebuilt due to
+        * changes in MSR bitmap for L1 or switching to a different L2. Note,
+        * this flag can only be used reliably in conjunction with a paravirt L1
+        * which informs L0 whether any changes to MSR bitmap for L2 were done
+        * on its side.
+        */
+       bool force_msr_bitmap_recalc;
 };
 
 struct vcpu_sev_es_state {