From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ryan Harper Subject: [PATCH] workaround for bug#197: second try Date: Tue, 13 Sep 2005 13:22:19 -0500 Message-ID: <20050913182219.GA11410@us.ibm.com> References: <20050909220719.GP8187@us.ibm.com> <20050912212740.GB8009@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: <20050912212740.GB8009@us.ibm.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com Cc: Dan Smith , "Puthiyaparambil, Aravindh" List-Id: xen-devel@lists.xenproject.org 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 see that 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 while loop 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. This patch 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 is runnable 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 # 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);