diff options
author | iap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk> | 2004-03-25 12:37:30 +0000 |
---|---|---|
committer | iap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk> | 2004-03-25 12:37:30 +0000 |
commit | 3edb6b4a07f3b5e8628accd97e20ace4cf8ceb4a (patch) | |
tree | 99339d353e2acc57c74ee7c33d7cc35c65efe4f9 /xen/common/perfc.c | |
parent | 163ce6261c54cbfe6fec6f011497a3d14d30b5e4 (diff) | |
parent | 1cfe846da9267b5ee87813bb9e44d2a0a8ebaa12 (diff) | |
download | xen-3edb6b4a07f3b5e8628accd97e20ace4cf8ceb4a.tar.gz xen-3edb6b4a07f3b5e8628accd97e20ace4cf8ceb4a.tar.bz2 xen-3edb6b4a07f3b5e8628accd97e20ace4cf8ceb4a.zip |
bitkeeper revision 1.825.2.1 (4062d28avHqOBupTrfJcONXWeibf9A)
grand unification of shadow table stuff
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 20b0e5c116..631e81787c 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 <xen/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 += perfc_info[i].nr_elements; + break; + } + } } |