On Tue, Oct 27, 2020 at 10:59 AM Ben Gardon <bgardon@xxxxxxxxxx> wrote: > > The TDP MMU was initially implemented without some of the usual > tracepoints found in mmu.c. Correct this discrepancy by adding the > missing trace points to the TDP MMU. > > Tested: ran the demand paging selftest on an Intel Skylake machine with > all the trace points used by the TDP MMU enabled and observed > them firing with expected values. > > This patch can be viewed in Gerrit at: > https://linux-review.googlesource.com/c/virt/kvm/kvm/+/3812 > > Signed-off-by: Ben Gardon <bgardon@xxxxxxxxxx> > --- > arch/x86/kvm/mmu/tdp_mmu.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c > index 27e381c9da6c2..047e2d966abef 100644 > --- a/arch/x86/kvm/mmu/tdp_mmu.c > +++ b/arch/x86/kvm/mmu/tdp_mmu.c > @@ -7,6 +7,8 @@ > #include "tdp_mmu.h" > #include "spte.h" > > +#include <trace/events/kvm.h> > + > #ifdef CONFIG_X86_64 > static bool __read_mostly tdp_mmu_enabled = false; > module_param_named(tdp_mmu, tdp_mmu_enabled, bool, 0644); > @@ -101,6 +103,8 @@ static struct kvm_mmu_page *alloc_tdp_mmu_page(struct kvm_vcpu *vcpu, gfn_t gfn, > sp->gfn = gfn; > sp->tdp_mmu_page = true; > > + trace_kvm_mmu_get_page(sp, true); > + > return sp; > } > > @@ -271,6 +275,8 @@ static void __handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn, > pt = spte_to_child_pt(old_spte, level); > sp = sptep_to_sp(pt); > > + trace_kvm_mmu_prepare_zap_page(sp); > + > list_del(&sp->link); > > if (sp->lpage_disallowed) > @@ -473,11 +479,13 @@ static int tdp_mmu_map_handle_target_level(struct kvm_vcpu *vcpu, int write, > if (unlikely(is_noslot_pfn(pfn))) { > new_spte = make_mmio_spte(vcpu, iter->gfn, ACC_ALL); > trace_mark_mmio_spte(iter->sptep, iter->gfn, new_spte); > - } else > + } else { > make_spte_ret = make_spte(vcpu, ACC_ALL, iter->level, iter->gfn, > pfn, iter->old_spte, prefault, true, > map_writable, !shadow_accessed_mask, > &new_spte); > + trace_kvm_mmu_set_spte(iter->level, iter->gfn, iter->sptep); > + } > > if (new_spte == iter->old_spte) > ret = RET_PF_SPURIOUS; > @@ -691,6 +699,8 @@ static int age_gfn_range(struct kvm *kvm, struct kvm_memory_slot *slot, > > tdp_mmu_set_spte_no_acc_track(kvm, &iter, new_spte); > young = 1; > + > + trace_kvm_age_page(iter.gfn, iter.level, slot, young); > } > > return young; > -- > 2.29.0.rc2.309.g374f81d7ae-goog > If anyone has time to review this short series, I'd appreciate it. I don't want these to get lost in the shuffle. Thanks!