Skip to content

Commit 3c78f78

Browse files
Suresh E. Warrieragraf
authored andcommitted
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. Acked-by: Paul Mackerras <[email protected]> Signed-off-by: Suresh Warrier <[email protected]> Signed-off-by: Alexander Graf <[email protected]>
1 parent 2711e24 commit 3c78f78

File tree

5 files changed

+539
-27
lines changed

5 files changed

+539
-27
lines changed

arch/powerpc/kvm/book3s_64_mmu_hv.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include <asm/ppc-opcode.h>
3838
#include <asm/cputable.h>
3939

40+
#include "trace_hv.h"
41+
4042
/* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */
4143
#define MAX_LPID_970 63
4244

@@ -622,6 +624,8 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
622624
gfn = gpa >> PAGE_SHIFT;
623625
memslot = gfn_to_memslot(kvm, gfn);
624626

627+
trace_kvm_page_fault_enter(vcpu, hpte, memslot, ea, dsisr);
628+
625629
/* No memslot means it's an emulated MMIO region */
626630
if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID))
627631
return kvmppc_hv_emulate_mmio(run, vcpu, gpa, ea,
@@ -641,6 +645,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
641645
mmu_seq = kvm->mmu_notifier_seq;
642646
smp_rmb();
643647

648+
ret = -EFAULT;
644649
is_io = 0;
645650
pfn = 0;
646651
page = NULL;
@@ -664,7 +669,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
664669
}
665670
up_read(&current->mm->mmap_sem);
666671
if (!pfn)
667-
return -EFAULT;
672+
goto out_put;
668673
} else {
669674
page = pages[0];
670675
pfn = page_to_pfn(page);
@@ -694,14 +699,14 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
694699
}
695700
}
696701

697-
ret = -EFAULT;
698702
if (psize > pte_size)
699703
goto out_put;
700704

701705
/* Check WIMG vs. the actual page we're accessing */
702706
if (!hpte_cache_flags_ok(r, is_io)) {
703707
if (is_io)
704-
return -EFAULT;
708+
goto out_put;
709+
705710
/*
706711
* Allow guest to map emulated device memory as
707712
* uncacheable, but actually make it cacheable.
@@ -765,6 +770,8 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
765770
SetPageDirty(page);
766771

767772
out_put:
773+
trace_kvm_page_fault_exit(vcpu, hpte, ret);
774+
768775
if (page) {
769776
/*
770777
* We drop pages[0] here, not page because page might

arch/powerpc/kvm/book3s_hv.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@
5858

5959
#include "book3s.h"
6060

61+
#define CREATE_TRACE_POINTS
62+
#include "trace_hv.h"
63+
6164
/* #define EXIT_DEBUG */
6265
/* #define EXIT_DEBUG_SIMPLE */
6366
/* #define EXIT_DEBUG_INT */
@@ -1730,6 +1733,7 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc)
17301733
list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) {
17311734
kvmppc_start_thread(vcpu);
17321735
kvmppc_create_dtl_entry(vcpu, vc);
1736+
trace_kvm_guest_enter(vcpu);
17331737
}
17341738

17351739
/* Set this explicitly in case thread 0 doesn't have a vcpu */
@@ -1738,6 +1742,9 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc)
17381742

17391743
vc->vcore_state = VCORE_RUNNING;
17401744
preempt_disable();
1745+
1746+
trace_kvmppc_run_core(vc, 0);
1747+
17411748
spin_unlock(&vc->lock);
17421749

17431750
kvm_guest_enter();
@@ -1783,6 +1790,8 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc)
17831790
kvmppc_core_pending_dec(vcpu))
17841791
kvmppc_core_dequeue_dec(vcpu);
17851792

1793+
trace_kvm_guest_exit(vcpu);
1794+
17861795
ret = RESUME_GUEST;
17871796
if (vcpu->arch.trap)
17881797
ret = kvmppc_handle_exit_hv(vcpu->arch.kvm_run, vcpu,
@@ -1808,6 +1817,8 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc)
18081817
wake_up(&vcpu->arch.cpu_run);
18091818
}
18101819
}
1820+
1821+
trace_kvmppc_run_core(vc, 1);
18111822
}
18121823

