]> www.infradead.org Git - users/willy/xarray.git/commitdiff
KVM: X86: Remove mmu parameter from load_pdptrs()
authorLai Jiangshan <laijs@linux.alibaba.com>
Wed, 24 Nov 2021 12:20:52 +0000 (20:20 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 8 Dec 2021 09:25:14 +0000 (04:25 -0500)
It uses vcpu->arch.walk_mmu always; nested EPT does not have PDPTRs,
and nested NPT treats them like all other non-leaf page table levels
instead of caching them.

Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
Message-Id: <20211124122055.64424-11-jiangshanlai@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/svm/nested.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/nested.c
arch/x86/kvm/x86.c

index 5d48ba6d1487cf00c51d4b8dd258c8872f4d6389..361fc52d1c0af1979b105c9c4b62bee417143b98 100644 (file)
@@ -1593,7 +1593,7 @@ void kvm_mmu_zap_all(struct kvm *kvm);
 void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen);
 void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned long kvm_nr_mmu_pages);
 
-int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3);
+int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3);
 
 int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,
                          const void *val, int bytes);
index 2d0a7dd7e2a65d2107f2e1447dd0e31536121af3..cf206855ebf099a1a2e9ca1304b8fbd7235502fc 100644 (file)
@@ -461,7 +461,7 @@ static int nested_svm_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3,
                return -EINVAL;
 
        if (reload_pdptrs && !nested_npt && is_pae_paging(vcpu) &&
-           CC(!load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3)))
+           CC(!load_pdptrs(vcpu, cr3)))
                return -EINVAL;
 
        if (!nested_npt)
@@ -1517,7 +1517,7 @@ static bool svm_get_nested_state_pages(struct kvm_vcpu *vcpu)
                 * the guest CR3 might be restored prior to setting the nested
                 * state which can lead to a load of wrong PDPTRs.
                 */
-               if (CC(!load_pdptrs(vcpu, vcpu->arch.walk_mmu, vcpu->arch.cr3)))
+               if (CC(!load_pdptrs(vcpu, vcpu->arch.cr3)))
                        return false;
 
        if (!nested_svm_vmrun_msrpm(svm)) {
index 581b9dfe63f2997d2a7ea26b891b73e4477adcf2..208566f63bce8a0ed5a565a6068aee316fa0b370 100644 (file)
@@ -1605,7 +1605,7 @@ static void svm_cache_reg(struct kvm_vcpu *vcpu, enum kvm_reg reg)
                 * it is always updated per SDM when moving to CRs.
                 */
                if (npt_enabled)
-                       load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu));
+                       load_pdptrs(vcpu, kvm_read_cr3(vcpu));
                break;
        default:
                KVM_BUG_ON(1, vcpu->kvm);
index e6230cd55b44ff53d27e9efa7c2ece9f599f192e..08e785871985de1658fd13b75a2df76435d98fa9 100644 (file)
@@ -1103,7 +1103,7 @@ static int nested_vmx_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3,
         * must not be dereferenced.
         */
        if (reload_pdptrs && !nested_ept && is_pae_paging(vcpu) &&
-           CC(!load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3))) {
+           CC(!load_pdptrs(vcpu, cr3))) {
                *entry_failure_code = ENTRY_FAIL_PDPTE;
                return -EINVAL;
        }
@@ -3147,7 +3147,7 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu)
                 * the guest CR3 might be restored prior to setting the nested
                 * state which can lead to a load of wrong PDPTRs.
                 */
-               if (CC(!load_pdptrs(vcpu, vcpu->arch.walk_mmu, vcpu->arch.cr3)))
+               if (CC(!load_pdptrs(vcpu, vcpu->arch.cr3)))
                        return false;
        }
 
index 432c6e3cb7468421171d2151fac11b71074d59d2..2f232eb0c989bde4661059004a83f1ac08057e40 100644 (file)
@@ -798,8 +798,9 @@ static inline u64 pdptr_rsvd_bits(struct kvm_vcpu *vcpu)
 /*
  * Load the pae pdptrs.  Return 1 if they are all valid, 0 otherwise.
  */
-int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3)
+int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3)
 {
+       struct kvm_mmu *mmu = vcpu->arch.walk_mmu;
        gfn_t pdpt_gfn = cr3 >> PAGE_SHIFT;
        gpa_t real_gpa;
        int i;
@@ -890,7 +891,7 @@ int kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
 #endif
        if (!(vcpu->arch.efer & EFER_LME) && (cr0 & X86_CR0_PG) &&
            is_pae(vcpu) && ((cr0 ^ old_cr0) & X86_CR0_PDPTR_BITS) &&
-           !load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu)))
+           !load_pdptrs(vcpu, kvm_read_cr3(vcpu)))
                return 1;
 
        if (!(cr0 & X86_CR0_PG) && kvm_read_cr4_bits(vcpu, X86_CR4_PCIDE))
@@ -1064,8 +1065,7 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
                        return 1;
        } else if (is_paging(vcpu) && (cr4 & X86_CR4_PAE)
                   && ((cr4 ^ old_cr4) & X86_CR4_PDPTR_BITS)
-                  && !load_pdptrs(vcpu, vcpu->arch.walk_mmu,
-                                  kvm_read_cr3(vcpu)))
+                  && !load_pdptrs(vcpu, kvm_read_cr3(vcpu)))
                return 1;
 
        if ((cr4 & X86_CR4_PCIDE) && !(old_cr4 & X86_CR4_PCIDE)) {
@@ -1154,7 +1154,7 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3)
        if (kvm_vcpu_is_illegal_gpa(vcpu, cr3))
                return 1;
 
-       if (is_pae_paging(vcpu) && !load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3))
+       if (is_pae_paging(vcpu) && !load_pdptrs(vcpu, cr3))
                return 1;
 
        if (cr3 != kvm_read_cr3(vcpu))
@@ -10597,7 +10597,7 @@ static int __set_sregs_common(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs,
        if (update_pdptrs) {
                idx = srcu_read_lock(&vcpu->kvm->srcu);
                if (is_pae_paging(vcpu)) {
-                       load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu));
+                       load_pdptrs(vcpu, kvm_read_cr3(vcpu));
                        *mmu_reset_needed = 1;
                }
                srcu_read_unlock(&vcpu->kvm->srcu, idx);