Message ID | 20220422210546.458943-19-dmatlack@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: Extend Eager Page Splitting to the shadow MMU | expand |
On Fri, Apr 22, 2022, David Matlack wrote: > drop_large_spte() drops a large SPTE if it exists and then flushes TLBs. > Its helper function, __drop_large_spte(), does the drop without the > flush. > > In preparation for eager page splitting, which will need to sometimes > flush when dropping large SPTEs (and sometimes not), push the flushing > logic down into __drop_large_spte() and add a bool parameter to control > it. > > No functional change intended. > > Reviewed-by: Peter Xu <peterx@redhat.com> > Signed-off-by: David Matlack <dmatlack@google.com> > --- > arch/x86/kvm/mmu/mmu.c | 29 +++++++++++++++-------------- > 1 file changed, 15 insertions(+), 14 deletions(-) > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > index 479c581e8a96..a5961c17eb36 100644 > --- a/arch/x86/kvm/mmu/mmu.c > +++ b/arch/x86/kvm/mmu/mmu.c > @@ -1183,28 +1183,29 @@ static void drop_spte(struct kvm *kvm, u64 *sptep) > rmap_remove(kvm, sptep); > } > > - > -static bool __drop_large_spte(struct kvm *kvm, u64 *sptep) > +static void __drop_large_spte(struct kvm *kvm, u64 *sptep, bool flush) > { > - if (is_large_pte(*sptep)) { > - WARN_ON(sptep_to_sp(sptep)->role.level == PG_LEVEL_4K); > - drop_spte(kvm, sptep); > - return true; > - } > + struct kvm_mmu_page *sp; > > - return false; > -} > + if (!is_large_pte(*sptep)) > + return; > > -static void drop_large_spte(struct kvm_vcpu *vcpu, u64 *sptep) > -{ > - if (__drop_large_spte(vcpu->kvm, sptep)) { > - struct kvm_mmu_page *sp = sptep_to_sp(sptep); > + sp = sptep_to_sp(sptep); > + WARN_ON(sp->role.level == PG_LEVEL_4K); > > - kvm_flush_remote_tlbs_with_address(vcpu->kvm, sp->gfn, > + drop_spte(kvm, sptep); > + > + if (flush) { Unnecessary curly braces. > + kvm_flush_remote_tlbs_with_address(kvm, sp->gfn, > KVM_PAGES_PER_HPAGE(sp->role.level)); > } > } > > +static void drop_large_spte(struct kvm_vcpu *vcpu, u64 *sptep) > +{ > + return __drop_large_spte(vcpu->kvm, sptep, true); > +} > + > /* > * Write-protect on the specified @sptep, @pt_protect indicates whether > * spte write-protection is caused by protecting shadow page table. > -- > 2.36.0.rc2.479.g8af0fa9b8e-goog >
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 479c581e8a96..a5961c17eb36 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -1183,28 +1183,29 @@ static void drop_spte(struct kvm *kvm, u64 *sptep) rmap_remove(kvm, sptep); } - -static bool __drop_large_spte(struct kvm *kvm, u64 *sptep) +static void __drop_large_spte(struct kvm *kvm, u64 *sptep, bool flush) { - if (is_large_pte(*sptep)) { - WARN_ON(sptep_to_sp(sptep)->role.level == PG_LEVEL_4K); - drop_spte(kvm, sptep); - return true; - } + struct kvm_mmu_page *sp; - return false; -} + if (!is_large_pte(*sptep)) + return; -static void drop_large_spte(struct kvm_vcpu *vcpu, u64 *sptep) -{ - if (__drop_large_spte(vcpu->kvm, sptep)) { - struct kvm_mmu_page *sp = sptep_to_sp(sptep); + sp = sptep_to_sp(sptep); + WARN_ON(sp->role.level == PG_LEVEL_4K); - kvm_flush_remote_tlbs_with_address(vcpu->kvm, sp->gfn, + drop_spte(kvm, sptep); + + if (flush) { + kvm_flush_remote_tlbs_with_address(kvm, sp->gfn, KVM_PAGES_PER_HPAGE(sp->role.level)); } } +static void drop_large_spte(struct kvm_vcpu *vcpu, u64 *sptep) +{ + return __drop_large_spte(vcpu->kvm, sptep, true); +} + /* * Write-protect on the specified @sptep, @pt_protect indicates whether * spte write-protection is caused by protecting shadow page table.