18131824
/*
@@ -1854,11 +1865,13 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
18541865
}
18551866

18561867
vc->vcore_state = VCORE_SLEEPING;
1868+
trace_kvmppc_vcore_blocked(vc, 0);
18571869
spin_unlock(&vc->lock);
18581870
schedule();
18591871
finish_wait(&vc->wq, &wait);
18601872
spin_lock(&vc->lock);
18611873
vc->vcore_state = VCORE_INACTIVE;
1874+
trace_kvmppc_vcore_blocked(vc, 1);
18621875
}
18631876

18641877
static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
@@ -1867,6 +1880,8 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
18671880
struct kvmppc_vcore *vc;
18681881
struct kvm_vcpu *v, *vn;
18691882

1883+
trace_kvmppc_run_vcpu_enter(vcpu);
1884+
18701885
kvm_run->exit_reason = 0;
18711886
vcpu->arch.ret = RESUME_GUEST;
18721887
vcpu->arch.trap = 0;
@@ -1896,6 +1911,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
18961911
VCORE_EXIT_COUNT(vc) == 0) {
18971912
kvmppc_create_dtl_entry(vcpu, vc);
18981913
kvmppc_start_thread(vcpu);
1914+
trace_kvm_guest_enter(vcpu);
18991915
} else if (vc->vcore_state == VCORE_SLEEPING) {
19001916
wake_up(&vc->wq);
19011917
}
@@ -1960,6 +1976,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
19601976
wake_up(&v->arch.cpu_run);
19611977
}
19621978

1979+
trace_kvmppc_run_vcpu_exit(vcpu, kvm_run);
19631980
spin_unlock(&vc->lock);
19641981
return vcpu->arch.ret;
19651982
}
@@ -2005,7 +2022,9 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
20052022

20062023
if (run->exit_reason == KVM_EXIT_PAPR_HCALL &&
20072024
!(vcpu->arch.shregs.msr & MSR_PR)) {
2025+
trace_kvm_hcall_enter(vcpu);
20082026
r = kvmppc_pseries_do_hcall(vcpu);
2027+
trace_kvm_hcall_exit(vcpu, r);
20092028
kvmppc_core_prepare_to_enter(vcpu);
20102029
} else if (r == RESUME_PAGE_FAULT) {
20112030
srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);

arch/powerpc/kvm/trace_book3s.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#if !defined(_TRACE_KVM_BOOK3S_H)
2+
#define _TRACE_KVM_BOOK3S_H
3+
4+
/*
5+
* Common defines used by the trace macros in trace_pr.h and trace_hv.h
6+
*/
7+
8+
#define kvm_trace_symbol_exit \
9+
{0x100, "SYSTEM_RESET"}, \
10+
{0x200, "MACHINE_CHECK"}, \
11+
{0x300, "DATA_STORAGE"}, \
12+
{0x380, "DATA_SEGMENT"}, \
13+
{0x400, "INST_STORAGE"}, \
14+
{0x480, "INST_SEGMENT"}, \
15+
{0x500, "EXTERNAL"}, \
16+
{0x501, "EXTERNAL_LEVEL"}, \
17+
{0x502, "EXTERNAL_HV"}, \
18+
{0x600, "ALIGNMENT"}, \
19+
{0x700, "PROGRAM"}, \
20+
{0x800, "FP_UNAVAIL"}, \
21+
{0x900, "DECREMENTER"}, \
22+
{0x980, "HV_DECREMENTER"}, \
23+
{0xc00, "SYSCALL"}, \
24+
{0xd00, "TRACE"}, \
25+
{0xe00, "H_DATA_STORAGE"}, \
26+
{0xe20, "H_INST_STORAGE"}, \
27+
{0xe40, "H_EMUL_ASSIST"}, \
28+
{0xf00, "PERFMON"}, \
29+
{0xf20, "ALTIVEC"}, \
30+
{0xf40, "VSX"}
31+
32+
#endif

0 commit comments

Comments
 (0)