[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xenperf hypercall pretty print
Hi, This patch implements a pretty print feature to the hypercall counters. I added an option -p so it would be easier to see how many times each hypercall was called. The function of option -f is left untouched. The result is as the attachment. Reference: http://lists.xensource.com/archives/html/xen-devel/2006-08/msg01324.html Signed-off-by: Yoshihiko Yaegashi <y.yaegashi@xxxxxxxxxxxxxx> Signed-off-by: Ken Hironaka <kenny@xxxxxxxxxxxxxxxxxxxxxxxx> Thanks, Yaegashi diff -r b21246720fde -r 986fd62fbfda tools/misc/xenperf.c --- a/tools/misc/xenperf.c Mon Oct 30 17:35:11 2006 +0000 +++ b/tools/misc/xenperf.c Wed Nov 01 14:47:25 2006 +0900 @@ -10,7 +10,6 @@ * Description: */ - #include <xenctrl.h> #include <stdio.h> #include <stdlib.h> @@ -18,6 +17,75 @@ #include <errno.h> #include <string.h> +const char* hypercall_name_table[64]= +{ + [__HYPERVISOR_set_trap_table] = "set_trap_table", /*0*/ + [__HYPERVISOR_mmu_update] = "mmu_update", /*1*/ + [__HYPERVISOR_set_gdt] = "set_gdt", /*2*/ + [__HYPERVISOR_stack_switch] = "stack_switch", /*3*/ + [__HYPERVISOR_set_callbacks] = "set_callbacks", /*4*/ + [__HYPERVISOR_fpu_taskswitch] = "fpu_taskswitch", /*5*/ + [__HYPERVISOR_sched_op_compat] = "sched_op_compat", /*6*/ + [__HYPERVISOR_platform_op] = "platform_op", /*7*/ + [__HYPERVISOR_set_debugreg] = "set_debugreg", /*8*/ + [__HYPERVISOR_get_debugreg] = "get_debugreg", /*9*/ + [__HYPERVISOR_update_descriptor] = "update_descriptor", /*10*/ + [11] = "NULL", /*11*/ + [__HYPERVISOR_memory_op] = "memory_op", /*12*/ + [__HYPERVISOR_multicall] = "multicall", /*13*/ + [__HYPERVISOR_update_va_mapping] = "update_va_mapping", /*14*/ + [__HYPERVISOR_set_timer_op] = "set_timer_op", /*15*/ + [__HYPERVISOR_event_channel_op_compat] = "event_channel_op_compat", /*16 compat since 0x00030202 */ + [__HYPERVISOR_xen_version] = "xen_version", /*17*/ + [__HYPERVISOR_console_io] = "console_io", /*18*/ + [__HYPERVISOR_physdev_op_compat] = "physdev_op_compat", /*19 compat since 0x00030202 */ + [__HYPERVISOR_grant_table_op] = "grant_table_op", /*20*/ + [__HYPERVISOR_vm_assist] = "vm_assist", /*21*/ + [__HYPERVISOR_update_va_mapping_otherdomain] = "update_va_mapping_otherdomain", /*22*/ + [__HYPERVISOR_iret] = "iret", /*23 x86 only */ + [__HYPERVISOR_vcpu_op] = "vcpu_op", /*24*/ + [__HYPERVISOR_set_segment_base] = "set_segment_base", /*25 x86/64 only */ + [__HYPERVISOR_mmuext_op] = "mmuext_op", /*26*/ + [__HYPERVISOR_acm_op] = "acm_op", /*27*/ + [__HYPERVISOR_nmi_op] = "nmi_op", /*28*/ + [__HYPERVISOR_sched_op] = "sched_op", /*29*/ + [__HYPERVISOR_callback_op] = "callback_op", /*30*/ + [__HYPERVISOR_xenoprof_op] = "xenoprof_op", /*31*/ + [__HYPERVISOR_event_channel_op] = "event_channel_op", /*32*/ + [__HYPERVISOR_physdev_op] = "physdev_op", /*33*/ + [__HYPERVISOR_hvm_op] = "hvm_op", /*34*/ + [35] = "NULL", /*35*/ + [36] = "NULL", /*36*/ + [37] = "NULL", /*37*/ + [38] = "NULL", /*38*/ + [39] = "NULL", /*39*/ + [40] = "NULL", /*40*/ + [41] = "NULL", /*41*/ + [42] = "NULL", /*42*/ + [43] = "NULL", /*43*/ + [44] = "NULL", /*44*/ + [45] = "NULL", /*45*/ + [46] = "NULL", /*46*/ + [47] = "NULL", /*47*/ +/* Architecture-specific hypercall definitions. */ + [__HYPERVISOR_arch_0] = "arch_0", /*48*/ + [__HYPERVISOR_arch_1] = "arch_1", /*49*/ + [__HYPERVISOR_arch_2] = "arch_2", /*50*/ + [__HYPERVISOR_arch_3] = "arch_3", /*51*/ + [__HYPERVISOR_arch_4] = "arch_4", /*52*/ + [__HYPERVISOR_arch_5] = "arch_5", /*53*/ + [__HYPERVISOR_arch_6] = "arch_6", /*54*/ + [__HYPERVISOR_arch_7] = "arch_7", /*55*/ + [56] = "NULL", /*56*/ + [57] = "NULL", /*57*/ + [58] = "NULL", /*58*/ + [59] = "NULL", /*59*/ + [60] = "NULL", /*60*/ + [61] = "NULL", /*61*/ + [62] = "NULL", /*62*/ + [63] = "NULL" /*63*/ +}; + int lock_pages(void *addr, size_t len) { int e = 0; @@ -41,7 +109,8 @@ int main(int argc, char *argv[]) xc_perfc_val_t *pcv; xc_perfc_val_t *val; int num_desc, num_val; - unsigned int sum, reset = 0, full = 0; + unsigned int sum, reset = 0, full = 0, pretty = 0; + char hypercall_name[36]; if ( argc > 1 ) { @@ -52,6 +121,10 @@ int main(int argc, char *argv[]) { case 'f': full = 1; + break; + case 'p': + full = 1; + pretty = 1; break; case 'r': reset = 1; @@ -66,6 +139,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; } @@ -134,11 +208,31 @@ 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]); - - printf("\n"); - val += pcd[i].nr_vals; + { + if ( pretty && (strcmp(pcd[i].name, "hypercalls") == 0) ) + { + printf("\n"); + for( j = 0; j < pcd[i].nr_vals; j++ ) + { + strncpy(hypercall_name, hypercall_name_table[j], 35); + hypercall_name[35]='\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"); + } + + val += pcd[i].nr_vals; } return 0; exceptions T= 3979 0 0 0 0 0 0 0 47 0 0 0 0 0 3450 482 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 vmexits T= 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 cause vector T= 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SVMexits T= 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 segmentation fixups T= 3282 1916 144 908 314 apic timer interrupts T= 3517 863 921 875 858 domain page tlb flushes T= 0 0 0 0 0 calls_to_mmu_update T= 17 0 4 4 9 num_page_updates T= 17 0 4 4 9 calls_to_update_va_map T= 548 6 188 188 166 page faults T= 482 4 105 137 236 copy_user faults T= 2 0 0 0 2 map_domain_page count T= 965 431 126 163 245 writable pt emulations T= 177 2 6 31 138 pre-exception fixed T= 0 0 0 0 0 calls to shadow_alloc T= 0 0 0 0 0 shadow_alloc flushed TLBs T= 0 0 0 0 0 number of shadow pages in use T= 0 0 calls to shadow_free T= 0 0 0 0 0 shadow recycles old shadows T= 0 0 0 0 0 shadow recycles in-use shadows T= 0 0 0 0 0 shadow hit read-only linear map T= 0 0 0 0 0 shadow A bit update T= 0 0 0 0 0 shadow A&D bit update T= 0 0 0 0 0 calls to shadow_fault T= 0 0 0 0 0 shadow_fault guest bad gfn T= 0 0 0 0 0 shadow_fault guest not-present T= 0 0 0 0 0 shadow_fault guest NX fault T= 0 0 0 0 0 shadow_fault guest R/W fault T= 0 0 0 0 0 shadow_fault guest U/S fault T= 0 0 0 0 0 shadow_fault emulates a read T= 0 0 0 0 0 shadow_fault emulates a write T= 0 0 0 0 0 shadow_fault emulator fails T= 0 0 0 0 0 shadow_fault handled as mmio T= 0 0 0 0 0 shadow_fault fixed fault T= 0 0 0 0 0 shadow causes ptwr to emulate T= 0 0 0 0 0 calls to shadow_validate_gl1e T= 0 0 0 0 0 calls to shadow_validate_gl2e T= 0 0 0 0 0 calls to shadow_validate_gl3e T= 0 0 0 0 0 calls to shadow_validate_gl4e T= 0 0 0 0 0 calls to shadow_hash_lookup T= 0 0 0 0 0 shadow hash hit in bucket head T= 0 0 0 0 0 shadow hash misses T= 0 0 0 0 0 calls to get_shadow_status T= 0 0 0 0 0 calls to shadow_hash_insert T= 0 0 0 0 0 calls to shadow_hash_delete T= 0 0 0 0 0 shadow removes write access T= 0 0 0 0 0 shadow writeable: 32b w2k3 T= 0 0 0 0 0 shadow writeable: 32pae w2k3 T= 0 0 0 0 0 shadow writeable: 64b w2k3 T= 0 0 0 0 0 shadow writeable: 32b linux low T= 0 0 0 0 0 shadow writeable: 32b linux high T= 0 0 0 0 0 shadow writeable brute-force T= 0 0 0 0 0 shadow removes all mappings T= 0 0 0 0 0 shadow rm-mappings brute-force T= 0 0 0 0 0 shadow unshadows for fork/exit T= 0 0 0 0 0 shadow unshadows a page T= 0 0 0 0 0 shadow unshadow by up-pointer T= 0 0 0 0 0 shadow unshadow brute-force T= 0 0 0 0 0 shadow_get_page_from_l1e failed T= 0 0 0 0 0 shadow walks guest tables T= 0 0 0 0 0 shadow emulates invlpg T= 0 0 0 0 0 shadow invlpg faults T= 0 0 0 0 0 hypercalls T= 3295 set_trap_table 0 mmu_update 17 set_gdt 0 stack_switch 0 set_callbacks 0 fpu_taskswitch 0 sched_op_compat 0 platform_op 0 set_debugreg 0 get_debugreg 0 update_descriptor 3 NULL 0 memory_op 0 multicall 845 update_va_mapping 548 set_timer_op 696 event_channel_op_compat 0 xen_version 0 console_io 0 physdev_op_compat 0 grant_table_op 0 vm_assist 0 update_va_mapping_otherdomain 0 iret 0 vcpu_op 0 set_segment_base 0 mmuext_op 305 acm_op 0 nmi_op 0 sched_op 696 callback_op 0 xenoprof_op 0 event_channel_op 84 physdev_op 99 hvm_op 0 NULL 2 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 arch_0 0 arch_1 0 arch_2 0 arch_3 0 arch_4 0 arch_5 0 arch_6 0 arch_7 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 0 #interrupts T= 942 942 0 0 0 #IPIs T= 107 61 2 25 19 sched: timer T= 870 137 248 233 252 sched: runs through scheduler T= 2192 947 392 462 391 sched: context switches T= 1388 840 164 237 147 PG_need_flush tlb flushes T= 8 0 1 1 6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |