xentrace: Skip to low cpu when throwing away portions of the circular buffer
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 13 Apr 2010 17:18:36 +0000 (18:18 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 13 Apr 2010 17:18:36 +0000 (18:18 +0100)
Skip to the next "low" cpu when throwing away portions of the circular
memory buffer.  This makes subsequent analysis easier.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
tools/xentrace/xentrace.c

index 18283f3e9794f74fd937f9689c07f42a50841848..cce5469c47a8f81d67dfcab63f0e36bb1a553517 100644 (file)
@@ -149,6 +149,7 @@ void membuf_reserve_window(unsigned cpu, unsigned long window_size)
 {
     struct cpu_change_record *rec;
     long need_to_consume, free, freed;
+    int last_cpu = -1;
 
     if ( membuf.pending_size > 0 )
     {
@@ -193,11 +194,25 @@ void membuf_reserve_window(unsigned cpu, unsigned long window_size)
 
         if ( need_to_consume > 0 )
         {
+            last_cpu = rec->data.cpu;
             MEMBUF_CONS_INCREMENT(freed);
             need_to_consume -= freed;
         }
     } while( need_to_consume > 0 );
 
+    /* For good tsc consistency, we need to start at a low-cpu buffer.  Keep
+     * skipping until the cpu goes down or stays the same. */
+    rec = (struct cpu_change_record *)MEMBUF_POINTER(membuf.cons);
+    while ( rec->data.cpu > last_cpu )
+    {
+        last_cpu = rec->data.cpu; 
+
+        freed = sizeof(*rec) + rec->data.window_size;
+        
+        MEMBUF_CONS_INCREMENT(freed);
+        rec = (struct cpu_change_record *)MEMBUF_POINTER(membuf.cons);
+    }
+
 start_window:
     /*
      * Start writing "pending" data.  Update prod once all this data is