[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] add perfcounters for pagetable update histograms



ChangeSet 1.1230.4.1, 2005/02/22 18:44:00+00:00, 
rneugeba@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

        add perfcounters for pagetable update histograms
        
        Signed-off-by: michael.fetterman@xxxxxxxxxxxx



 arch/x86/mm.c            |   52 ++++++++++++++++++++++++++++++++++++++++++++++-
 common/perfc.c           |    8 +++++--
 include/xen/perfc_defn.h |   11 ++++++++-
 3 files changed, 66 insertions(+), 5 deletions(-)


diff -Nru a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c 2005-04-05 12:04:44 -04:00
+++ b/xen/arch/x86/mm.c 2005-04-05 12:04:44 -04:00
@@ -1686,8 +1686,30 @@
         }
     }
 
+#ifdef PERF_COUNTERS
     perfc_incrc(calls_to_mmu_update); 
     perfc_addc(num_page_updates, count);
+    /*
+     * do a histogram for count. 
+     * first bucket is for count=0,
+     * second bucket is for count=1
+     * last bucket is for count >= 63 *  PERFC_PT_UPDATES_BUCKET_SIZE
+     */
+    if ( count == 0 )
+    {
+        perfc_incra(bpt_updates, 0);
+    } else if ( count == 1 )
+    {
+        perfc_incra(bpt_updates, 1);
+    } else if ( (count / PERFC_PT_UPDATES_BUCKET_SIZE)
+                < (PERFC_MAX_PT_UPDATES - 3) )
+    {
+        perfc_incra(bpt_updates, (count / PERFC_PT_UPDATES_BUCKET_SIZE) + 2);
+    } else
+    {
+        perfc_incra(bpt_updates, PERFC_MAX_PT_UPDATES - 1);
+    }
+#endif
 
     if ( unlikely(!array_access_ok(VERIFY_READ, ureqs, count, sizeof(req))) )
     {
@@ -2232,6 +2254,7 @@
     int            i, cpu = smp_processor_id();
     struct exec_domain *ed = current;
     struct domain *d = ed->domain;
+    unsigned int   count;
 
     l1va = ptwr_info[cpu].ptinfo[which].l1va;
     ptep = (unsigned long *)&linear_pg_table[l1_linear_offset(l1va)];
@@ -2290,7 +2313,7 @@
     /*
      * STEP 2. Validate any modified PTEs.
      */
-
+    count = 0;
     pl1e = ptwr_info[cpu].ptinfo[which].pl1e;
     for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
     {
@@ -2300,6 +2323,9 @@
         if ( likely(l1_pgentry_val(ol1e) == l1_pgentry_val(nl1e)) )
             continue;
 
+        /* update number of entries modified */
+        count++;
+
         /*
          * Fast path for PTEs that have merely been write-protected
          * (e.g., during a Unix fork()). A strict reduction in privilege.
@@ -2340,6 +2366,30 @@
             put_page_from_l1e(ol1e, d);
     }
     unmap_domain_mem(pl1e);
+
+#ifdef PERF_COUNTERS
+    /*
+     * do a histogram for count. 
+     * first bucket is for count=0,
+     * second bucket is for count=1
+     * last bucket is for count >= 63 *  PERFC_PT_UPDATES_BUCKET_SIZE
+     */
+    if ( count == 0 )
+    {
+        perfc_incra(wpt_updates, 0);
+    } else if ( count == 1 ) 
+    {
+        perfc_incra(wpt_updates, 1);
+    } else if ( (count / PERFC_PT_UPDATES_BUCKET_SIZE)
+                < (PERFC_MAX_PT_UPDATES - 3) )
+    {
+        perfc_incra(wpt_updates, (count / PERFC_PT_UPDATES_BUCKET_SIZE) + 2);
+    } else
+    {
+        perfc_incra(wpt_updates, PERFC_MAX_PT_UPDATES - 1);
+    }
+#endif
+    
 
     /*
      * STEP 3. Reattach the L1 p.t. page into the current address space.
diff -Nru a/xen/common/perfc.c b/xen/common/perfc.c
--- a/xen/common/perfc.c        2005-04-05 12:04:44 -04:00
+++ b/xen/common/perfc.c        2005-04-05 12:04:44 -04:00
@@ -66,9 +66,13 @@
         case TYPE_S_ARRAY:
             for ( j = sum = 0; j < perfc_info[i].nr_elements; j++ )
                 sum += atomic_read(&counters[j]);
-            printk("TOTAL[%10d]  ", sum);
+            printk("TOTAL[%10d]\n ", sum);
             for ( j = 0; j < perfc_info[i].nr_elements; j++ )
-                printk("ARR%02d[%10d]  ", j, atomic_read(&counters[j]));
+            {
+                printk("A%02d[%10d]  ", j, atomic_read(&counters[j]));
+                if ( !(j % 4) )
+                    printk("\n ");
+            }
             counters += j;
             break;
         }
diff -Nru a/xen/include/xen/perfc_defn.h b/xen/include/xen/perfc_defn.h
--- a/xen/include/xen/perfc_defn.h      2005-04-05 12:04:44 -04:00
+++ b/xen/include/xen/perfc_defn.h      2005-04-05 12:04:44 -04:00
@@ -35,7 +35,14 @@
 PERFCOUNTER_CPU( check_pagetable, "calls to check_pagetable" )
 PERFCOUNTER_CPU( check_all_pagetables, "calls to check_all_pagetables" )
 
+/* XXX constant from dom0_ops.h */
+#define PERFC_MAX_PT_UPDATES 64
+#define PERFC_PT_UPDATES_BUCKET_SIZE 3
+PERFCOUNTER_ARRAY( wpt_updates, "writable pt updates", PERFC_MAX_PT_UPDATES )
+PERFCOUNTER_ARRAY( bpt_updates, "batched pt updates", PERFC_MAX_PT_UPDATES )
+
+
 #define VMX_PERF_EXIT_REASON_SIZE 37
 #define VMX_PERF_VECTOR_SIZE 0x20
-PERFCOUNTER_ARRAY(vmexits, "vmexits", VMX_PERF_EXIT_REASON_SIZE )
-PERFCOUNTER_ARRAY(cause_vector, "cause vector", VMX_PERF_VECTOR_SIZE )
+PERFCOUNTER_ARRAY( vmexits, "vmexits", VMX_PERF_EXIT_REASON_SIZE )
+PERFCOUNTER_ARRAY( cause_vector, "cause vector", VMX_PERF_VECTOR_SIZE )

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.