KVM: MMU: rename 'no_apf' to 'prefault'
PATCH v5 1/3 KVM: MMU: rename 'no_apf' to 'prefault'
It's the speculative path if 'no_apf = 1' and we will specially handle this speculative path in the later patch, so 'prefault' is better to fit the sense
--- arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/mmu.c | 18 +++++++++--------- arch/x86/kvm/paging_tmpl.h | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-)
arch/x86/include/asm/kvm_host.h +2 -1
@@ -241,7 +241,8 @@ struct kvm_mmu {void (*new_cr3)(struct kvm_vcpu *vcpu);void (*set_cr3)(struct kvm_vcpu *vcpu,unsigned long root);unsigned long (*get_cr3)(struct kvm_vcpu *vcpu); -int (*page_fault)(struct kvm_vcpu *vcpu,gva_t gva,u32 err,bool no_apf); +int (*page_fault)(struct kvm_vcpu *vcpu,gva_t gva,u32 err, +bool prefoult);void (*inject_page_fault)(struct kvm_vcpu *vcpu,struct x86_exception *fault);void (*free)(struct kvm_vcpu *vcpu);
arch/x86/kvm/mmu.c +9 -9
@@ -2284,11 +2284,11 @@ static int kvm_handle_bad_page(struct kvm *kvm, gfn_t gfn, pfn_t pfn)return 1 ; } -static bool try_async_pf (struct kvm_vcpu *vcpu,bool no_apf,gfn_t gfn, +static bool try_async_pf (struct kvm_vcpu *vcpu,bool prefault,gfn_t gfn,gva_t gva,pfn_t *pfn,bool write,bool *writable);static int nonpaging_map (struct kvm_vcpu *vcpu,gva_t v,int write,gfn_t gfn, -bool no_apf) +bool prefault) {int r;int level;
@@ -2310,7 +2310,7 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn, mmu_seq = vcpu->kvm->mmu_notifier_seq;smp_rmb (); -if (try_async_pf (vcpu, no_apf, gfn, v, &pfn, write, &map_writable)) +if (try_async_pf (vcpu, prefault, gfn, v, &pfn, write, &map_writable))return 0 ;/* mmio */
@@ -2583,7 +2583,7 @@ static gpa_t nonpaging_gva_to_gpa_nested(struct kvm_vcpu *vcpu, gva_t vaddr, }static int nonpaging_page_fault (struct kvm_vcpu *vcpu,gva_t gva, -u32 error_code,bool no_apf) +u32 error_code,bool prefault) {gfn_t gfn;int r;
@@ -2599,7 +2599,7 @@ static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, gfn = gva >>PAGE_SHIFT ;return nonpaging_map (vcpu, gva &PAGE_MASK , - error_code &PFERR_WRITE_MASK , gfn, no_apf); + error_code &PFERR_WRITE_MASK , gfn, prefault); }static int kvm_arch_setup_async_pf (struct kvm_vcpu *vcpu,gva_t gva,gfn_t gfn)
@@ -2621,7 +2621,7 @@ static bool can_do_async_pf(struct kvm_vcpu *vcpu)return kvm_x86_ops->interrupt_allowed (vcpu); } -static bool try_async_pf (struct kvm_vcpu *vcpu,bool no_apf,gfn_t gfn, +static bool try_async_pf (struct kvm_vcpu *vcpu,bool prefault,gfn_t gfn,gva_t gva,pfn_t *pfn,bool write,bool *writable) {bool async;
@@ -2633,7 +2633,7 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool no_apf, gfn_t gfn,put_page (pfn_to_page (*pfn)); -if (!no_apf &&can_do_async_pf (vcpu)) { +if (!prefault &&can_do_async_pf (vcpu)) {trace_kvm_try_async_get_page (gva, gfn);if (kvm_find_async_pf_gfn (vcpu, gfn)) {trace_kvm_async_pf_doublefault (gva, gfn);
@@ -2649,7 +2649,7 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool no_apf, gfn_t gfn, }static int tdp_page_fault (struct kvm_vcpu *vcpu,gva_t gpa,u32 error_code, -bool no_apf) +bool prefault) {pfn_t pfn;int r;
@@ -2673,7 +2673,7 @@ static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, mmu_seq = vcpu->kvm->mmu_notifier_seq;smp_rmb (); -if (try_async_pf (vcpu, no_apf, gfn, gpa, &pfn, write, &map_writable)) +if (try_async_pf (vcpu, prefault, gfn, gpa, &pfn, write, &map_writable))return 0 ;/* mmio */
arch/x86/kvm/paging_tmpl.h +2 -2
@@ -539,7 +539,7 @@ out_gpte_changed:* a negative value on error. */ static int FNAME (page_fault )(struct kvm_vcpu *vcpu,gva_t addr,u32 error_code, -bool no_apf) +bool prefault) {int write_fault = error_code &PFERR_WRITE_MASK ;int user_fault = error_code &PFERR_USER_MASK ;
@@ -581,7 +581,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code, mmu_seq = vcpu->kvm->mmu_notifier_seq;smp_rmb (); -if (try_async_pf (vcpu, no_apf, walker.gfn, addr, &pfn, write_fault, +if (try_async_pf (vcpu, prefault, walker.gfn, addr, &pfn, write_fault, &map_writable))return 0 ;
Signature · 1 line
1.7.0.4
PATCH v5 2/3 KVM: MMU: fix accessed bit set on prefault path
Retry #PF is the speculative path, so don't set the accessed bit
--- arch/x86/kvm/mmu.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
arch/x86/kvm/mmu.c +6 -4
@@ -2214,7 +2214,8 @@ static void direct_pte_prefetch(struct kvm_vcpu *vcpu, u64 *sptep) }static int __direct_map (struct kvm_vcpu *vcpu,gpa_t v,int write, -int map_writable,int level,gfn_t gfn,pfn_t pfn) +int map_writable,int level,gfn_t gfn,pfn_t pfn, +bool prefault) {struct kvm_shadow_walk_iterator iterator;struct kvm_mmu_page *sp;
@@ -2229,7 +2230,7 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, pte_access &= ~ACC_WRITE_MASK ;mmu_set_spte (vcpu, iterator.sptep,ACC_ALL , pte_access,0 , write,1 , &pt_write, - level, gfn, pfn, false, map_writable); + level, gfn, pfn, prefault, map_writable);direct_pte_prefetch (vcpu, iterator.sptep); ++vcpu->stat.pf_fixed;break ;
@@ -2321,7 +2322,8 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn,if (mmu_notifier_retry (vcpu, mmu_seq)) goto out_unlock;kvm_mmu_free_some_pages (vcpu); - r =__direct_map (vcpu, v, write, map_writable, level, gfn, pfn); + r =__direct_map (vcpu, v, write, map_writable, level, gfn, pfn, + prefault);spin_unlock (&vcpu->kvm->mmu_lock);
@@ -2684,7 +2686,7 @@ static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, goto out_unlock;kvm_mmu_free_some_pages (vcpu); r =__direct_map (vcpu, gpa, write, map_writable, - level, gfn, pfn); + level, gfn, pfn, prefault);spin_unlock (&vcpu->kvm->mmu_lock);return r;
Signature · 1 line
1.7.0.4
PATCH v5 3/3 KVM: MMU: retry #PF for softmmu
In reply to Xiao GuangrongRetry #PF for softmmu only when the current vcpu has the same cr3 as the time when #PF occurs
Changelog:
Just compare cr3 value since It's harmless to instantiate an spte for an unused translation from Marcelo's comment
--- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/mmu.c | 2 ++ arch/x86/kvm/paging_tmpl.h | 14 +++++++++----- arch/x86/kvm/x86.c | 6 +++++- 4 files changed, 17 insertions(+), 6 deletions(-)
arch/x86/include/asm/kvm_host.h +1 -0
@@ -593,6 +593,7 @@ struct kvm_x86_ops {struct kvm_arch_async_pf {u32 token;gfn_t gfn; +unsigned long cr3;bool direct_map; };
arch/x86/kvm/mmu.c +2 -0
@@ -2607,9 +2607,11 @@ static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva,static int kvm_arch_setup_async_pf (struct kvm_vcpu *vcpu,gva_t gva,gfn_t gfn) {struct kvm_arch_async_pf arch; + arch.token = (vcpu->arch.apf.id++ <<12 ) | vcpu->vcpu_id; arch.gfn = gfn; arch.direct_map = vcpu->arch.mmu.direct_map; + arch.cr3 = vcpu->arch.mmu.get_cr3 (vcpu);return kvm_setup_async_pf (vcpu, gva, gfn, &arch); }
arch/x86/kvm/paging_tmpl.h +9 -5
@@ -438,7 +438,8 @@ static void FNAME(pte_prefetch)(struct kvm_vcpu *vcpu, struct guest_walker *gw,static u64 *FNAME (fetch )(struct kvm_vcpu *vcpu,gva_t addr,struct guest_walker *gw,int user_fault,int write_fault,int hlevel, -int *ptwrite,pfn_t pfn,bool map_writable) +int *ptwrite,pfn_t pfn,bool map_writable, +bool prefault) {unsigned access = gw->pt_access;struct kvm_mmu_page *sp =NULL ;
@@ -512,7 +513,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,mmu_set_spte (vcpu, it.sptep, access, gw->pte_access & access, user_fault, write_fault, dirty, ptwrite, it.level, - gw->gfn, pfn, false, map_writable); + gw->gfn, pfn, prefault, map_writable);FNAME (pte_prefetch)(vcpu, gw, it.sptep);return it.sptep;
@@ -568,8 +569,11 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code,*/ if (!r) {pgprintk ("%s: guest page fault\n" , __func__); -inject_page_fault (vcpu, &walker.fault); - vcpu->arch.last_pt_write_count =0 ;/* reset fork detector */ +if (!prefault) { +inject_page_fault (vcpu, &walker.fault); +/* reset fork detector */ + vcpu->arch.last_pt_write_count =0 ; + }return 0 ; }
@@ -599,7 +603,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code,trace_kvm_mmu_audit (vcpu,AUDIT_PRE_PAGE_FAULT );kvm_mmu_free_some_pages (vcpu); sptep =FNAME (fetch)(vcpu, addr, &walker, user_fault, write_fault, - level, &write_pt, pfn, map_writable); + level, &write_pt, pfn, map_writable, prefault); (void )sptep;pgprintk ("%s: shadow pte %p %llx ptwrite %d\n" , __func__, sptep, *sptep, write_pt);
arch/x86/kvm/x86.c +5 -1
@@ -6183,7 +6183,7 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work) {int r; -if (!vcpu->arch.mmu.direct_map || !work->arch.direct_map || +if ((vcpu->arch.mmu.direct_map != work->arch.direct_map) ||is_error_page (work->page))return ;
@@ -6191,6 +6191,10 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work)if (unlikely (r))return ; +if (!vcpu->arch.mmu.direct_map && + work->arch.cr3 != vcpu->arch.mmu.get_cr3 (vcpu)) +return ; + vcpu->arch.mmu.page_fault (vcpu, work->gva,0 , true); }
Signature · 1 line
1.7.0.4
Quoted 15 lines · Xiao Guangrong
It's the speculative path if '
no_apf= 1' and we will specially handle this speculative path in the later patch, so 'prefault' is better to fit the senseSigned-off-by Xiao Guangrong <[email protected]>--- arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/mmu.c | 18 +++++++++--------- arch/x86/kvm/paging_tmpl.h | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-)arch/x86/include/asm/kvm_host.h +0
-0
arch/x86/include/asm/kvm_host.h struct kvm_mmu { · line 245
Quoted 6 lines
arch/x86/include/asm/kvm_host.h +2
-1@@ -241,7 +241,8 @@ struct kvm_mmu {void (*new_cr3)(struct kvm_vcpu *vcpu);void (*set_cr3)(struct kvm_vcpu *vcpu,unsigned long root);unsigned long (*get_cr3)(struct kvm_vcpu *vcpu); -int (*page_fault)(struct kvm_vcpu *vcpu,gva_t gva,u32 err,bool no_apf); +int (*page_fault)(struct kvm_vcpu *vcpu,gva_t gva,u32 err, +bool prefoult);
Sorry for the noise, there is a typo, resent it.
Subject: [PATCH v5 1/3] KVM: MMU: rename 'no_apf' to 'prefault'
It's the speculative path if 'no_apf = 1' and we will specially handle this speculative path in the later patch, so 'prefault' is better to fit the sense
--- arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/mmu.c | 18 +++++++++--------- arch/x86/kvm/paging_tmpl.h | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-)
arch/x86/include/asm/kvm_host.h +2 -1
@@ -241,7 +241,8 @@ struct kvm_mmu {void (*new_cr3)(struct kvm_vcpu *vcpu);void (*set_cr3)(struct kvm_vcpu *vcpu,unsigned long root);unsigned long (*get_cr3)(struct kvm_vcpu *vcpu); -int (*page_fault)(struct kvm_vcpu *vcpu,gva_t gva,u32 err,bool no_apf); +int (*page_fault)(struct kvm_vcpu *vcpu,gva_t gva,u32 err, +bool prefault);void (*inject_page_fault)(struct kvm_vcpu *vcpu,struct x86_exception *fault);void (*free)(struct kvm_vcpu *vcpu);
arch/x86/kvm/mmu.c +9 -9
@@ -2284,11 +2284,11 @@ static int kvm_handle_bad_page(struct kvm *kvm, gfn_t gfn, pfn_t pfn)return 1 ; } -static bool try_async_pf (struct kvm_vcpu *vcpu,bool no_apf,gfn_t gfn, +static bool try_async_pf (struct kvm_vcpu *vcpu,bool prefault,gfn_t gfn,gva_t gva,pfn_t *pfn,bool write,bool *writable);static int nonpaging_map (struct kvm_vcpu *vcpu,gva_t v,int write,gfn_t gfn, -bool no_apf) +bool prefault) {int r;int level;
@@ -2310,7 +2310,7 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn, mmu_seq = vcpu->kvm->mmu_notifier_seq;smp_rmb (); -if (try_async_pf (vcpu, no_apf, gfn, v, &pfn, write, &map_writable)) +if (try_async_pf (vcpu, prefault, gfn, v, &pfn, write, &map_writable))return 0 ;/* mmio */
@@ -2583,7 +2583,7 @@ static gpa_t nonpaging_gva_to_gpa_nested(struct kvm_vcpu *vcpu, gva_t vaddr, }static int nonpaging_page_fault (struct kvm_vcpu *vcpu,gva_t gva, -u32 error_code,bool no_apf) +u32 error_code,bool prefault) {gfn_t gfn;int r;
@@ -2599,7 +2599,7 @@ static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, gfn = gva >>PAGE_SHIFT ;return nonpaging_map (vcpu, gva &PAGE_MASK , - error_code &PFERR_WRITE_MASK , gfn, no_apf); + error_code &PFERR_WRITE_MASK , gfn, prefault); }static int kvm_arch_setup_async_pf (struct kvm_vcpu *vcpu,gva_t gva,gfn_t gfn)
@@ -2621,7 +2621,7 @@ static bool can_do_async_pf(struct kvm_vcpu *vcpu)return kvm_x86_ops->interrupt_allowed (vcpu); } -static bool try_async_pf (struct kvm_vcpu *vcpu,bool no_apf,gfn_t gfn, +static bool try_async_pf (struct kvm_vcpu *vcpu,bool prefault,gfn_t gfn,gva_t gva,pfn_t *pfn,bool write,bool *writable) {bool async;
@@ -2633,7 +2633,7 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool no_apf, gfn_t gfn,put_page (pfn_to_page (*pfn)); -if (!no_apf &&can_do_async_pf (vcpu)) { +if (!prefault &&can_do_async_pf (vcpu)) {trace_kvm_try_async_get_page (gva, gfn);if (kvm_find_async_pf_gfn (vcpu, gfn)) {trace_kvm_async_pf_doublefault (gva, gfn);
@@ -2649,7 +2649,7 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool no_apf, gfn_t gfn, }static int tdp_page_fault (struct kvm_vcpu *vcpu,gva_t gpa,u32 error_code, -bool no_apf) +bool prefault) {pfn_t pfn;int r;
@@ -2673,7 +2673,7 @@ static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, mmu_seq = vcpu->kvm->mmu_notifier_seq;smp_rmb (); -if (try_async_pf (vcpu, no_apf, gfn, gpa, &pfn, write, &map_writable)) +if (try_async_pf (vcpu, prefault, gfn, gpa, &pfn, write, &map_writable))return 0 ;/* mmio */
arch/x86/kvm/paging_tmpl.h +2 -2
@@ -539,7 +539,7 @@ out_gpte_changed:* a negative value on error. */ static int FNAME (page_fault )(struct kvm_vcpu *vcpu,gva_t addr,u32 error_code, -bool no_apf) +bool prefault) {int write_fault = error_code &PFERR_WRITE_MASK ;int user_fault = error_code &PFERR_USER_MASK ;
@@ -581,7 +581,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code, mmu_seq = vcpu->kvm->mmu_notifier_seq;smp_rmb (); -if (try_async_pf (vcpu, no_apf, walker.gfn, addr, &pfn, write_fault, +if (try_async_pf (vcpu, prefault, walker.gfn, addr, &pfn, write_fault, &map_writable))return 0 ;
Signature · 1 line
1.7.0.4
Avi Kivity
AppliedQuoted 2 lines · Xiao Guangrong
It's the speculative path if '
no_apf= 1' and we will specially handle this speculative path in the later patch, so 'prefault' is better to fit the sense
Applied all, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function