diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-04-24 09:59:57 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-04-24 09:59:57 +0100 |
commit | f3814331c731f6dc453d14c6373bfae109215606 (patch) | |
tree | 96f0b3430597f1dec63155bf958fd2a2f6ab0191 /tools/xenmon | |
parent | 628bdecb85a3a7d591e39402bd61a6d67cd205fb (diff) | |
download | xen-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.c | 32 |
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(); |