diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-07-30 13:06:06 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-07-30 13:06:06 +0000 |
commit | cb5492634444c23ac43bc8f5ef6e9af5320d9900 (patch) | |
tree | 33eb4046f54940d76b5e27ce6c2e6129ded3875f /xen/common/perfc.c | |
parent | c3a1999b281cf3acbe59c460dee0a237608a7e10 (diff) | |
download | xen-cb5492634444c23ac43bc8f5ef6e9af5320d9900.tar.gz xen-cb5492634444c23ac43bc8f5ef6e9af5320d9900.tar.bz2 xen-cb5492634444c23ac43bc8f5ef6e9af5320d9900.zip |
bitkeeper revision 1.378 (3f27c2beWNYX6OSWHkL7l2xJ5Qm9ng)
perfc_defn.h, perfc.h, lib.h, vsprintf.c, perfc.c:
Cleaned up Xen performance counter mechanism.
Diffstat (limited to 'xen/common/perfc.c')
-rw-r--r-- | xen/common/perfc.c | 137 |
1 files changed, 43 insertions, 94 deletions
diff --git a/xen/common/perfc.c b/xen/common/perfc.c index 704bef1d3b..412692f768 100644 --- a/xen/common/perfc.c +++ b/xen/common/perfc.c @@ -1,6 +1,3 @@ -/* - * xen performance counters - */ #include <xeno/lib.h> #include <xeno/smp.h> @@ -8,111 +5,63 @@ #include <xeno/perfc.h> #include <xeno/keyhandler.h> -/* 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[] = { +#undef PERFCOUNTER +#undef PERFCOUNTER_CPU +#undef PERFCOUNTER_ARRAY +#define PERFCOUNTER( var, name ) { name, TYPE_SINGLE, 0 }, +#define PERFCOUNTER_CPU( var, name ) { name, TYPE_CPU, 0 }, +#define PERFCOUNTER_ARRAY( var, name, size ) { name, TYPE_ARRAY, size }, +static struct { + char *name; + enum { TYPE_SINGLE, TYPE_CPU, TYPE_ARRAY } type; + int nr_elements; +} perfc_info[] = { #include <xeno/perfc_defn.h> }; -struct perfcounter_t perfcounters; +#define NR_PERFCTRS (sizeof(perfc_info) / sizeof(perfc_info[0])) -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++) { - 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 (loop == sizeof(perfc_name) / sizeof(char *)) { - printf ("error: couldn't find variable\n"); - return; - } - if (element_size == 0) { /* single counter */ - printf ("%10lu 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 ("%10lu 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 ("%10lu 0x%08lx %s:%d\n", - counter[loop], counter[loop], - perfc_name[loop] + 2 + num, loop); - } - } - return; -} +struct perfcounter_t perfcounters; -void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs) +void perfc_printall(u_char key, void *dev_id, struct pt_regs *regs) { - int loop, idx; - int element_size; - int cpus=0; - int num = 0; + int i, j; 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++) { - - 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 (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++; + printk("Xen performance counters SHOW (now = 0x%08X:%08X)\n", + (u32)(now>>32), (u32)now); + + for ( i = 0; i < NR_PERFCTRS; i++ ) + { + switch ( perfc_info[i].type ) + { + case TYPE_SINGLE: + printk("%10ld 0x%08lx %s\n", + counters[0], counters[0], perfc_info[i].name); + counters += 1; + break; + case TYPE_CPU: + for ( j = 0; j < smp_num_cpus; j++ ) + printk("%10ld 0x%08lx %s[CPU %02d]\n", + counters[j], counters[j], perfc_info[i].name, j); + counters += j; + break; + case TYPE_ARRAY: + for ( j = 0; j < perfc_info[i].nr_elements; j++ ) + printk("%10ld 0x%08lx %s[ARR %02d]\n", + counters[j], counters[j], perfc_info[i].name, j); + counters += j; + break; } } - - //perfc_reset( key, dev_id, regs ); - - return; } -void perfc_reset (u_char key, void *dev_id, struct pt_regs *regs) +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)); + printk("Xen performance counters RESET (now = 0x%08X:%08X)\n", + (u32)(now>>32), (u32)now); + memset(&perfcounters, 0, sizeof(perfcounters)); } |