Message ID | 20210924163152.289027-3-pbonzini@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86: pass arguments on the page fault path via struct kvm_page_fault | expand |
On Fri, Sep 24, 2021 at 12:31:23PM -0400, Paolo Bonzini wrote: > Create a single structure for arguments that are passed from > kvm_mmu_do_page_fault to the page fault handlers. Later > the structure will grow to include various output parameters > that are passed back to the next steps in the page fault > handling. > > Suggested-by: Isaku Yamahata <isaku.yamahata@intel.com> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > arch/x86/kvm/mmu.h | 34 +++++++++++++++++++++++++++++++--- > 1 file changed, 31 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h > index e9688a9f7b57..0553ef92946e 100644 > --- a/arch/x86/kvm/mmu.h > +++ b/arch/x86/kvm/mmu.h > @@ -114,17 +114,45 @@ static inline void kvm_mmu_load_pgd(struct kvm_vcpu *vcpu) > vcpu->arch.mmu->shadow_root_level); > } > > +struct kvm_page_fault { > + /* arguments to kvm_mmu_do_page_fault. */ > + const gpa_t addr; > + const u32 error_code; > + const bool prefault; This is somewhat tangential to your change but... I notice KVM uses "prefetch" and "prefault" interchangably. If we changed prefault to prefetch here and in kvm_mmu_do_page_fault then that would make the naming consistent throughout KVM ("prefetch" for everything). > + > + /* Derived from error_code. */ > + const bool exec; > + const bool write; > + const bool present; > + const bool rsvd; > + const bool user; > + > + /* Derived from mmu. */ > + const bool is_tdp; > +}; > + > int kvm_tdp_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, > bool prefault); > > static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, > u32 err, bool prefault) > { > + struct kvm_page_fault fault = { > + .addr = cr2_or_gpa, > + .error_code = err, > + .exec = err & PFERR_FETCH_MASK, > + .write = err & PFERR_WRITE_MASK, > + .present = err & PFERR_PRESENT_MASK, > + .rsvd = err & PFERR_RSVD_MASK, > + .user = err & PFERR_USER_MASK, > + .prefault = prefault, > + .is_tdp = likely(vcpu->arch.mmu->page_fault == kvm_tdp_page_fault), > + }; > #ifdef CONFIG_RETPOLINE > - if (likely(vcpu->arch.mmu->page_fault == kvm_tdp_page_fault)) > - return kvm_tdp_page_fault(vcpu, cr2_or_gpa, err, prefault); > + if (fault.is_tdp) > + return kvm_tdp_page_fault(vcpu, fault.addr, fault.error_code, fault.prefault); > #endif > - return vcpu->arch.mmu->page_fault(vcpu, cr2_or_gpa, err, prefault); > + return vcpu->arch.mmu->page_fault(vcpu, fault.addr, fault.error_code, fault.prefault); > } > > /* > -- > 2.27.0 > >
On 29/09/21 01:25, David Matlack wrote: >> +struct kvm_page_fault { >> + /* arguments to kvm_mmu_do_page_fault. */ >> + const gpa_t addr; >> + const u32 error_code; >> + const bool prefault; > This is somewhat tangential to your change but... I notice KVM uses > "prefetch" and "prefault" interchangably. If we changed prefault to > prefetch here and in kvm_mmu_do_page_fault then that would make the > naming consistent throughout KVM ("prefetch" for everything). > Sounds good. Paolo
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h index e9688a9f7b57..0553ef92946e 100644 --- a/arch/x86/kvm/mmu.h +++ b/arch/x86/kvm/mmu.h @@ -114,17 +114,45 @@ static inline void kvm_mmu_load_pgd(struct kvm_vcpu *vcpu) vcpu->arch.mmu->shadow_root_level); } +struct kvm_page_fault { + /* arguments to kvm_mmu_do_page_fault. */ + const gpa_t addr; + const u32 error_code; + const bool prefault; + + /* Derived from error_code. */ + const bool exec; + const bool write; + const bool present; + const bool rsvd; + const bool user; + + /* Derived from mmu. */ + const bool is_tdp; +}; + int kvm_tdp_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, bool prefault); static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 err, bool prefault) { + struct kvm_page_fault fault = { + .addr = cr2_or_gpa, + .error_code = err, + .exec = err & PFERR_FETCH_MASK, + .write = err & PFERR_WRITE_MASK, + .present = err & PFERR_PRESENT_MASK, + .rsvd = err & PFERR_RSVD_MASK, + .user = err & PFERR_USER_MASK, + .prefault = prefault, + .is_tdp = likely(vcpu->arch.mmu->page_fault == kvm_tdp_page_fault), + }; #ifdef CONFIG_RETPOLINE - if (likely(vcpu->arch.mmu->page_fault == kvm_tdp_page_fault)) - return kvm_tdp_page_fault(vcpu, cr2_or_gpa, err, prefault); + if (fault.is_tdp) + return kvm_tdp_page_fault(vcpu, fault.addr, fault.error_code, fault.prefault); #endif - return vcpu->arch.mmu->page_fault(vcpu, cr2_or_gpa, err, prefault); + return vcpu->arch.mmu->page_fault(vcpu, fault.addr, fault.error_code, fault.prefault); } /*
Create a single structure for arguments that are passed from kvm_mmu_do_page_fault to the page fault handlers. Later the structure will grow to include various output parameters that are passed back to the next steps in the page fault handling. Suggested-by: Isaku Yamahata <isaku.yamahata@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- arch/x86/kvm/mmu.h | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-)