It doesn't work because we already set VCPUF_running
locally, and the scheduler should not pick another CPU's
VCPUF_running VCPU anyway, since it mustn't modify the
processor field.
Instead just add a simple assertion to the scheduler to
ensure the scheduling algorithm is not picking an
inappropriate VCPU.
Signed-off-by: Keir Fraser <keir@xensource.com>
ASSERT(cpus_weight(dirty_mask) <= 1);
if ( unlikely(!cpu_isset(cpu, dirty_mask) && !cpus_empty(dirty_mask)) )
{
- /* Make sure the next VCPU is not in a scheduling tail. */
- while ( test_bit(_VCPUF_running, &next->vcpu_flags) )
- cpu_relax();
/* Other cpus call __sync_lazy_execstate from flush ipi handler. */
if ( !cpus_empty(next->vcpu_dirty_cpumask) )
flush_tlb_mask(next->vcpu_dirty_cpumask);
}
#endif
+ ASSERT(!test_bit(_VCPUF_running, &next->vcpu_flags));
set_bit(_VCPUF_running, &next->vcpu_flags);
spin_unlock_irq(&schedule_data[cpu].schedule_lock);