diff options
author | rn@wyvis.research.intel-research.net <rn@wyvis.research.intel-research.net> | 2003-03-13 15:26:25 +0000 |
---|---|---|
committer | rn@wyvis.research.intel-research.net <rn@wyvis.research.intel-research.net> | 2003-03-13 15:26:25 +0000 |
commit | 0730cd5690317da758f5171bb6e3e556ac938c66 (patch) | |
tree | 114737f9f7f816dfbeae340e149ef6c8dec26740 /xen/common/perfc.c | |
parent | 064b5bb75988a5fdcc18d4f86d0b0d5656f9c006 (diff) | |
download | xen-0730cd5690317da758f5171bb6e3e556ac938c66.tar.gz xen-0730cd5690317da758f5171bb6e3e556ac938c66.tar.bz2 xen-0730cd5690317da758f5171bb6e3e556ac938c66.zip |
bitkeeper revision 1.122.3.1 (3e70a321BvGVezZroK7FFHJEDihQag)
more perfcounters
Diffstat (limited to 'xen/common/perfc.c')
-rw-r--r-- | xen/common/perfc.c | 127 |
1 files changed, 80 insertions, 47 deletions
diff --git a/xen/common/perfc.c b/xen/common/perfc.c index 6b7e9f2af3..cc277a914a 100644 --- a/xen/common/perfc.c +++ b/xen/common/perfc.c @@ -2,12 +2,19 @@ * xen performance counters */ +#include <xeno/lib.h> +#include <xeno/smp.h> +#include <xeno/time.h> #include <xeno/perfc.h> #include <xeno/keyhandler.h> -#undef PERFCOUNTER -#undef PERFCOUNTER_ARRAY +/* used for different purposes in perfc.h and here */ +#undef PERFCOUNTER +#undef PERFCOUNTER_CPU +#undef PERFCOUNTER_ARRAY + #define PERFCOUNTER( var, name ) "[0]"name"\0", +#define PERFCOUNTER_CPU( var, name ) "C"name"\0", #define PERFCOUNTER_ARRAY( var, name, size ) "["#size"]"name"\0", char* perfc_name[] = { @@ -21,63 +28,89 @@ void __perfc_print (unsigned long counter[], int offset) int loop; int total_size = 0; int element_size = 0; + int cpus = 0; int num = 0; - for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) - { - num = sscanf (perfc_name[loop], "[%d]", &element_size); - total_size += element_size == 0 ? 1 : element_size; - if (total_size > offset) break; - } - if (loop == sizeof(perfc_name) / sizeof(char *)) - { - printf ("error: couldn't find variable\n"); - return; + for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) { + if (perfc_name[loop][0] == 'C') { + element_size = NR_CPUS; + cpus = 1; + } else { + num = sscanf (perfc_name[loop], "[%d]", &element_size); + } + + total_size += element_size == 0 ? 1 : element_size; + if (total_size > offset) break; } - if (element_size == 0) /* single counter */ - { - printf ("%10ld 0x%08lx %s\n", counter[0], counter[0], - perfc_name[loop] + 2 + num); + if (loop == sizeof(perfc_name) / sizeof(char *)) { + printf ("error: couldn't find variable\n"); + return; } - else /* show entire array */ - { - for (loop = 0; loop < element_size; loop++) - { - printf ("%10ld 0x%08lx %s:%d\n", - counter[loop], counter[loop], - perfc_name[loop] + 2 + num, loop); - } + if (element_size == 0) { /* single counter */ + printf ("%10ld 0x%08lx %s\n", counter[0], counter[0], + perfc_name[loop] + 2 + num); + } else if (cpus) { /* counter per CPU */ + for (loop = 0; loop < smp_num_cpus; loop++) { + printf ("%10ld 0x%08lx cpu[%02d] %s\n", + counter[loop], counter[loop], + loop, perfc_name[loop]); + } + + } else { /* show entire array */ + for (loop = 0; loop < element_size; loop++) { + printf ("%10ld 0x%08lx %s:%d\n", + counter[loop], counter[loop], + perfc_name[loop] + 2 + num, loop); + } } return; } void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs) { - int loop, idx; - int element_size; - int num; - unsigned long *counters = (unsigned long *)&perfcounters; + int loop, idx; + int element_size; + int cpus=0; + int num = 0; + s_time_t now = NOW(); + unsigned long *counters = (unsigned long *)&perfcounters; + + printf ("xen performance counters: now=0x%08X%08X\n", + (u32)(now>>32), (u32)now); + + for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) { - printf ("xen performance counters\n"); - for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) - { - num = sscanf (perfc_name[loop], "[%d]", &element_size); + if (perfc_name[loop][0] == 'C') { + element_size = NR_CPUS; + cpus = 1; + } else { + num = sscanf (perfc_name[loop], "[%d]", &element_size); + } - for (idx = 0; idx < (element_size ? element_size : 1); idx++) - { - if (element_size) - { - printf ("%10ld 0x%08lx %s:%d\n", - *counters, *counters, perfc_name[loop] + num + 2, idx); - } - else - { - printf ("%10ld 0x%08lx %s\n", - *counters, *counters, perfc_name[loop] + num + 2); - } - counters++; + for (idx = 0; idx < (element_size ? element_size : 1); idx++) { + if (cpus) { + if (idx < smp_num_cpus) + printf ("%10ld 0x%08lx cpu[%02d] %s\n", + *counters, *counters, idx, perfc_name[loop] + 1); + } else if (element_size) { + printf ("%10ld 0x%08lx %s:%d\n", + *counters, *counters, perfc_name[loop] + num + 2, idx); + } else { + printf ("%10ld 0x%08lx %s\n", + *counters, *counters, perfc_name[loop] + num + 2); + } + counters++; + } } - } - return; + return; } + +void perfc_reset (u_char key, void *dev_id, struct pt_regs *regs) +{ + s_time_t now = NOW(); + printk ("xen performance counters reset: now=0x%08X%08X\n", + (u32)(now>>32), (u32)now); + memset (&perfcounters, 0, sizeof(perfcounters)); +} + |