Commit bc9e9e67 authored by Jing Zhang's avatar Jing Zhang Committed by Paolo Bonzini
Browse files

KVM: debugfs: Reuse binary stats descriptors



To remove code duplication, use the binary stats descriptors in the
implementation of the debugfs interface for statistics. This unifies
the definition of statistics for the binary and debugfs interfaces.

Signed-off-by: default avatarJing Zhang <jingzhangos@google.com>
Message-Id: <20210618222709.1858088-8-jingzhangos@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 0b45d587
Loading
Loading
Loading
Loading
+0 −16
Original line number Diff line number Diff line
@@ -64,22 +64,6 @@ const struct kvm_stats_header kvm_vcpu_stats_header = {
		       sizeof(kvm_vcpu_stats_desc),
};

struct kvm_stats_debugfs_item debugfs_entries[] = {
	VCPU_STAT("halt_successful_poll", generic.halt_successful_poll),
	VCPU_STAT("halt_attempted_poll", generic.halt_attempted_poll),
	VCPU_STAT("halt_poll_invalid", generic.halt_poll_invalid),
	VCPU_STAT("halt_wakeup", generic.halt_wakeup),
	VCPU_STAT("hvc_exit_stat", hvc_exit_stat),
	VCPU_STAT("wfe_exit_stat", wfe_exit_stat),
	VCPU_STAT("wfi_exit_stat", wfi_exit_stat),
	VCPU_STAT("mmio_exit_user", mmio_exit_user),
	VCPU_STAT("mmio_exit_kernel", mmio_exit_kernel),
	VCPU_STAT("exits", exits),
	VCPU_STAT("halt_poll_success_ns", generic.halt_poll_success_ns),
	VCPU_STAT("halt_poll_fail_ns", generic.halt_poll_fail_ns),
	{ NULL }
};

