powerpc/pseries: Add dispatch dispersion statistics
authorAnton Blanchard <anton@samba.org>
Tue, 31 Mar 2009 20:12:44 +0000 (20:12 +0000)
committerPaul Mackerras <paulus@samba.org>
Tue, 7 Apr 2009 05:18:59 +0000 (15:18 +1000)
PHYP tells us how often a shared processor dispatch changed physical cpus.
This can highlight performance problems caused by the hypervisor.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/include/asm/lppaca.h
arch/powerpc/kernel/lparcfg.c

index 68235f7..d2a65e8 100644 (file)
@@ -125,7 +125,7 @@ struct lppaca {
        // NOTE: This value will ALWAYS be zero for dedicated processors and
        // will NEVER be zero for shared processors (ie, initialized to a 1).
        volatile u32 yield_count;       // PLIC increments each dispatchx00-x03
-       u32 reserved6;
+       volatile u32 dispersion_count;  // dispatch changed phys cpu    x04-x07
        volatile u64 cmo_faults;        // CMO page fault count         x08-x0F
        volatile u64 cmo_fault_time;    // CMO page fault time          x10-x17
        u8      reserved7[104];         // Reserved                     x18-x7F
index 182e0f6..78b3f78 100644 (file)
@@ -434,6 +434,21 @@ static void pseries_cmo_data(struct seq_file *m)
        seq_printf(m, "cmo_page_size=%lu\n", cmo_get_page_size());
 }
 
+static void splpar_dispatch_data(struct seq_file *m)
+{
+       int cpu;
+       unsigned long dispatches = 0;
+       unsigned long dispatch_dispersions = 0;
+
+       for_each_possible_cpu(cpu) {
+               dispatches += lppaca[cpu].yield_count;
+               dispatch_dispersions += lppaca[cpu].dispersion_count;
+       }
+
+       seq_printf(m, "dispatches=%lu\n", dispatches);
+       seq_printf(m, "dispatch_dispersions=%lu\n", dispatch_dispersions);
+}
+
 static int pseries_lparcfg_data(struct seq_file *m, void *v)
 {
        int partition_potential_processors;
@@ -460,6 +475,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
                parse_ppp_data(m);
                parse_mpp_data(m);
                pseries_cmo_data(m);
+               splpar_dispatch_data(m);
 
                seq_printf(m, "purr=%ld\n", get_purr());
        } else {                /* non SPLPAR case */