MIPS: KVM: Clean up kvm_exit trace event

Clean up the MIPS kvm_exit trace event so that the exit reasons are
specified in a trace friendly way (via __print_symbolic), and so that
the exit reasons that derive straight from Cause.ExcCode values map
directly, allowing a single trace_kvm_exit() call to replace a bunch of
individual ones.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: kvm@vger.kernel.org
Cc: linux-mips@linux-mips.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
James Hogan 2016-06-14 09:40:12 +01:00 committed by Paolo Bonzini
parent 04ebebf45a
commit 1e09e86ac1
5 changed files with 45 additions and 63 deletions

View File

@ -125,28 +125,6 @@ struct kvm_vcpu_stat {
u32 halt_wakeup; u32 halt_wakeup;
}; };
enum kvm_mips_exit_types {
WAIT_EXITS,
CACHE_EXITS,
SIGNAL_EXITS,
INT_EXITS,
COP_UNUSABLE_EXITS,
TLBMOD_EXITS,
TLBMISS_LD_EXITS,
TLBMISS_ST_EXITS,
ADDRERR_ST_EXITS,
ADDRERR_LD_EXITS,
SYSCALL_EXITS,
RESVD_INST_EXITS,
BREAK_INST_EXITS,
TRAP_INST_EXITS,
MSA_FPE_EXITS,
FPE_EXITS,
MSA_DISABLED_EXITS,
FLUSH_DCACHE_EXITS,
MAX_KVM_MIPS_EXIT_TYPES
};
struct kvm_arch_memory_slot { struct kvm_arch_memory_slot {
}; };

View File

