]> xenbits.xensource.com Git - xen.git/commitdiff
xenbaked: Fix access to trace buffer after xentrace changes
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 24 Apr 2008 08:59:57 +0000 (09:59 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 24 Apr 2008 08:59:57 +0000 (09:59 +0100)
Signed-off-by: Naoki Nishiguchi <nisiguti@jp.fujitsu.com>
tools/xenmon/xenbaked.c

index 32ca9f36c343a6358d25877585666f7ef0016c1d..35ba8e40e987eeb1c8a1fcfb879f3239c09ea6c6 100644 (file)
@@ -509,14 +509,36 @@ int monitor_tbufs(void)
     {
         for ( i = 0; (i < num) && !interrupted; i++ )
         {
-            while ( meta[i]->cons != meta[i]->prod )
+            unsigned long start_offset, end_offset, cons, prod;
+
+            cons = meta[i]->cons;
+            prod = meta[i]->prod;
+            xen_rmb(); /* read prod, then read item. */
+
+            if ( cons == prod )
+                continue;
+
+            start_offset = cons % data_size;
+            end_offset = prod % data_size;
+
+            if ( start_offset >= end_offset )
+            {
+                while ( start_offset != data_size )
+                {
+                    rec_size = process_record(
+                        i, (struct t_rec *)(data[i] + start_offset));
+                    start_offset += rec_size;
+                }
+                start_offset = 0;
+            }
+            while ( start_offset != end_offset )
             {
-                xen_rmb(); /* read prod, then read item. */
                 rec_size = process_record(
-                    i, (struct t_rec *)(data[i] + meta[i]->cons % data_size));
-                xen_mb(); /* read item, then update cons. */
-                meta[i]->cons += rec_size;
+                    i, (struct t_rec *)(data[i] + start_offset));
+                start_offset += rec_size;
             }
+            xen_mb(); /* read item, then update cons. */
+            meta[i]->cons = prod;
         }
 
        wait_for_event();