aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/perfc.c
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-07-30 13:06:06 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-07-30 13:06:06 +0000
commitcb5492634444c23ac43bc8f5ef6e9af5320d9900 (patch)
tree33eb4046f54940d76b5e27ce6c2e6129ded3875f /xen/common/perfc.c
parentc3a1999b281cf3acbe59c460dee0a237608a7e10 (diff)
downloadxen-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.c137
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));
}