@ -775,7 +775,7 @@ enum emulation_result kvm_mips_emul_wait(struct kvm_vcpu *vcpu)
vcpu->arch.pending_exceptions); vcpu->arch.pending_exceptions);
++vcpu->stat.wait_exits; ++vcpu->stat.wait_exits;
trace_kvm_exit(vcpu, WAIT_EXITS); trace_kvm_exit(vcpu, KVM_TRACE_EXIT_WAIT);
if (!vcpu->arch.pending_exceptions) { if (!vcpu->arch.pending_exceptions) {
vcpu->arch.wait = 1; vcpu->arch.wait = 1;
kvm_vcpu_block(vcpu); kvm_vcpu_block(vcpu);
@ -1718,7 +1718,7 @@ enum emulation_result kvm_mips_emulate_inst(u32 cause, u32 *opc,
case cache_op: case cache_op:
++vcpu->stat.cache_exits; ++vcpu->stat.cache_exits;
trace_kvm_exit(vcpu, CACHE_EXITS); trace_kvm_exit(vcpu, KVM_TRACE_EXIT_CACHE);
er = kvm_mips_emulate_cache(inst, opc, cause, run, vcpu); er = kvm_mips_emulate_cache(inst, opc, cause, run, vcpu);
break; break;

View File

@ -1257,6 +1257,7 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
kvm_debug("kvm_mips_handle_exit: cause: %#x, PC: %p, kvm_run: %p, kvm_vcpu: %p\n", kvm_debug("kvm_mips_handle_exit: cause: %#x, PC: %p, kvm_run: %p, kvm_vcpu: %p\n",
cause, opc, run, vcpu); cause, opc, run, vcpu);
trace_kvm_exit(vcpu, exccode);
/* /*
* Do a privilege check, if in UM most of these exit conditions end up * Do a privilege check, if in UM most of these exit conditions end up
@ -1276,7 +1277,6 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
kvm_debug("[%d]EXCCODE_INT @ %p\n", vcpu->vcpu_id, opc); kvm_debug("[%d]EXCCODE_INT @ %p\n", vcpu->vcpu_id, opc);
++vcpu->stat.int_exits; ++vcpu->stat.int_exits;
trace_kvm_exit(vcpu, INT_EXITS);
if (need_resched()) if (need_resched())
cond_resched(); cond_resched();
@ -1288,7 +1288,6 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
kvm_debug("EXCCODE_CPU: @ PC: %p\n", opc); kvm_debug("EXCCODE_CPU: @ PC: %p\n", opc);
++vcpu->stat.cop_unusable_exits; ++vcpu->stat.cop_unusable_exits;
trace_kvm_exit(vcpu, COP_UNUSABLE_EXITS);
ret = kvm_mips_callbacks->handle_cop_unusable(vcpu); ret = kvm_mips_callbacks->handle_cop_unusable(vcpu);
/* XXXKYMA: Might need to return to user space */ /* XXXKYMA: Might need to return to user space */
if (run->exit_reason == KVM_EXIT_IRQ_WINDOW_OPEN) if (run->exit_reason == KVM_EXIT_IRQ_WINDOW_OPEN)
@ -1297,7 +1296,6 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
case EXCCODE_MOD: case EXCCODE_MOD:
++vcpu->stat.tlbmod_exits; ++vcpu->stat.tlbmod_exits;
trace_kvm_exit(vcpu, TLBMOD_EXITS);
ret = kvm_mips_callbacks->handle_tlb_mod(vcpu); ret = kvm_mips_callbacks->handle_tlb_mod(vcpu);
break; break;
@ -1307,7 +1305,6 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
badvaddr); badvaddr);
++vcpu->stat.tlbmiss_st_exits; ++vcpu->stat.tlbmiss_st_exits;
trace_kvm_exit(vcpu, TLBMISS_ST_EXITS);
ret = kvm_mips_callbacks->handle_tlb_st_miss(vcpu); ret = kvm_mips_callbacks->handle_tlb_st_miss(vcpu);
break; break;
@ -1316,61 +1313,51 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
cause, opc, badvaddr); cause, opc, badvaddr);
++vcpu->stat.tlbmiss_ld_exits; ++vcpu->stat.tlbmiss_ld_exits;
trace_kvm_exit(vcpu, TLBMISS_LD_EXITS);
ret = kvm_mips_callbacks->handle_tlb_ld_miss(vcpu); ret = kvm_mips_callbacks->handle_tlb_ld_miss(vcpu);
break; break;
case EXCCODE_ADES: case EXCCODE_ADES:
++vcpu->stat.addrerr_st_exits; ++vcpu->stat.addrerr_st_exits;
trace_kvm_exit(vcpu, ADDRERR_ST_EXITS);
ret = kvm_mips_callbacks->handle_addr_err_st(vcpu); ret = kvm_mips_callbacks->handle_addr_err_st(vcpu);
break; break;
case EXCCODE_ADEL: case EXCCODE_ADEL:
++vcpu->stat.addrerr_ld_exits; ++vcpu->stat.addrerr_ld_exits;
trace_kvm_exit(vcpu, ADDRERR_LD_EXITS);
ret = kvm_mips_callbacks->handle_addr_err_ld(vcpu); ret = kvm_mips_callbacks->handle_addr_err_ld(vcpu);
break; break;
case EXCCODE_SYS: case EXCCODE_SYS:
++vcpu->stat.syscall_exits; ++vcpu->stat.syscall_exits;
trace_kvm_exit(vcpu, SYSCALL_EXITS);
ret = kvm_mips_callbacks->handle_syscall(vcpu); ret = kvm_mips_callbacks->handle_syscall(vcpu);
break; break;
case EXCCODE_RI: case EXCCODE_RI:
++vcpu->stat.resvd_inst_exits; ++vcpu->stat.resvd_inst_exits;
trace_kvm_exit(vcpu, RESVD_INST_EXITS);
ret = kvm_mips_callbacks->handle_res_inst(vcpu); ret = kvm_mips_callbacks->handle_res_inst(vcpu);
break; break;
case EXCCODE_BP: case EXCCODE_BP:
++vcpu->stat.break_inst_exits; ++vcpu->stat.break_inst_exits;
trace_kvm_exit(vcpu, BREAK_INST_EXITS);
ret = kvm_mips_callbacks->handle_break(vcpu); ret = kvm_mips_callbacks->handle_break(vcpu);
break; break;
case EXCCODE_TR: case EXCCODE_TR:
++vcpu->stat.trap_inst_exits; ++vcpu->stat.trap_inst_exits;
trace_kvm_exit(vcpu, TRAP_INST_EXITS);
ret = kvm_mips_callbacks->handle_trap(vcpu); ret = kvm_mips_callbacks->handle_trap(vcpu);
break; break;
case EXCCODE_MSAFPE: case EXCCODE_MSAFPE:
++vcpu->stat.msa_fpe_exits; ++vcpu->stat.msa_fpe_exits;
trace_kvm_exit(vcpu, MSA_FPE_EXITS);
ret = kvm_mips_callbacks->handle_msa_fpe(vcpu); ret = kvm_mips_callbacks->handle_msa_fpe(vcpu);
break; break;
case EXCCODE_FPE: case EXCCODE_FPE:
++vcpu->stat.fpe_exits; ++vcpu->stat.fpe_exits;
trace_kvm_exit(vcpu, FPE_EXITS);
ret = kvm_mips_callbacks->handle_fpe(vcpu); ret = kvm_mips_callbacks->handle_fpe(vcpu);
break; break;
case EXCCODE_MSADIS: case EXCCODE_MSADIS:
++vcpu->stat.msa_disabled_exits; ++vcpu->stat.msa_disabled_exits;
trace_kvm_exit(vcpu, MSA_DISABLED_EXITS);
ret = kvm_mips_callbacks->handle_msa_disabled(vcpu); ret = kvm_mips_callbacks->handle_msa_disabled(vcpu);
break; break;
@ -1397,7 +1384,7 @@ skip_emul:
run->exit_reason = KVM_EXIT_INTR; run->exit_reason = KVM_EXIT_INTR;
ret = (-EINTR << 2) | RESUME_HOST; ret = (-EINTR << 2) | RESUME_HOST;
++vcpu->stat.signal_exits; ++vcpu->stat.signal_exits;
trace_kvm_exit(vcpu, SIGNAL_EXITS); trace_kvm_exit(vcpu, KVM_TRACE_EXIT_SIGNAL);
} }
} }

