312 lines
10 KiB
Diff
312 lines
10 KiB
Diff
From 697ed50e404408d34e19afc493e5fe8270cc3433 Mon Sep 17 00:00:00 2001
|
|
From: nocjj <1250062498@qq.com>
|
|
Date: Mon, 2 Nov 2020 19:07:29 +0800
|
|
Subject: [PATCH 7/8] arch: add x86 kvm exits items
|
|
|
|
add x86 support for vmtop
|
|
|
|
Signed-off-by: nocjj <1250062498@qq.com>
|
|
---
|
|
src/field.c | 26 ++++++++++++++++++++++++++
|
|
src/field.h | 26 ++++++++++++++++++++++++++
|
|
src/type.h | 33 +++++++++++++++++++++++++++++++++
|
|
src/vcpu_stat.c | 34 ++++++++++++++++++++++++++++++++++
|
|
src/vcpu_stat.h | 33 +++++++++++++++++++++++++++++++++
|
|
src/vmtop.c | 26 ++++++++++++++++++++++++++
|
|
6 files changed, 178 insertions(+)
|
|
|
|
diff --git a/src/field.c b/src/field.c
|
|
index 7ff0d44..418d642 100644
|
|
--- a/src/field.c
|
|
+++ b/src/field.c
|
|
@@ -42,6 +42,7 @@ FID fields[] = {
|
|
{"VM/task-name", FIELDS_DISPLAY, 14, NULL },
|
|
{"PID", FIELDS_DISPLAY, 8, NULL },
|
|
{"%CPU", FIELDS_DISPLAY, 8, NULL },
|
|
+#ifdef __aarch64__
|
|
{"EXThvc", FIELDS_DISPLAY, 10, GDF(hvc_exit_stat) },
|
|
{"EXTwfe", FIELDS_DISPLAY, 10, GDF(wfe_exit_stat) },
|
|
{"EXTwfi", FIELDS_DISPLAY, 10, GDF(wfi_exit_stat) },
|
|
@@ -63,6 +64,31 @@ FID fields[] = {
|
|
{"EXTsve", FIELDS_HIDDEN, 10, GDF(sve_exit_stat) },
|
|
{"EXTdbg", FIELDS_HIDDEN, 10, GDF(debug_exit_stat) },
|
|
{"EXTfail", FIELDS_HIDDEN, 10, GDF(fail_entry_exit_stat) },
|
|
+#else
|
|
+ {"PFfix", FIELDS_HIDDEN, 10, GDF(pf_fixed) },
|
|
+ {"PFgu", FIELDS_HIDDEN, 10, GDF(pf_guest) },
|
|
+ {"INvlpg", FIELDS_HIDDEN, 10, GDF(invlpg) },
|
|
+ {"EXTio", FIELDS_HIDDEN, 10, GDF(io_exits) },
|
|
+ {"EXTmmio", FIELDS_HIDDEN, 10, GDF(mmio_exits) },
|
|
+ {"EXTsum", FIELDS_DISPLAY, 10, GDF(exits) },
|
|
+ {"EXThalt", FIELDS_HIDDEN, 10, GDF(halt_exits) },
|
|
+ {"EXTsig", FIELDS_HIDDEN, 10, GDF(signal_exits) },
|
|
+ {"EXTirq", FIELDS_HIDDEN, 10, GDF(irq_exits) },
|
|
+ {"EXTnmiW", FIELDS_HIDDEN, 10, GDF(nmi_window_exits) },
|
|
+ {"EXTirqW", FIELDS_HIDDEN, 10, GDF(irq_window_exits) },
|
|
+ {"IrqIn", FIELDS_HIDDEN, 10, GDF(irq_injections) },
|
|
+ {"NmiIn", FIELDS_HIDDEN, 10, GDF(nmi_injections) },
|
|
+ {"TLBfl", FIELDS_HIDDEN, 10, GDF(tlb_flush) },
|
|
+ {"HostReL", FIELDS_HIDDEN, 10, GDF(host_state_reload) },
|
|
+ {"Hyperv", FIELDS_HIDDEN, 10, GDF(hypercalls) },
|
|
+ {"EXTcr", FIELDS_HIDDEN, 10, GDF(cr_exits) },
|
|
+ {"EXTrmsr", FIELDS_HIDDEN, 10, GDF(msr_rd_exits) },
|
|
+ {"EXTwmsr", FIELDS_HIDDEN, 10, GDF(msr_wr_exits) },
|
|
+ {"EXTapic", FIELDS_HIDDEN, 10, GDF(apic_wr_exits) },
|
|
+ {"EXTeptv", FIELDS_DISPLAY, 10, GDF(ept_vio_exits) },
|
|
+ {"EXTeptm", FIELDS_HIDDEN, 10, GDF(ept_mis_exits) },
|
|
+ {"EXTpau", FIELDS_DISPLAY, 10, GDF(pause_exits) },
|
|
+#endif
|
|
{"S", FIELDS_DISPLAY, 5, GF(state) },
|
|
{"P", FIELDS_DISPLAY, 5, GF(processor) },
|
|
{"%ST", FIELDS_DISPLAY, 8, GDF(steal) },
|
|
diff --git a/src/field.h b/src/field.h
|
|
index 3a33008..8ce047a 100644
|
|
--- a/src/field.h
|
|
+++ b/src/field.h
|
|
@@ -21,6 +21,7 @@ enum fields_type {
|
|
FD_VMNAME,
|
|
FD_PID,
|
|
FD_CPU,
|
|
+#ifdef __aarch64__
|
|
FD_EXTHVC,
|
|
FD_EXTWFE,
|
|
FD_EXTWFI,
|
|
@@ -42,6 +43,31 @@ enum fields_type {
|
|
FD_EXTSVE,
|
|
FD_EXTDBG,
|
|
FD_EXTFAIL,
|
|
+#else
|
|
+ FD_PFFIXED,
|
|
+ FD_PFGUEST,
|
|
+ FD_INVLPG,
|
|
+ FD_IOEXITS,
|
|
+ FD_MMIOEXITS,
|
|
+ FD_EXTSUM,
|
|
+ FD_EXTHALT,
|
|
+ FD_EXTSIG,
|
|
+ FD_EXTIRQ,
|
|
+ FD_EXTNMIW,
|
|
+ FD_EXTIRQW,
|
|
+ FD_IRQIN,
|
|
+ FD_NMIIN,
|
|
+ FD_TLB,
|
|
+ FD_HOSTREL,
|
|
+ FD_HYPERV,
|
|
+ FD_EXTCR,
|
|
+ FD_EXTRMSR,
|
|
+ FD_EXTWMSR,
|
|
+ FD_EXTAPIC,
|
|
+ FD_EXTEPTV,
|
|
+ FD_EXTEPTM,
|
|
+ FD_EXTPAU,
|
|
+#endif
|
|
FD_STATE,
|
|
FD_P,
|
|
FD_ST,
|
|
diff --git a/src/type.h b/src/type.h
|
|
index 40b7287..3c08387 100644
|
|
--- a/src/type.h
|
|
+++ b/src/type.h
|
|
@@ -116,6 +116,7 @@ struct domain {
|
|
start_time;
|
|
/* vcpu_stat items */
|
|
u64
|
|
+#ifdef __aarch64__
|
|
DFX_VALUE(hvc_exit_stat),
|
|
DFX_VALUE(wfe_exit_stat),
|
|
DFX_VALUE(wfi_exit_stat),
|
|
@@ -137,6 +138,38 @@ struct domain {
|
|
DFX_VALUE(smc_exit_stat),
|
|
DFX_VALUE(sve_exit_stat),
|
|
DFX_VALUE(debug_exit_stat),
|
|
+#else
|
|
+ DFX_VALUE(pf_fixed),
|
|
+ DFX_VALUE(pf_guest),
|
|
+ DFX_VALUE(tlb_flush),
|
|
+ DFX_VALUE(invlpg),
|
|
+ DFX_VALUE(exits),
|
|
+ DFX_VALUE(io_exits),
|
|
+ DFX_VALUE(mmio_exits),
|
|
+ DFX_VALUE(signal_exits),
|
|
+ DFX_VALUE(irq_window_exits),
|
|
+ DFX_VALUE(nmi_window_exits),
|
|
+ DFX_VALUE(halt_exits),
|
|
+ DFX_VALUE(halt_successful_poll),
|
|
+ DFX_VALUE(halt_attempted_poll),
|
|
+ DFX_VALUE(halt_wakeup),
|
|
+ DFX_VALUE(request_irq_exits),
|
|
+ DFX_VALUE(irq_exits),
|
|
+ DFX_VALUE(host_state_reload),
|
|
+ DFX_VALUE(fpu_reload),
|
|
+ DFX_VALUE(insn_emulation),
|
|
+ DFX_VALUE(insn_emulation_fail),
|
|
+ DFX_VALUE(hypercalls),
|
|
+ DFX_VALUE(irq_injections),
|
|
+ DFX_VALUE(nmi_injections),
|
|
+ DFX_VALUE(cr_exits),
|
|
+ DFX_VALUE(msr_rd_exits),
|
|
+ DFX_VALUE(msr_wr_exits),
|
|
+ DFX_VALUE(apic_wr_exits),
|
|
+ DFX_VALUE(ept_vio_exits),
|
|
+ DFX_VALUE(ept_mis_exits),
|
|
+ DFX_VALUE(pause_exits),
|
|
+#endif
|
|
DFX_VALUE(steal),
|
|
st_max,
|
|
DFX_VALUE(vcpu_utime),
|
|
diff --git a/src/vcpu_stat.c b/src/vcpu_stat.c
|
|
index 7009d41..55cfc7b 100644
|
|
--- a/src/vcpu_stat.c
|
|
+++ b/src/vcpu_stat.c
|
|
@@ -22,6 +22,7 @@ struct file_item vcpu_stat_stab[] = {
|
|
#define GDF(f) (void *)GET_NAME(f), (void *)DELTA_NAME(f), (void *)SUM_NAME(f)
|
|
#define GF(f) (void *)GET_NAME(f), NULL, NULL
|
|
{"%u", GF(pid) },
|
|
+#ifdef __aarch64__
|
|
{"%llu", GDF(hvc_exit_stat) },
|
|
{"%llu", GDF(wfe_exit_stat) },
|
|
{"%llu", GDF(wfi_exit_stat) },
|
|
@@ -43,11 +44,44 @@ struct file_item vcpu_stat_stab[] = {
|
|
{"%llu", GDF(smc_exit_stat) },
|
|
{"%llu", GDF(sve_exit_stat) },
|
|
{"%llu", GDF(debug_exit_stat) },
|
|
+#else
|
|
+ {"%llu", GDF(pf_fixed) },
|
|
+ {"%llu", GDF(pf_guest) },
|
|
+ {"%llu", GDF(tlb_flush) },
|
|
+ {"%llu", GDF(invlpg) },
|
|
+ {"%llu", GDF(exits) },
|
|
+ {"%llu", GDF(io_exits) },
|
|
+ {"%llu", GDF(mmio_exits) },
|
|
+ {"%llu", GDF(signal_exits) },
|
|
+ {"%llu", GDF(irq_window_exits) },
|
|
+ {"%llu", GDF(nmi_window_exits) },
|
|
+ {"%llu", GDF(halt_exits) },
|
|
+ {"%llu", GDF(halt_successful_poll) },
|
|
+ {"%llu", GDF(halt_attempted_poll) },
|
|
+ {"%llu", GDF(halt_wakeup) },
|
|
+ {"%llu", GDF(request_irq_exits) },
|
|
+ {"%llu", GDF(irq_exits) },
|
|
+ {"%llu", GDF(host_state_reload) },
|
|
+ {"%llu", GDF(fpu_reload) },
|
|
+ {"%llu", GDF(insn_emulation) },
|
|
+ {"%llu", GDF(insn_emulation_fail) },
|
|
+ {"%llu", GDF(hypercalls) },
|
|
+ {"%llu", GDF(irq_injections) },
|
|
+ {"%llu", GDF(nmi_injections) },
|
|
+ {"%llu", GDF(cr_exits) },
|
|
+ {"%llu", GDF(msr_rd_exits) },
|
|
+ {"%llu", GDF(msr_wr_exits) },
|
|
+ {"%llu", GDF(apic_wr_exits) },
|
|
+ {"%llu", GDF(ept_vio_exits) },
|
|
+ {"%llu", GDF(ept_mis_exits) },
|
|
+ {"%llu", GDF(pause_exits) },
|
|
+#endif
|
|
{"%llu", GDF(steal) },
|
|
{"%llu", GF(st_max) },
|
|
{"%llu", GDF(vcpu_utime) },
|
|
{"%llu", GDF(vcpu_stime) },
|
|
{"%llu", GDF(gtime) }
|
|
+
|
|
#undef GF
|
|
#undef GDF
|
|
};
|
|
diff --git a/src/vcpu_stat.h b/src/vcpu_stat.h
|
|
index edbef86..9b3f4c2 100644
|
|
--- a/src/vcpu_stat.h
|
|
+++ b/src/vcpu_stat.h
|
|
@@ -15,6 +15,7 @@
|
|
|
|
/* vcpu_stat items get fun */
|
|
GET_VALUE(pid)
|
|
+#ifdef __aarch64__
|
|
GET_DELTA_FUN(hvc_exit_stat)
|
|
GET_DELTA_FUN(wfe_exit_stat)
|
|
GET_DELTA_FUN(wfi_exit_stat)
|
|
@@ -36,6 +37,38 @@ GET_DELTA_FUN(cp14_64_exit_stat)
|
|
GET_DELTA_FUN(smc_exit_stat)
|
|
GET_DELTA_FUN(sve_exit_stat)
|
|
GET_DELTA_FUN(debug_exit_stat)
|
|
+#else
|
|
+GET_DELTA_FUN(pf_fixed)
|
|
+GET_DELTA_FUN(pf_guest)
|
|
+GET_DELTA_FUN(tlb_flush)
|
|
+GET_DELTA_FUN(invlpg)
|
|
+GET_DELTA_FUN(exits)
|
|
+GET_DELTA_FUN(io_exits)
|
|
+GET_DELTA_FUN(mmio_exits)
|
|
+GET_DELTA_FUN(signal_exits)
|
|
+GET_DELTA_FUN(irq_window_exits)
|
|
+GET_DELTA_FUN(nmi_window_exits)
|
|
+GET_DELTA_FUN(halt_exits)
|
|
+GET_DELTA_FUN(halt_successful_poll)
|
|
+GET_DELTA_FUN(halt_attempted_poll)
|
|
+GET_DELTA_FUN(halt_wakeup)
|
|
+GET_DELTA_FUN(request_irq_exits)
|
|
+GET_DELTA_FUN(irq_exits)
|
|
+GET_DELTA_FUN(host_state_reload)
|
|
+GET_DELTA_FUN(fpu_reload)
|
|
+GET_DELTA_FUN(insn_emulation)
|
|
+GET_DELTA_FUN(insn_emulation_fail)
|
|
+GET_DELTA_FUN(hypercalls)
|
|
+GET_DELTA_FUN(irq_injections)
|
|
+GET_DELTA_FUN(nmi_injections)
|
|
+GET_DELTA_FUN(cr_exits)
|
|
+GET_DELTA_FUN(msr_rd_exits)
|
|
+GET_DELTA_FUN(msr_wr_exits)
|
|
+GET_DELTA_FUN(apic_wr_exits)
|
|
+GET_DELTA_FUN(ept_vio_exits)
|
|
+GET_DELTA_FUN(ept_mis_exits)
|
|
+GET_DELTA_FUN(pause_exits)
|
|
+#endif
|
|
GET_DELTA_FUN(steal)
|
|
GET_VALUE(st_max)
|
|
GET_DELTA_FUN(vcpu_utime)
|
|
diff --git a/src/vmtop.c b/src/vmtop.c
|
|
index 0137fdd..f5fd4bd 100644
|
|
--- a/src/vmtop.c
|
|
+++ b/src/vmtop.c
|
|
@@ -192,6 +192,7 @@ static void print_domain_field(struct domain *dom, int field)
|
|
break;
|
|
}
|
|
/* kvm exit fields show */
|
|
+#ifdef __aarch64__
|
|
case FD_EXTHVC:
|
|
case FD_EXTWFE:
|
|
case FD_EXTWFI:
|
|
@@ -213,6 +214,31 @@ static void print_domain_field(struct domain *dom, int field)
|
|
case FD_EXTSVE:
|
|
case FD_EXTDBG:
|
|
case FD_EXTFAIL: {
|
|
+#else
|
|
+ case FD_PFFIXED:
|
|
+ case FD_PFGUEST:
|
|
+ case FD_INVLPG:
|
|
+ case FD_IOEXITS:
|
|
+ case FD_MMIOEXITS:
|
|
+ case FD_EXTSUM:
|
|
+ case FD_EXTHALT:
|
|
+ case FD_EXTSIG:
|
|
+ case FD_EXTIRQ:
|
|
+ case FD_EXTNMIW:
|
|
+ case FD_EXTIRQW:
|
|
+ case FD_IRQIN:
|
|
+ case FD_NMIIN:
|
|
+ case FD_TLB:
|
|
+ case FD_HOSTREL:
|
|
+ case FD_HYPERV:
|
|
+ case FD_EXTCR:
|
|
+ case FD_EXTRMSR:
|
|
+ case FD_EXTWMSR:
|
|
+ case FD_EXTAPIC:
|
|
+ case FD_EXTEPTV:
|
|
+ case FD_EXTEPTM:
|
|
+ case FD_EXTPAU: {
|
|
+#endif
|
|
print_scr("%*llu", fields[i].align, *(u64 *)(*fields[i].get_fun)(dom));
|
|
break;
|
|
}
|
|
--
|
|
2.27.0
|
|
|