static bool core_reg_offset_is_vreg(u64 off)
{
	return off >= KVM_REG_ARM_CORE_REG(fp_regs.vregs) &&
+0 −39
Original line number Diff line number Diff line
@@ -97,45 +97,6 @@ const struct kvm_stats_header kvm_vcpu_stats_header = {
		       sizeof(kvm_vcpu_stats_desc),
};

struct kvm_stats_debugfs_item debugfs_entries[] = {
	VCPU_STAT("wait", wait_exits),
	VCPU_STAT("cache", cache_exits),
	VCPU_STAT("signal", signal_exits),
	VCPU_STAT("interrupt", int_exits),
	VCPU_STAT("cop_unusable", cop_unusable_exits),
	VCPU_STAT("tlbmod", tlbmod_exits),
	VCPU_STAT("tlbmiss_ld", tlbmiss_ld_exits),
	VCPU_STAT("tlbmiss_st", tlbmiss_st_exits),
	VCPU_STAT("addrerr_st", addrerr_st_exits),
	VCPU_STAT("addrerr_ld", addrerr_ld_exits),
	VCPU_STAT("syscall", syscall_exits),
	VCPU_STAT("resvd_inst", resvd_inst_exits),
	VCPU_STAT("break_inst", break_inst_exits),
	VCPU_STAT("trap_inst", trap_inst_exits),
	VCPU_STAT("msa_fpe", msa_fpe_exits),
	VCPU_STAT("fpe", fpe_exits),
	VCPU_STAT("msa_disabled", msa_disabled_exits),
	VCPU_STAT("flush_dcache", flush_dcache_exits),
	VCPU_STAT("vz_gpsi", vz_gpsi_exits),
	VCPU_STAT("vz_gsfc", vz_gsfc_exits),
	VCPU_STAT("vz_hc", vz_hc_exits),
	VCPU_STAT("vz_grr", vz_grr_exits),
	VCPU_STAT("vz_gva", vz_gva_exits),
	VCPU_STAT("vz_ghfc", vz_ghfc_exits),
	VCPU_STAT("vz_gpa", vz_gpa_exits),
	VCPU_STAT("vz_resvd", vz_resvd_exits),
#ifdef CONFIG_CPU_LOONGSON64
	VCPU_STAT("vz_cpucfg", vz_cpucfg_exits),
#endif
	VCPU_STAT("halt_successful_poll", generic.halt_successful_poll),
	VCPU_STAT("halt_attempted_poll", generic.halt_attempted_poll),
	VCPU_STAT("halt_poll_invalid", generic.halt_poll_invalid),
	VCPU_STAT("halt_wakeup", generic.halt_wakeup),
	VCPU_STAT("halt_poll_success_ns", generic.halt_poll_success_ns),
	VCPU_STAT("halt_poll_fail_ns", generic.halt_poll_fail_ns),
	{NULL}
};

bool kvm_trace_guest_mode_change;

int kvm_guest_mode_change_trace_reg(void)
+0 −33
Original line number Diff line number Diff line
@@ -100,39 +100,6 @@ const struct kvm_stats_header kvm_vcpu_stats_header = {
		       sizeof(kvm_vcpu_stats_desc),
};

struct kvm_stats_debugfs_item debugfs_entries[] = {
	VCPU_STAT("exits", sum_exits),
	VCPU_STAT("mmio", mmio_exits),
	VCPU_STAT("sig", signal_exits),
	VCPU_STAT("sysc", syscall_exits),
	VCPU_STAT("inst_emu", emulated_inst_exits),
	VCPU_STAT("dec", dec_exits),
	VCPU_STAT("ext_intr", ext_intr_exits),
	VCPU_STAT("queue_intr", queue_intr),
	VCPU_STAT("halt_poll_success_ns", generic.halt_poll_success_ns),
	VCPU_STAT("halt_poll_fail_ns", generic.halt_poll_fail_ns),
	VCPU_STAT("halt_wait_ns", halt_wait_ns),
	VCPU_STAT("halt_successful_poll", generic.halt_successful_poll),
	VCPU_STAT("halt_attempted_poll", generic.halt_attempted_poll),
	VCPU_STAT("halt_successful_wait", halt_successful_wait),
	VCPU_STAT("halt_poll_invalid", generic.halt_poll_invalid),
	VCPU_STAT("halt_wakeup", generic.halt_wakeup),
	VCPU_STAT("pf_storage", pf_storage),
	VCPU_STAT("sp_storage", sp_storage),
	VCPU_STAT("pf_instruc", pf_instruc),
	VCPU_STAT("sp_instruc", sp_instruc),
	VCPU_STAT("ld", ld),
	VCPU_STAT("ld_slow", ld_slow),
	VCPU_STAT("st", st),
	VCPU_STAT("st_slow", st_slow),
	VCPU_STAT("pthru_all", pthru_all),
	VCPU_STAT("pthru_host", pthru_host),
	VCPU_STAT("pthru_bad_aff", pthru_bad_aff),
	VM_STAT("largepages_2M", num_2M_pages, .mode = 0444),
	VM_STAT("largepages_1G", num_1G_pages, .mode = 0444),
	{ NULL }
};

static inline void kvmppc_update_int_pending(struct kvm_vcpu *vcpu,
			unsigned long pending_now, unsigned long old_pending)
{
+0 −25
Original line number Diff line number Diff line
@@ -91,31 +91,6 @@ const struct kvm_stats_header kvm_vcpu_stats_header = {
		       sizeof(kvm_vcpu_stats_desc),
};

struct kvm_stats_debugfs_item debugfs_entries[] = {
	VCPU_STAT("mmio", mmio_exits),
	VCPU_STAT("sig", signal_exits),
	VCPU_STAT("itlb_r", itlb_real_miss_exits),
	VCPU_STAT("itlb_v", itlb_virt_miss_exits),
	VCPU_STAT("dtlb_r", dtlb_real_miss_exits),
	VCPU_STAT("dtlb_v", dtlb_virt_miss_exits),
	VCPU_STAT("sysc", syscall_exits),
	VCPU_STAT("isi", isi_exits),
	VCPU_STAT("dsi", dsi_exits),
	VCPU_STAT("inst_emu", emulated_inst_exits),
	VCPU_STAT("dec", dec_exits),
	VCPU_STAT("ext_intr", ext_intr_exits),
	VCPU_STAT("halt_successful_poll", generic.halt_successful_poll),
	VCPU_STAT("halt_attempted_poll", generic.halt_attempted_poll),
	VCPU_STAT("halt_poll_invalid", generic.halt_poll_invalid),
	VCPU_STAT("halt_wakeup", generic.halt_wakeup),
	VCPU_STAT("doorbell", dbell_exits),
	VCPU_STAT("guest doorbell", gdbell_exits),
	VCPU_STAT("halt_poll_success_ns", generic.halt_poll_success_ns),
	VCPU_STAT("halt_poll_fail_ns", generic.halt_poll_fail_ns),
	VM_STAT("remote_tlb_flush", generic.remote_tlb_flush),
	{ NULL }
};

/* TODO: use vcpu_printf() */
void kvmppc_dump_vcpu(struct kvm_vcpu *vcpu)
{
+0 −108
Original line number Diff line number Diff line
@@ -186,114 +186,6 @@ const struct kvm_stats_header kvm_vcpu_stats_header = {
		       sizeof(kvm_vcpu_stats_desc),
};

struct kvm_stats_debugfs_item debugfs_entries[] = {
	VCPU_STAT("userspace_handled", exit_userspace),
	VCPU_STAT("exit_null", exit_null),
	VCPU_STAT("pfault_sync", pfault_sync),
	VCPU_STAT("exit_validity", exit_validity),
	VCPU_STAT("exit_stop_request", exit_stop_request),
	VCPU_STAT("exit_external_request", exit_external_request),
	VCPU_STAT("exit_io_request", exit_io_request),
	VCPU_STAT("exit_external_interrupt", exit_external_interrupt),
	VCPU_STAT("exit_instruction", exit_instruction),
	VCPU_STAT("exit_pei", exit_pei),
	VCPU_STAT("exit_program_interruption", exit_program_interruption),
	VCPU_STAT("exit_instr_and_program_int", exit_instr_and_program),
	VCPU_STAT("exit_operation_exception", exit_operation_exception),
	VCPU_STAT("halt_successful_poll", generic.halt_successful_poll),
	VCPU_STAT("halt_attempted_poll", generic.halt_attempted_poll),
	VCPU_STAT("halt_poll_invalid", generic.halt_poll_invalid),
	VCPU_STAT("halt_no_poll_steal", halt_no_poll_steal),
	VCPU_STAT("halt_wakeup", generic.halt_wakeup),
	VCPU_STAT("halt_poll_success_ns", generic.halt_poll_success_ns),
	VCPU_STAT("halt_poll_fail_ns", generic.halt_poll_fail_ns),
	VCPU_STAT("instruction_lctlg", instruction_lctlg),
	VCPU_STAT("instruction_lctl", instruction_lctl),
	VCPU_STAT("instruction_stctl", instruction_stctl),
	VCPU_STAT("instruction_stctg", instruction_stctg),
	VCPU_STAT("deliver_ckc", deliver_ckc),
	VCPU_STAT("deliver_cputm", deliver_cputm),
	VCPU_STAT("deliver_emergency_signal", deliver_emergency_signal),
	VCPU_STAT("deliver_external_call", deliver_external_call),
	VCPU_STAT("deliver_service_signal", deliver_service_signal),
	VCPU_STAT("deliver_virtio", deliver_virtio),
	VCPU_STAT("deliver_stop_signal", deliver_stop_signal),
	VCPU_STAT("deliver_prefix_signal", deliver_prefix_signal),
	VCPU_STAT("deliver_restart_signal", deliver_restart_signal),
	VCPU_STAT("deliver_program", deliver_program),
	VCPU_STAT("deliver_io", deliver_io),
	VCPU_STAT("deliver_machine_check", deliver_machine_check),
	VCPU_STAT("exit_wait_state", exit_wait_state),
	VCPU_STAT("inject_ckc", inject_ckc),
	VCPU_STAT("inject_cputm", inject_cputm),
	VCPU_STAT("inject_external_call", inject_external_call),
	VM_STAT("inject_float_mchk", inject_float_mchk),
	VCPU_STAT("inject_emergency_signal", inject_emergency_signal),
	VM_STAT("inject_io", inject_io),
	VCPU_STAT("inject_mchk", inject_mchk),
	VM_STAT("inject_pfault_done", inject_pfault_done),
	VCPU_STAT("inject_program", inject_program),
	VCPU_STAT("inject_restart", inject_restart),
	VM_STAT("inject_service_signal", inject_service_signal),
	VCPU_STAT("inject_set_prefix", inject_set_prefix),
	VCPU_STAT("inject_stop_signal", inject_stop_signal),
	VCPU_STAT("inject_pfault_init", inject_pfault_init),
	VM_STAT("inject_virtio", inject_virtio),
	VCPU_STAT("instruction_epsw", instruction_epsw),
	VCPU_STAT("instruction_gs", instruction_gs),
	VCPU_STAT("instruction_io_other", instruction_io_other),
	VCPU_STAT("instruction_lpsw", instruction_lpsw),
	VCPU_STAT("instruction_lpswe", instruction_lpswe),
	VCPU_STAT("instruction_pfmf", instruction_pfmf),
	VCPU_STAT("instruction_ptff", instruction_ptff),
	VCPU_STAT("instruction_stidp", instruction_stidp),
	VCPU_STAT("instruction_sck", instruction_sck),
	VCPU_STAT("instruction_sckpf", instruction_sckpf),
	VCPU_STAT("instruction_spx", instruction_spx),
	VCPU_STAT("instruction_stpx", instruction_stpx),
	VCPU_STAT("instruction_stap", instruction_stap),
	VCPU_STAT("instruction_iske", instruction_iske),
	VCPU_STAT("instruction_ri", instruction_ri),
	VCPU_STAT("instruction_rrbe", instruction_rrbe),
	VCPU_STAT("instruction_sske", instruction_sske),
	VCPU_STAT("instruction_ipte_interlock", instruction_ipte_interlock),
	VCPU_STAT("instruction_essa", instruction_essa),
	VCPU_STAT("instruction_stsi", instruction_stsi),
	VCPU_STAT("instruction_stfl", instruction_stfl),
	VCPU_STAT("instruction_tb", instruction_tb),
	VCPU_STAT("instruction_tpi", instruction_tpi),
	VCPU_STAT("instruction_tprot", instruction_tprot),
	VCPU_STAT("instruction_tsch", instruction_tsch),
	VCPU_STAT("instruction_sthyi", instruction_sthyi),
	VCPU_STAT("instruction_sie", instruction_sie),
	VCPU_STAT("instruction_sigp_sense", instruction_sigp_sense),
	VCPU_STAT("instruction_sigp_sense_running", instruction_sigp_sense_running),
	VCPU_STAT("instruction_sigp_external_call", instruction_sigp_external_call),
	VCPU_STAT("instruction_sigp_emergency", instruction_sigp_emergency),
	VCPU_STAT("instruction_sigp_cond_emergency", instruction_sigp_cond_emergency),
	VCPU_STAT("instruction_sigp_start", instruction_sigp_start),
	VCPU_STAT("instruction_sigp_stop", instruction_sigp_stop),
	VCPU_STAT("instruction_sigp_stop_store_status", instruction_sigp_stop_store_status),
	VCPU_STAT("instruction_sigp_store_status", instruction_sigp_store_status),
	VCPU_STAT("instruction_sigp_store_adtl_status", instruction_sigp_store_adtl_status),
	VCPU_STAT("instruction_sigp_set_arch", instruction_sigp_arch),
	VCPU_STAT("instruction_sigp_set_prefix", instruction_sigp_prefix),
	VCPU_STAT("instruction_sigp_restart", instruction_sigp_restart),
	VCPU_STAT("instruction_sigp_cpu_reset", instruction_sigp_cpu_reset),
	VCPU_STAT("instruction_sigp_init_cpu_reset", instruction_sigp_init_cpu_reset),
	VCPU_STAT("instruction_sigp_unknown", instruction_sigp_unknown),
	VCPU_STAT("instruction_diag_10", diagnose_10),
	VCPU_STAT("instruction_diag_44", diagnose_44),
	VCPU_STAT("instruction_diag_9c", diagnose_9c),
	VCPU_STAT("diag_9c_ignored", diagnose_9c_ignored),
	VCPU_STAT("diag_9c_forward", diagnose_9c_forward),
	VCPU_STAT("instruction_diag_258", diagnose_258),
	VCPU_STAT("instruction_diag_308", diagnose_308),
	VCPU_STAT("instruction_diag_500", diagnose_500),
	VCPU_STAT("instruction_diag_other", diagnose_other),
	{ NULL }
};

/* allow nested virtualization in KVM (if enabled by user space) */
static int nested;
module_param(nested, int, S_IRUGO);
Loading