aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/perfc.c
diff options
context:
space:
mode:
authoriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>2004-03-25 12:37:30 +0000
committeriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>2004-03-25 12:37:30 +0000
commit3edb6b4a07f3b5e8628accd97e20ace4cf8ceb4a (patch)
tree99339d353e2acc57c74ee7c33d7cc35c65efe4f9 /xen/common/perfc.c
parent163ce6261c54cbfe6fec6f011497a3d14d30b5e4 (diff)
parent1cfe846da9267b5ee87813bb9e44d2a0a8ebaa12 (diff)
downloadxen-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.c43
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;
+ }
+ }
}