Fix the logic in vcpu_sleep_sync(): we must wait until

the running flag is cleared *and* the scheduler lock is
released. Not just one or the other.

Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
This commit is contained in:
kaf24@firebug.cl.cam.ac.uk committed 2005-09-13 19:09:44 +00:00
1 parent 1f0c99978f
commit 5bcdcd40ec
1 file changed
+5 -4
+5 -4
View File
@@ -211,11 +211,12 @@ void vcpu_sleep_sync(struct vcpu *v)
/*
* We can be sure that the VCPU is finally descheduled after the running
* flag is cleared and the scheduler lock is released.
* flag is cleared and the scheduler lock is released. We also check that
* the domain continues to be unrunnable, in case someone else wakes it.
*/
while ( test_bit(_VCPUF_running, &v->vcpu_flags)
&& !domain_runnable(v)
&& spin_is_locked(&schedule_data[v->processor].schedule_lock) )
while ( !domain_runnable(v) &&
(test_bit(_VCPUF_running, &v->vcpu_flags) ||
spin_is_locked(&schedule_data[v->processor].schedule_lock)) )
cpu_relax();
sync_vcpu_execstate(v);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.