Puthiyaparambil, Aravindh
2005-Sep-13 18:29 UTC
[Xen-devel] RE: [PATCH] workaround for bug#197: second try
Ryan, This patch has fixed the race condition that I was seeing. Thanks Aravindh> -----Original Message----- > From: Ryan Harper [mailto:ryanh@us.ibm.com] > Sent: Tuesday, September 13, 2005 2:22 PM > To: xen-devel@lists.xensource.com > Cc: Puthiyaparambil, Aravindh; Dan Smith > Subject: [PATCH] workaround for bug#197: second try > > > Thanks for trying out the last patch. While the previous workaround > worked for > me, it did not for others. Looking into domain_pause(), we can seethat> vcpu_sleep_sync() is called on each vcpu: > > /* > * We can be sure that the VCPU is finally descheduled after the > running > * flag is cleared and the scheduler lock is released. > */ > while ( test_bit(_VCPUF_running, &v->vcpu_flags) > && !domain_runnable(v) > &&spin_is_locked(&schedule_data[v->processor].schedule_lock)> ) > cpu_relax(); > > If we are to believe the comment, (which makes sense), then the whileloop> code > is broken. That is, this function will spin until *any* of the three > tests > returns false rather than waiting until *all* tests are false. Thispatch> switches the &&s to ||s and inverts the domain_runnable() check. I > believe we > want to spin while 1) vcpu_running flag is up 2) the domain isrunnable> and 3) > the scheduler lock is held. > > > -- > Ryan Harper > Software Engineer; Linux Technology Center > IBM Corp., Austin, Tx > (512) 838-9253 T/L: 678-9253 > ryanh@us.ibm.com > > > diffstat output: > schedule.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > --- > # > # fix logic to match comments. ie. we want to spin until > # 1) the running flag is down, > # 2) the domain isnt runnable (pausecnt > 0) > # 3) the scheduler lock isnt held > # > # Signed-off-by: Ryan Harper <ryanh@us.ibm.com> > # > diff -r 413c911e5780 xen/common/schedule.c > --- a/xen/common/schedule.c Mon Sep 12 12:48:33 2005 > +++ b/xen/common/schedule.c Tue Sep 13 09:46:36 2005 > @@ -214,8 +214,8 @@ > * flag is cleared and the scheduler lock is released. > */ > while ( test_bit(_VCPUF_running, &v->vcpu_flags) > - && !domain_runnable(v) > - &&spin_is_locked(&schedule_data[v->processor].schedule_lock)> ) > + || domain_runnable(v) > + ||spin_is_locked(&schedule_data[v->processor].schedule_lock)> ) > cpu_relax(); > > sync_vcpu_execstate(v);_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel