From 35d75a1986a2047b128fa17c273f6b9ab8f5b2c4 Mon Sep 17 00:00:00 2001 From: nocjj <1250062498@qq.com> Date: Thu, 3 Sep 2020 14:26:54 +0800 Subject: [PATCH] display: add vcpu_stat related items Add vcpu_stat related items to display, include: EXThvc: hvc kvm exit EXTWFE: wfe kvm exit EXTwfi: wfi kvm exit EXTmmioU: mmio User kvm exit EXTmmioK: mmio Kernel kvm exit EXTfp: FP ASIMD kvm exit EXTirq: IRQ kvm exit EXTsys64: SYS64 kvm exit EXTmabt: mem abort kvm exit EXTsum: times of all kvm exit Signed-off-by: Jiajun Chen <1250062498@qq.com> --- src/domain.c | 2 +- src/field.c | 12 ++++++++- src/field.h | 10 ++++++++ src/vcpu_stat.c | 8 +++--- src/vmtop.c | 65 +++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 83 insertions(+), 14 deletions(-) diff --git a/src/domain.c b/src/domain.c index a13bd57..3f58669 100644 --- a/src/domain.c +++ b/src/domain.c @@ -287,7 +287,7 @@ static void refresh_threads(struct domain *dom, struct domain *old_dom) refresh_delta_stat(&(dom->threads[i]), old_thread); if (dom->threads[i].type == ISVCPU) { refresh_delta_vcpu_stat(&(dom->threads[i]), old_thread); - sum_vcpu_stat(&(dom->threads[i]), old_thread); + sum_vcpu_stat(dom, &(dom->threads[i])); } } } diff --git a/src/field.c b/src/field.c index 2e8e783..7081989 100644 --- a/src/field.c +++ b/src/field.c @@ -24,9 +24,19 @@ const char *filter_help = "" FID fields[] = { /* name . flag . align */ {"DID", FIELDS_DISPLAY, 5 }, - {"VMname", FIELDS_DISPLAY, 14 }, + {"VM/task-name", FIELDS_DISPLAY, 14 }, {"PID", FIELDS_DISPLAY, 8 }, {"%CPU", FIELDS_DISPLAY, 6 }, + {"EXThvc", FIELDS_DISPLAY, 10 }, + {"EXTwfe", FIELDS_DISPLAY, 10 }, + {"EXTwfi", FIELDS_DISPLAY, 10 }, + {"EXTmmioU", FIELDS_DISPLAY, 10 }, + {"EXTmmioK", FIELDS_DISPLAY, 10 }, + {"EXTfp", FIELDS_DISPLAY, 10 }, + {"EXTirq", FIELDS_DISPLAY, 10 }, + {"EXTsys64", FIELDS_DISPLAY, 10 }, + {"EXTmabt", FIELDS_DISPLAY, 10 }, + {"EXTsum", FIELDS_DISPLAY, 10 }, {"S", FIELDS_DISPLAY, 5 }, {"P", FIELDS_DISPLAY, 5 } }; diff --git a/src/field.h b/src/field.h index a6c019f..9a7abd0 100644 --- a/src/field.h +++ b/src/field.h @@ -21,6 +21,16 @@ enum fields_type { FD_VMNAME, FD_PID, FD_CPU, + FD_EXTHVC, + FD_EXTWFE, + FD_EXTWFI, + FD_EXTMMIOU, + FD_EXTMMIOK, + FD_EXTFP, + FD_EXTIRQ, + FD_EXTSYS64, + FD_EXTMABT, + FD_EXTSUM, FD_STATE, FD_P, FD_END diff --git a/src/vcpu_stat.c b/src/vcpu_stat.c index 341db40..39e0e98 100644 --- a/src/vcpu_stat.c +++ b/src/vcpu_stat.c @@ -21,7 +21,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 - {"%lu", GF(pid)}, + {"%*u", NULL, NULL, NULL}, {"%llu", GDF(hvc_exit_stat)}, {"%llu", GDF(wfe_exit_stat)}, {"%llu", GDF(wfi_exit_stat)}, @@ -77,9 +77,9 @@ int get_vcpu_stat(struct domain *dom) } for (p = strtok_r(buf, " \t\r\n", &p_next); p && i < vcpu_stat_size; p = strtok_r(NULL, " \t\r\n", &p_next)) { - if (sscanf(p, vcpu_stat_stab[i].format, - (*vcpu_stat_stab[i].get_fun)(dom)) < 0) { - break; + if (vcpu_stat_stab[i].get_fun) { + sscanf(p, vcpu_stat_stab[i].format, + (*vcpu_stat_stab[i].get_fun)(dom)); } i++; } diff --git a/src/vmtop.c b/src/vmtop.c index d600738..6a7dc21 100644 --- a/src/vmtop.c +++ b/src/vmtop.c @@ -115,6 +115,47 @@ static void print_domain_field(struct domain *dom, int field) printw("%*.1f", fields[i].align, usage); break; } + /* kvm exit fields show */ + case FD_EXTHVC: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(hvc_exit_stat)); + break; + } + case FD_EXTWFE: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(wfe_exit_stat)); + break; + } + case FD_EXTWFI: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(wfi_exit_stat)); + break; + } + case FD_EXTMMIOU: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(mmio_exit_user)); + break; + } + case FD_EXTMMIOK: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(mmio_exit_kernel)); + break; + } + case FD_EXTFP: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(fp_asimd_exit_stat)); + break; + } + case FD_EXTIRQ: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(irq_exit_stat)); + break; + } + case FD_EXTSYS64: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(sys64_exit_stat)); + break; + } + case FD_EXTMABT: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(mabt_exit_stat)); + break; + } + case FD_EXTSUM: { + printw("%*llu", fields[i].align, dom->DELTA_VALUE(exits)); + break; + } case FD_STATE: { printw("%*c", fields[i].align, dom->state); break; @@ -129,17 +170,28 @@ static void print_domain_field(struct domain *dom, int field) return; } +static void show_task(struct domain *task) +{ + clrtoeol(); + for (int i = 0; i < FD_END; i++) { + if (fields[i].display_flag == 1) { + print_domain_field(task, i); + } + } + printw("\n"); +} + static void show_domains_threads(struct domain *dom) { + if (!dom) { + return; + } for (int i = 0; i < dom->nlwp; i++) { struct domain *thread = &(dom->threads[i]); if (thread == NULL) { continue; } - for (int j = 0; j < FD_END; j++) { - print_domain_field(thread, j); - } - printw("\n"); + show_task(thread); } } @@ -147,10 +199,7 @@ static void show_domains(struct domain_list *list) { for (int i = 0; i < list->num; i++) { struct domain *dom = &(list->domains[i]); - for (int j = 0; j < FD_END; j++) { - print_domain_field(dom, j); - } - printw("\n"); + show_task(dom); show_domains_threads(dom); } clrtobot(); /* clear to bottom to avoid image residue */ -- GitLab