aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenmon
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-04-24 09:59:57 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-04-24 09:59:57 +0100
commitf3814331c731f6dc453d14c6373bfae109215606 (patch)
tree96f0b3430597f1dec63155bf958fd2a2f6ab0191 /tools/xenmon
parent628bdecb85a3a7d591e39402bd61a6d67cd205fb (diff)
downloadxen-f3814331c731f6dc453d14c6373bfae109215606.tar.gz
xen-f3814331c731f6dc453d14c6373bfae109215606.tar.bz2
xen-f3814331c731f6dc453d14c6373bfae109215606.zip
xenbaked: Fix access to trace buffer after xentrace changes
Signed-off-by: Naoki Nishiguchi <nisiguti@jp.fujitsu.com>
Diffstat (limited to 'tools/xenmon')
-rw-r--r--tools/xenmon/xenbaked.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/tools/xenmon/xenbaked.c b/tools/xenmon/xenbaked.c
index 32ca9f36c3..35ba8e40e9 100644
--- a/tools/xenmon/xenbaked.c
+++ b/tools/xenmon/xenbaked.c
@@ -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();