diff -r 9f6dec0d25cd xen/common/schedule.c --- a/xen/common/schedule.c Mon Mar 14 17:20:11 2011 +0000 +++ b/xen/common/schedule.c Tue Mar 15 10:19:15 2011 +0100 @@ -395,6 +395,7 @@ static void vcpu_migrate(struct vcpu *v) unsigned long flags; unsigned int old_cpu, new_cpu; spinlock_t *old_lock, *new_lock; + int pick_called = 0; old_cpu = new_cpu = v->processor; for ( ; ; ) @@ -430,11 +431,18 @@ static void vcpu_migrate(struct vcpu *v) old_cpu = v->processor; if ( old_lock == per_cpu(schedule_data, old_cpu).schedule_lock ) { + if ( pick_called && cpu_isset(new_cpu, v->cpu_affinity) && + cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) ) + break; + new_cpu = SCHED_OP(VCPU2OP(v), pick_cpu, v); if ( (new_lock == per_cpu(schedule_data, new_cpu).schedule_lock) && cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) ) break; + pick_called = 1; } + else + pick_called = 0; if ( old_lock != new_lock ) spin_unlock(new_lock);