]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86/mmu: Make kvm_mmu_do_page_fault() return mapped level
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 10 Jul 2024 14:27:10 +0000 (10:27 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 12 Jul 2024 15:17:36 +0000 (11:17 -0400)
The guest memory population logic will need to know what page size or level
(4K, 2M, ...) is mapped.

Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
Message-ID: <eabc3f3e5eb03b370cadf6e1901ea34d7a020adc.1712785629.git.isaku.yamahata@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/mmu/mmu.c
arch/x86/kvm/mmu/mmu_internal.h

index c3cbc77eebcd1d1201659de551105ae2b5858e67..f123ca3145a60c75b479e92b5a79c109b8155b9c 100644 (file)
@@ -4292,7 +4292,7 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work)
                return;
 
        r = kvm_mmu_do_page_fault(vcpu, work->cr2_or_gpa, work->arch.error_code,
-                                 true, NULL);
+                                 true, NULL, NULL);
 
        /*
         * Account fixed page faults, otherwise they'll never be counted, but
@@ -5937,7 +5937,7 @@ int noinline kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 err
                vcpu->stat.pf_taken++;
 
                r = kvm_mmu_do_page_fault(vcpu, cr2_or_gpa, error_code, false,
-                                         &emulation_type);
+                                         &emulation_type, NULL);
                if (KVM_BUG_ON(r == RET_PF_INVALID, vcpu->kvm))
                        return -EIO;
        }
index 444f55a5eed7d0cf753f892146dfa135890765c8..1721d97743e99c70913d691bccd76c31dbfddbf3 100644 (file)
@@ -288,7 +288,8 @@ static inline void kvm_mmu_prepare_memory_fault_exit(struct kvm_vcpu *vcpu,
 }
 
 static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,
-                                       u64 err, bool prefetch, int *emulation_type)
+                                       u64 err, bool prefetch,
+                                       int *emulation_type, u8 *level)
 {
        struct kvm_page_fault fault = {
                .addr = cr2_or_gpa,
@@ -336,6 +337,8 @@ static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,
 
        if (fault.write_fault_to_shadow_pgtable && emulation_type)
                *emulation_type |= EMULTYPE_WRITE_PF_TO_SP;
+       if (level)
+               *level = fault.goal_level;
 
        return r;
 }