View File

@ -11,27 +11,6 @@
#include <linux/kvm_host.h> #include <linux/kvm_host.h>
char *kvm_mips_exit_types_str[MAX_KVM_MIPS_EXIT_TYPES] = {
"WAIT",
"CACHE",
"Signal",
"Interrupt",
"COP0/1 Unusable",
"TLB Mod",
"TLB Miss (LD)",
"TLB Miss (ST)",
"Address Err (ST)",
"Address Error (LD)",
"System Call",
"Reserved Inst",
"Break Inst",
"Trap Inst",
"MSA FPE",
"FPE",
"MSA Disabled",
"D-Cache Flushes",
};
char *kvm_cop0_str[N_MIPS_COPROC_REGS] = { char *kvm_cop0_str[N_MIPS_COPROC_REGS] = {
"Index", "Index",
"Random", "Random",

View File

@ -17,8 +17,45 @@
#define TRACE_INCLUDE_PATH . #define TRACE_INCLUDE_PATH .
#define TRACE_INCLUDE_FILE trace #define TRACE_INCLUDE_FILE trace
/* Tracepoints for VM eists */ /* The first 32 exit reasons correspond to Cause.ExcCode */
extern char *kvm_mips_exit_types_str[MAX_KVM_MIPS_EXIT_TYPES]; #define KVM_TRACE_EXIT_INT 0
#define KVM_TRACE_EXIT_TLBMOD 1
#define KVM_TRACE_EXIT_TLBMISS_LD 2
#define KVM_TRACE_EXIT_TLBMISS_ST 3
#define KVM_TRACE_EXIT_ADDRERR_LD 4
#define KVM_TRACE_EXIT_ADDRERR_ST 5
#define KVM_TRACE_EXIT_SYSCALL 8
#define KVM_TRACE_EXIT_BREAK_INST 9
#define KVM_TRACE_EXIT_RESVD_INST 10
#define KVM_TRACE_EXIT_COP_UNUSABLE 11
#define KVM_TRACE_EXIT_TRAP_INST 13
#define KVM_TRACE_EXIT_MSA_FPE 14
#define KVM_TRACE_EXIT_FPE 15
#define KVM_TRACE_EXIT_MSA_DISABLED 21
/* Further exit reasons */
#define KVM_TRACE_EXIT_WAIT 32
#define KVM_TRACE_EXIT_CACHE 33
#define KVM_TRACE_EXIT_SIGNAL 34
/* Tracepoints for VM exits */
#define kvm_trace_symbol_exit_types \
{ KVM_TRACE_EXIT_INT, "Interrupt" }, \
{ KVM_TRACE_EXIT_TLBMOD, "TLB Mod" }, \
{ KVM_TRACE_EXIT_TLBMISS_LD, "TLB Miss (LD)" }, \
{ KVM_TRACE_EXIT_TLBMISS_ST, "TLB Miss (ST)" }, \
{ KVM_TRACE_EXIT_ADDRERR_LD, "Address Error (LD)" }, \
{ KVM_TRACE_EXIT_ADDRERR_ST, "Address Err (ST)" }, \
{ KVM_TRACE_EXIT_SYSCALL, "System Call" }, \
{ KVM_TRACE_EXIT_BREAK_INST, "Break Inst" }, \
{ KVM_TRACE_EXIT_RESVD_INST, "Reserved Inst" }, \
{ KVM_TRACE_EXIT_COP_UNUSABLE, "COP0/1 Unusable" }, \
{ KVM_TRACE_EXIT_TRAP_INST, "Trap Inst" }, \
{ KVM_TRACE_EXIT_MSA_FPE, "MSA FPE" }, \
{ KVM_TRACE_EXIT_FPE, "FPE" }, \
{ KVM_TRACE_EXIT_MSA_DISABLED, "MSA Disabled" }, \
{ KVM_TRACE_EXIT_WAIT, "WAIT" }, \
{ KVM_TRACE_EXIT_CACHE, "CACHE" }, \
{ KVM_TRACE_EXIT_SIGNAL, "Signal" }
TRACE_EVENT(kvm_exit, TRACE_EVENT(kvm_exit,
TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason), TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
@ -34,7 +71,8 @@ TRACE_EVENT(kvm_exit,
), ),
TP_printk("[%s]PC: 0x%08lx", TP_printk("[%s]PC: 0x%08lx",
kvm_mips_exit_types_str[__entry->reason], __print_symbolic(__entry->reason,
kvm_trace_symbol_exit_types),
__entry->pc) __entry->pc)
); );