KVM: PPC: Book3S HV: Tracepoints for KVM HV guest interactions
Subsystems (3)
PATCH 1/1 KVM: PPC: Book3S HV: Tracepoints for KVM HV guest interactions
This patch adds trace points in the guest entry and exit code and also for exceptions handled by the host in kernel mode - hypercalls and page faults. The new events are added to /sys/kernel/debug/tracing/events under a new subsystem called kvm_hv.
---
Added new include file for common trace defines for kvm_pr and kvm_hv. Replaced hand-written numbers with defines in trace_hv.h.
arch/powerpc/kvm/book3s_64_mmu_hv.c | 12 +- arch/powerpc/kvm/book3s_hv.c | 19 ++ arch/powerpc/kvm/trace_book3s.h | 32 +++ arch/powerpc/kvm/trace_hv.h | 477 ++++++++++++++++++++++++++++++++++++ arch/powerpc/kvm/trace_pr.h | 25 +- 5 files changed, 538 insertions(+), 27 deletions(-) create mode 100644 arch/powerpc/kvm/trace_book3s.h create mode 100644 arch/powerpc/kvm/trace_hv.h
arch/powerpc/kvm/book3s_64_mmu_hv.c +9 -3
@@ -39,6 +39,7 @@#include <asm/cputable.h> #include "book3s_hv_cma.h" +#include "trace_hv.h" /* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */ #define MAX_LPID_970 63
@@ -628,6 +629,8 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, gfn = gpa >>PAGE_SHIFT ; memslot =gfn_to_memslot (kvm, gfn); +trace_kvm_page_fault_enter (vcpu, hpte, memslot, ea, dsisr); +/* No memslot means it's an emulated MMIO region */ if (!memslot || (memslot->flags &KVM_MEMSLOT_INVALID )) { gpa |= (ea & (psize -1 ));
@@ -642,6 +645,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, mmu_seq = kvm->mmu_notifier_seq;smp_rmb (); + ret = -EFAULT ; is_io =0 ; pfn =0 ; page =NULL ;
@@ -665,7 +669,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, }up_read (¤t->mm->mmap_sem);if (!pfn) -return -EFAULT ; + goto out_put; }else { page = pages[0 ];if (PageHuge (page)) {
@@ -693,14 +697,14 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, pfn =page_to_pfn (page); } - ret = -EFAULT ;if (psize > pte_size) goto out_put;/* Check WIMG vs. the actual page we're accessing */ if (!hpte_cache_flags_ok (r, is_io)) {if (is_io) -return -EFAULT ; + goto out_put; +/* * Allow guest to map emulated device memory as * uncacheable, but actually make it cacheable.
@@ -756,6 +760,8 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,SetPageDirty (page); out_put: +trace_kvm_page_fault_exit (vcpu, hpte, ret); +if (page) {/* * We drop pages[0] here, not page because page might
arch/powerpc/kvm/book3s_hv.c +19 -0
@@ -58,6 +58,9 @@#include "book3s.h" +#define CREATE_TRACE_POINTS +#include "trace_hv.h" +/* #define EXIT_DEBUG */ /* #define EXIT_DEBUG_SIMPLE */ /* #define EXIT_DEBUG_INT */
@@ -1721,6 +1724,7 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc)list_for_each_entry (vcpu, &vc->runnable_threads, arch.run_list) {kvmppc_start_thread (vcpu);kvmppc_create_dtl_entry (vcpu, vc); +trace_kvm_guest_enter (vcpu); }/* Set this explicitly in case thread 0 doesn't have a vcpu */
@@ -1729,6 +1733,9 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc) vc->vcore_state =VCORE_RUNNING ;preempt_disable (); + +trace_kvmppc_run_core (vc,0 ); +spin_unlock (&vc->lock);kvm_guest_enter ();
@@ -1774,6 +1781,8 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc) kvmppc_core_pending_dec(vcpu))kvmppc_core_dequeue_dec (vcpu); +trace_kvm_guest_exit (vcpu); + ret =RESUME_GUEST ;if (vcpu->arch.trap) ret = kvmppc_handle_exit_hv(vcpu->arch.kvm_run, vcpu,
@@ -1799,6 +1808,8 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc)wake_up (&vcpu->arch.cpu_run); } } + +trace_kvmppc_run_core (vc,1 ); }/*
@@ -1845,11 +1856,13 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc) } vc->vcore_state =VCORE_SLEEPING ; +trace_kvmppc_vcore_blocked (vc,0 );spin_unlock (&vc->lock);schedule ();finish_wait (&vc->wq, &wait);spin_lock (&vc->lock); vc->vcore_state =VCORE_INACTIVE ; +trace_kvmppc_vcore_blocked (vc,1 ); }static int kvmppc_run_vcpu (struct kvm_run *kvm_run,struct kvm_vcpu *vcpu)
@@ -1858,6 +1871,8 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)struct kvmppc_vcore *vc;struct kvm_vcpu *v, *vn; +trace_kvmppc_run_vcpu_enter (vcpu); + kvm_run->exit_reason =0 ; vcpu->arch.ret =RESUME_GUEST ; vcpu->arch.trap =0 ;
@@ -1887,6 +1902,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) VCORE_EXIT_COUNT(vc) == 0) {kvmppc_create_dtl_entry (vcpu, vc);kvmppc_start_thread (vcpu); +trace_kvm_guest_enter (vcpu); } else if (vc->vcore_state == VCORE_SLEEPING) {wake_up (&vc->wq); }
@@ -1951,6 +1967,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)wake_up (&v->arch.cpu_run); } +trace_kvmppc_run_vcpu_exit (vcpu, kvm_run);spin_unlock (&vc->lock);return vcpu->arch.ret; }
@@ -1996,7 +2013,9 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)if (run->exit_reason ==KVM_EXIT_PAPR_HCALL && !(vcpu->arch.shregs.msr &MSR_PR )) { +trace_kvm_hcall_enter (vcpu); r =kvmppc_pseries_do_hcall (vcpu); +trace_kvm_hcall_exit (vcpu, r);kvmppc_core_prepare_to_enter (vcpu); }else if (r ==RESUME_PAGE_FAULT ) { srcu_idx =srcu_read_lock (&vcpu->kvm->srcu);
arch/powerpc/kvm/trace_book3s.h new file +32 -0
@@ -0,0 +1,32 @@ +#if !defined(_TRACE_KVM_BOOK3S_H) +#define _TRACE_KVM_BOOK3S_H + +/* +* Common defines used by the trace macros in trace_pr.h and trace_hv.h +*/ + +#define kvm_trace_symbol_exit \ + {0x100, "SYSTEM_RESET"}, \ + {0x200, "MACHINE_CHECK"}, \ + {0x300, "DATA_STORAGE"}, \ + {0x380, "DATA_SEGMENT"}, \ + {0x400, "INST_STORAGE"}, \ + {0x480, "INST_SEGMENT"}, \ + {0x500, "EXTERNAL"}, \ + {0x501, "EXTERNAL_LEVEL"}, \ + {0x502, "EXTERNAL_HV"}, \ + {0x600, "ALIGNMENT"}, \ + {0x700, "PROGRAM"}, \ + {0x800, "FP_UNAVAIL"}, \ + {0x900, "DECREMENTER"}, \ + {0x980, "HV_DECREMENTER"}, \ + {0xc00, "SYSCALL"}, \ + {0xd00, "TRACE"}, \ + {0xe00, "H_DATA_STORAGE"}, \ + {0xe20, "H_INST_STORAGE"}, \ + {0xe40, "H_EMUL_ASSIST"}, \ + {0xf00, "PERFMON"}, \ + {0xf20, "ALTIVEC"}, \ + {0xf40, "VSX"} + +#endif
arch/powerpc/kvm/trace_hv.h new file +477 -0
477 lines not on this page · raw message
arch/powerpc/kvm/trace_pr.h +1 -24
@@ -3,36 +3,13 @@#define _TRACE_KVM_PR_H#include <linux/tracepoint.h> +#include "trace_book3s.h" #undef TRACE_SYSTEM#define TRACE_SYSTEM kvm_pr#define TRACE_INCLUDE_PATH .#define TRACE_INCLUDE_FILE trace_pr -#define kvm_trace_symbol_exit \ - {0x100, "SYSTEM_RESET"}, \ - {0x200, "MACHINE_CHECK"}, \ - {0x300, "DATA_STORAGE"}, \ - {0x380, "DATA_SEGMENT"}, \ - {0x400, "INST_STORAGE"}, \ - {0x480, "INST_SEGMENT"}, \ - {0x500, "EXTERNAL"}, \ - {0x501, "EXTERNAL_LEVEL"}, \ - {0x502, "EXTERNAL_HV"}, \ - {0x600, "ALIGNMENT"}, \ - {0x700, "PROGRAM"}, \ - {0x800, "FP_UNAVAIL"}, \ - {0x900, "DECREMENTER"}, \ - {0x980, "HV_DECREMENTER"}, \ - {0xc00, "SYSCALL"}, \ - {0xd00, "TRACE"}, \ - {0xe00, "H_DATA_STORAGE"}, \ - {0xe20, "H_INST_STORAGE"}, \ - {0xe40, "H_EMUL_ASSIST"}, \ - {0xf00, "PERFMON"}, \ - {0xf20, "ALTIVEC"}, \ - {0xf40, "VSX"} - TRACE_EVENT(kvm_book3s_reenter, TP_PROTO(int r, struct kvm_vcpu *vcpu), TP_ARGS(r, vcpu),
Signature · 1 line
1.8.3.4
Alexander Graf
AppliedQuoted 7 lines · Suresh E. Warrier
This patch adds trace points in the guest entry and exit code and also for exceptions handled by the host in kernel mode - hypercalls and page faults. The new events are added to
/sys/kernel/debug/tracing/eventsunder a new subsystem calledkvm_hv.Acked-by Paul Mackerras <[email protected]>Signed-off-by Suresh Warrier <[email protected]>
Thanks, applied to kvm-ppc-queue.
Alex