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-21 19:14:29 +0000
committeriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>2004-03-21 19:14:29 +0000
commit5186f83702fe010757ceda79b59483d9b4d0b4f3 (patch)
treed1f942ec22b7fa7eb2b3e0001790a15c417a44f6 /xen/common/perfc.c
parentaac3baa51f44d5a0d757540ac8012b3109cea813 (diff)
downloadxen-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.c43
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;
+ }
+ }
}