mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
KVM: x86/mmu: Make kvm_mmu_do_page_fault() return mapped level
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>
This commit is contained in:
parent
f5e7f00cf1
commit
58ef24699b
|
|
@ -4292,7 +4292,7 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
r = kvm_mmu_do_page_fault(vcpu, work->cr2_or_gpa, work->arch.error_code,
|
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
|
* 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++;
|
vcpu->stat.pf_taken++;
|
||||||
|
|
||||||
r = kvm_mmu_do_page_fault(vcpu, cr2_or_gpa, error_code, false,
|
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))
|
if (KVM_BUG_ON(r == RET_PF_INVALID, vcpu->kvm))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
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 = {
|
struct kvm_page_fault fault = {
|
||||||
.addr = cr2_or_gpa,
|
.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)
|
if (fault.write_fault_to_shadow_pgtable && emulation_type)
|
||||||
*emulation_type |= EMULTYPE_WRITE_PF_TO_SP;
|
*emulation_type |= EMULTYPE_WRITE_PF_TO_SP;
|
||||||
|
if (level)
|
||||||
|
*level = fault.goal_level;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user