diff options
author | iap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk> | 2004-03-21 19:14:29 +0000 |
---|---|---|
committer | iap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk> | 2004-03-21 19:14:29 +0000 |
commit | 5186f83702fe010757ceda79b59483d9b4d0b4f3 (patch) | |
tree | d1f942ec22b7fa7eb2b3e0001790a15c417a44f6 /xen/common/perfc.c | |
parent | aac3baa51f44d5a0d757540ac8012b3109cea813 (diff) | |
download | xen-5186f83702fe010757ceda79b59483d9b4d0b4f3.tar.gz xen-5186f83702fe010757ceda79b59483d9b4d0b4f3.tar.bz2 xen-5186f83702fe010757ceda79b59483d9b4d0b4f3.zip |
bitkeeper revision 1.794.1.3 (405de995_4scoWE5EfQzN5TSoyS8Gw)
fixes plus new performance counters
Diffstat (limited to 'xen/common/perfc.c')
-rw-r--r-- | xen/common/perfc.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/xen/common/perfc.c b/xen/common/perfc.c index 00d0505503..af9abbb67c 100644 --- a/xen/common/perfc.c +++ b/xen/common/perfc.c @@ -8,12 +8,20 @@ #undef PERFCOUNTER #undef PERFCOUNTER_CPU #undef PERFCOUNTER_ARRAY +#undef PERFSTATUS +#undef PERFSTATUS_CPU +#undef PERFSTATUS_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 }, +#define PERFSTATUS( var, name ) { name, TYPE_S_SINGLE, 0 }, +#define PERFSTATUS_CPU( var, name ) { name, TYPE_S_CPU, 0 }, +#define PERFSTATUS_ARRAY( var, name, size ) { name, TYPE_S_ARRAY, size }, static struct { char *name; - enum { TYPE_SINGLE, TYPE_CPU, TYPE_ARRAY } type; + enum { TYPE_SINGLE, TYPE_CPU, TYPE_ARRAY, + TYPE_S_SINGLE, TYPE_S_CPU, TYPE_S_ARRAY + } type; int nr_elements; } perfc_info[] = { #include <xeno/perfc_defn.h> @@ -38,10 +46,12 @@ void perfc_printall(u_char key, void *dev_id, struct pt_regs *regs) switch ( perfc_info[i].type ) { case TYPE_SINGLE: + case TYPE_S_SINGLE: printk("TOTAL[%10d]", atomic_read(&counters[0])); counters += 1; break; case TYPE_CPU: + case TYPE_S_CPU: for ( j = sum = 0; j < smp_num_cpus; j++ ) sum += atomic_read(&counters[j]); printk("TOTAL[%10d] ", sum); @@ -50,6 +60,7 @@ void perfc_printall(u_char key, void *dev_id, struct pt_regs *regs) counters += NR_CPUS; break; case TYPE_ARRAY: + case TYPE_S_ARRAY: for ( j = sum = 0; j < perfc_info[i].nr_elements; j++ ) sum += atomic_read(&counters[j]); printk("TOTAL[%10d] ", sum); @@ -64,9 +75,37 @@ void perfc_printall(u_char key, void *dev_id, struct pt_regs *regs) void perfc_reset(u_char key, void *dev_id, struct pt_regs *regs) { + int i, j, sum; s_time_t now = NOW(); + atomic_t *counters = (atomic_t *)&perfcounters; + printk("Xen performance counters RESET (now = 0x%08X:%08X)\n", (u32)(now>>32), (u32)now); - memset(&perfcounters, 0, sizeof(perfcounters)); + + // leave STATUS counters alone -- don't reset + + for ( i = 0; i < NR_PERFCTRS; i++ ) + { + switch ( perfc_info[i].type ) + { + case TYPE_SINGLE: + atomic_set(&counters[0],0); + case TYPE_S_SINGLE: + counters += 1; + break; + case TYPE_CPU: + for ( j = sum = 0; j < smp_num_cpus; j++ ) + atomic_set(&counters[j],0); + case TYPE_S_CPU: + counters += NR_CPUS; + break; + case TYPE_ARRAY: + for ( j = sum = 0; j < perfc_info[i].nr_elements; j++ ) + atomic_set(&counters[j],0); + case TYPE_S_ARRAY: + counters += j; + break; + } + } } |