aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/perfc.c
diff options
context:
space:
mode:
authorrn@wyvis.research.intel-research.net <rn@wyvis.research.intel-research.net>2003-03-13 15:26:25 +0000
committerrn@wyvis.research.intel-research.net <rn@wyvis.research.intel-research.net>2003-03-13 15:26:25 +0000
commit0730cd5690317da758f5171bb6e3e556ac938c66 (patch)
tree114737f9f7f816dfbeae340e149ef6c8dec26740 /xen/common/perfc.c
parent064b5bb75988a5fdcc18d4f86d0b0d5656f9c006 (diff)
downloadxen-0730cd5690317da758f5171bb6e3e556ac938c66.tar.gz
xen-0730cd5690317da758f5171bb6e3e556ac938c66.tar.bz2
xen-0730cd5690317da758f5171bb6e3e556ac938c66.zip
bitkeeper revision 1.122.3.1 (3e70a321BvGVezZroK7FFHJEDihQag)
more perfcounters
Diffstat (limited to 'xen/common/perfc.c')
-rw-r--r--xen/common/perfc.c127
1 files changed, 80 insertions, 47 deletions
diff --git a/xen/common/perfc.c b/xen/common/perfc.c
index 6b7e9f2af3..cc277a914a 100644
--- a/xen/common/perfc.c
+++ b/xen/common/perfc.c
@@ -2,12 +2,19 @@
* xen performance counters
*/
+#include <xeno/lib.h>
+#include <xeno/smp.h>
+#include <xeno/time.h>
#include <xeno/perfc.h>
#include <xeno/keyhandler.h>
-#undef PERFCOUNTER
-#undef PERFCOUNTER_ARRAY
+/* 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[] = {
@@ -21,63 +28,89 @@ 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++)
- {
- 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;
+ 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 (element_size == 0) /* single counter */
- {
- printf ("%10ld 0x%08lx %s\n", counter[0], counter[0],
- perfc_name[loop] + 2 + num);
+ if (loop == sizeof(perfc_name) / sizeof(char *)) {
+ printf ("error: couldn't find variable\n");
+ return;
}
- else /* show entire array */
- {
- for (loop = 0; loop < element_size; loop++)
- {
- printf ("%10ld 0x%08lx %s:%d\n",
- counter[loop], counter[loop],
- perfc_name[loop] + 2 + num, loop);
- }
+ if (element_size == 0) { /* single counter */
+ printf ("%10ld 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 ("%10ld 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 ("%10ld 0x%08lx %s:%d\n",
+ counter[loop], counter[loop],
+ perfc_name[loop] + 2 + num, loop);
+ }
}
return;
}
void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs)
{
- int loop, idx;
- int element_size;
- int num;
- unsigned long *counters = (unsigned long *)&perfcounters;
+ int loop, idx;
+ int element_size;
+ int cpus=0;
+ int num = 0;
+ 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++) {
- printf ("xen performance counters\n");
- for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++)
- {
- num = sscanf (perfc_name[loop], "[%d]", &element_size);
+ 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 (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++;
+ 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++;
+ }
}
- }
- return;
+ return;
}
+
+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));
+}
+