KVM: MIPS: Extend counters & events for VZ GExcCodes
authorJames Hogan <james.hogan@imgtec.com>
Tue, 14 Mar 2017 10:15:18 +0000 (10:15 +0000)
committerJames Hogan <james.hogan@imgtec.com>
Tue, 28 Mar 2017 13:53:46 +0000 (14:53 +0100)
Extend MIPS KVM stats counters and kvm_transition trace event codes to
cover hypervisor exceptions, which have their own GExcCode field in
CP0_GuestCtl0 with up to 32 hypervisor exception cause codes.

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: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
arch/mips/include/asm/kvm_host.h
arch/mips/kvm/mips.c
arch/mips/kvm/trace.h

index 0d308d4f2429f9abe299c09b0712167e508b4ef2..e8843784b784a31218ed42659b256dc459d342cb 100644 (file)
@@ -145,6 +145,16 @@ struct kvm_vcpu_stat {
        u64 fpe_exits;
        u64 msa_disabled_exits;
        u64 flush_dcache_exits;
+#ifdef CONFIG_KVM_MIPS_VZ
+       u64 vz_gpsi_exits;
+       u64 vz_gsfc_exits;
+       u64 vz_hc_exits;
+       u64 vz_grr_exits;
+       u64 vz_gva_exits;
+       u64 vz_ghfc_exits;
+       u64 vz_gpa_exits;
+       u64 vz_resvd_exits;
+#endif
        u64 halt_successful_poll;
        u64 halt_attempted_poll;
        u64 halt_poll_invalid;
index a743f67378ba7693146c4ac3689f354c96dd1634..c507533ef6ea97b2b335b8cd81e5793ad69b070b 100644 (file)
@@ -59,6 +59,16 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
        { "fpe",          VCPU_STAT(fpe_exits),          KVM_STAT_VCPU },
        { "msa_disabled", VCPU_STAT(msa_disabled_exits), KVM_STAT_VCPU },
        { "flush_dcache", VCPU_STAT(flush_dcache_exits), KVM_STAT_VCPU },
+#ifdef CONFIG_KVM_MIPS_VZ
+       { "vz_gpsi",      VCPU_STAT(vz_gpsi_exits),      KVM_STAT_VCPU },
+       { "vz_gsfc",      VCPU_STAT(vz_gsfc_exits),      KVM_STAT_VCPU },
+       { "vz_hc",        VCPU_STAT(vz_hc_exits),        KVM_STAT_VCPU },
+       { "vz_grr",       VCPU_STAT(vz_grr_exits),       KVM_STAT_VCPU },
+       { "vz_gva",       VCPU_STAT(vz_gva_exits),       KVM_STAT_VCPU },
+       { "vz_ghfc",      VCPU_STAT(vz_ghfc_exits),      KVM_STAT_VCPU },
+       { "vz_gpa",       VCPU_STAT(vz_gpa_exits),       KVM_STAT_VCPU },
+       { "vz_resvd",     VCPU_STAT(vz_resvd_exits),     KVM_STAT_VCPU },
+#endif
        { "halt_successful_poll", VCPU_STAT(halt_successful_poll), KVM_STAT_VCPU },
        { "halt_attempted_poll", VCPU_STAT(halt_attempted_poll), KVM_STAT_VCPU },
        { "halt_poll_invalid", VCPU_STAT(halt_poll_invalid), KVM_STAT_VCPU },
index c858cf168078401931d762542928857414d8b200..6e43c89114b831ecfa6adbc63934a80da78196b3 100644 (file)
@@ -66,6 +66,15 @@ DEFINE_EVENT(kvm_transition, kvm_out,
 #define KVM_TRACE_EXIT_WAIT            32
 #define KVM_TRACE_EXIT_CACHE           33
 #define KVM_TRACE_EXIT_SIGNAL          34
+/* 32 exit reasons correspond to GuestCtl0.GExcCode (VZ) */
+#define KVM_TRACE_EXIT_GEXCCODE_BASE   64
+#define KVM_TRACE_EXIT_GPSI            64      /*  0 */
+#define KVM_TRACE_EXIT_GSFC            65      /*  1 */
+#define KVM_TRACE_EXIT_HC              66      /*  2 */
+#define KVM_TRACE_EXIT_GRR             67      /*  3 */
+#define KVM_TRACE_EXIT_GVA             72      /*  8 */
+#define KVM_TRACE_EXIT_GHFC            73      /*  9 */
+#define KVM_TRACE_EXIT_GPA             74      /* 10 */
 
 /* Tracepoints for VM exits */
 #define kvm_trace_symbol_exit_types                            \
@@ -85,7 +94,14 @@ DEFINE_EVENT(kvm_transition, kvm_out,
        { KVM_TRACE_EXIT_MSA_DISABLED,  "MSA Disabled" },       \
        { KVM_TRACE_EXIT_WAIT,          "WAIT" },               \
        { KVM_TRACE_EXIT_CACHE,         "CACHE" },              \
-       { KVM_TRACE_EXIT_SIGNAL,        "Signal" }
+       { KVM_TRACE_EXIT_SIGNAL,        "Signal" },             \
+       { KVM_TRACE_EXIT_GPSI,          "GPSI" },               \
+       { KVM_TRACE_EXIT_GSFC,          "GSFC" },               \
+       { KVM_TRACE_EXIT_HC,            "HC" },                 \
+       { KVM_TRACE_EXIT_GRR,           "GRR" },                \
+       { KVM_TRACE_EXIT_GVA,           "GVA" },                \
+       { KVM_TRACE_EXIT_GHFC,          "GHFC" },               \
+       { KVM_TRACE_EXIT_GPA,           "GPA" }
 
 TRACE_EVENT(kvm_exit,
            TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),