aboutsummaryrefslogtreecommitdiffstats
path: root/tools/misc/xenperf.c
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-11-14 11:55:58 +0000
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-11-14 11:55:58 +0000
commitb0e1696ee059add2cd271b44adff48aa243826c5 (patch)
treefc16d414e2d68307fabd01ec99ad416e4e9e1fde /tools/misc/xenperf.c
parenta83a2ee1b7746cae7e0f7fd641e74c578d7f75e8 (diff)
downloadxen-b0e1696ee059add2cd271b44adff48aa243826c5.tar.gz
xen-b0e1696ee059add2cd271b44adff48aa243826c5.tar.bz2
xen-b0e1696ee059add2cd271b44adff48aa243826c5.zip
[XENPERF] Pretty-print hypercall stats.
From: Yoshihiko Yaegashi <y.yaegashi@jp.fujitsu.com> From: Ken Hironaka <kenny@logos.ic.i.u-tokyo.ac.jp> Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'tools/misc/xenperf.c')
-rw-r--r--tools/misc/xenperf.c128
1 files changed, 105 insertions, 23 deletions
diff --git a/tools/misc/xenperf.c b/tools/misc/xenperf.c
index 575b697257..d970204242 100644
--- a/tools/misc/xenperf.c
+++ b/tools/misc/xenperf.c
@@ -10,7 +10,6 @@
* Description:
*/
-
#include <xenctrl.h>
#include <stdio.h>
#include <stdlib.h>
@@ -18,6 +17,57 @@
#include <errno.h>
#include <string.h>
+#define X(name) [__HYPERVISOR_##name] = #name
+const char *hypercall_name_table[64] =
+{
+ X(set_trap_table),
+ X(mmu_update),
+ X(set_gdt),
+ X(stack_switch),
+ X(set_callbacks),
+ X(fpu_taskswitch),
+ X(sched_op_compat),
+ X(platform_op),
+ X(set_debugreg),
+ X(get_debugreg),
+ X(update_descriptor),
+ X(memory_op),
+ X(multicall),
+ X(update_va_mapping),
+ X(set_timer_op),
+ X(event_channel_op_compat),
+ X(xen_version),
+ X(console_io),
+ X(physdev_op_compat),
+ X(grant_table_op),
+ X(vm_assist),
+ X(update_va_mapping_otherdomain),
+ X(iret),
+ X(vcpu_op),
+ X(set_segment_base),
+ X(mmuext_op),
+ X(acm_op),
+ X(nmi_op),
+ X(sched_op),
+ X(callback_op),
+ X(xenoprof_op),
+ X(event_channel_op),
+ X(physdev_op),
+ X(hvm_op),
+ X(sysctl),
+ X(domctl),
+ X(kexec_op),
+ X(arch_0),
+ X(arch_1),
+ X(arch_2),
+ X(arch_3),
+ X(arch_4),
+ X(arch_5),
+ X(arch_6),
+ X(arch_7),
+};
+#undef X
+
int lock_pages(void *addr, size_t len)
{
int e = 0;
@@ -30,7 +80,7 @@ int lock_pages(void *addr, size_t len)
void unlock_pages(void *addr, size_t len)
{
#ifndef __sun__
- munlock(addr, len);
+ munlock(addr, len);
#endif
}
@@ -38,10 +88,11 @@ int main(int argc, char *argv[])
{
int i, j, xc_handle;
xc_perfc_desc_t *pcd;
- xc_perfc_val_t *pcv;
- xc_perfc_val_t *val;
- int num_desc, num_val;
- unsigned int sum, reset = 0, full = 0;
+ xc_perfc_val_t *pcv;
+ xc_perfc_val_t *val;
+ int num_desc, num_val;
+ unsigned int sum, reset = 0, full = 0, pretty = 0;
+ char hypercall_name[36];
if ( argc > 1 )
{
@@ -53,6 +104,10 @@ int main(int argc, char *argv[])
case 'f':
full = 1;
break;
+ case 'p':
+ full = 1;
+ pretty = 1;
+ break;
case 'r':
reset = 1;
break;
@@ -66,6 +121,7 @@ int main(int argc, char *argv[])
printf("%s: [-r]\n", argv[0]);
printf("no args: print digested counters\n");
printf(" -f : print full arrays/histograms\n");
+ printf(" -p : print full arrays/histograms in pretty format\n");
printf(" -r : reset counters\n");
return 0;
}
@@ -91,21 +147,21 @@ int main(int argc, char *argv[])
return 0;
}
- if ( xc_perfc_control(xc_handle, XEN_SYSCTL_PERFCOP_query,
- NULL, NULL, &num_desc, &num_val) != 0 )
- {
- fprintf(stderr, "Error getting number of perf counters: %d (%s)\n",
- errno, strerror(errno));
- return 1;
- }
+ if ( xc_perfc_control(xc_handle, XEN_SYSCTL_PERFCOP_query,
+ NULL, NULL, &num_desc, &num_val) != 0 )
+ {
+ fprintf(stderr, "Error getting number of perf counters: %d (%s)\n",
+ errno, strerror(errno));
+ return 1;
+ }
pcd = malloc(sizeof(*pcd) * num_desc);
- pcv = malloc(sizeof(*pcv) * num_val);
+ pcv = malloc(sizeof(*pcv) * num_val);
if ( pcd == NULL
- || lock_pages(pcd, sizeof(*pcd) * num_desc) != 0
- || pcv == NULL
- || lock_pages(pcd, sizeof(*pcv) * num_val) != 0)
+ || lock_pages(pcd, sizeof(*pcd) * num_desc) != 0
+ || pcv == NULL
+ || lock_pages(pcd, sizeof(*pcv) * num_val) != 0)
{
fprintf(stderr, "Could not alloc or lock buffers: %d (%s)\n",
errno, strerror(errno));
@@ -113,7 +169,7 @@ int main(int argc, char *argv[])
}
if ( xc_perfc_control(xc_handle, XEN_SYSCTL_PERFCOP_query,
- pcd, pcv, NULL, NULL) != 0 )
+ pcd, pcv, NULL, NULL) != 0 )
{
fprintf(stderr, "Error getting perf counter: %d (%s)\n",
errno, strerror(errno));
@@ -123,7 +179,7 @@ int main(int argc, char *argv[])
unlock_pages(pcd, sizeof(*pcd) * num_desc);
unlock_pages(pcv, sizeof(*pcv) * num_val);
- val = pcv;
+ val = pcv;
for ( i = 0; i < num_desc; i++ )
{
printf ("%-35s ", pcd[i].name);
@@ -134,11 +190,37 @@ int main(int argc, char *argv[])
printf ("T=%10u ", (unsigned int)sum);
if ( full || (pcd[i].nr_vals <= 4) )
- for ( j = 0; j < pcd[i].nr_vals; j++ )
- printf(" %10u", (unsigned int)val[j]);
+ {
+ if ( pretty && (strcmp(pcd[i].name, "hypercalls") == 0) )
+ {
+ printf("\n");
+ for( j = 0; j < pcd[i].nr_vals; j++ )
+ {
+ if ( val[j] == 0 )
+ continue;
+ if ( (j < 64) && hypercall_name_table[j] )
+ strncpy(hypercall_name, hypercall_name_table[j],
+ sizeof(hypercall_name));
+ else
+ sprintf(hypercall_name, "[%d]", j);
+ hypercall_name[sizeof(hypercall_name)-1]='\0';
+ printf("%-35s ", hypercall_name);
+ printf("%12u\n", (unsigned int)val[j]);
+ }
+ }
+ else
+ {
+ for ( j = 0; j < pcd[i].nr_vals; j++ )
+ printf(" %10u", (unsigned int)val[j]);
+ printf("\n");
+ }
+ }
+ else
+ {
+ printf("\n");
+ }
- printf("\n");
- val += pcd[i].nr_vals;
+ val += pcd[i].nr_vals;
}
return 0;