mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
Avoid endless loop for vcpu migration.
Only call SCHED_OP(pick_cpu) if a previously picked cpu is not suitable on the current iteration of the retry loop. Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com> Signed-off-by: Keir Fraser <keir@xen.org>
This commit is contained in:
1 parent
436308d761
commit
e1255ac77e
1 file changed
+21
-1
+21
-1
@@ -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;
|
||||
bool_t pick_called = 0;
|
||||
|
||||
old_cpu = new_cpu = v->processor;
|
||||
for ( ; ; )
|
||||
@@ -426,14 +427,33 @@ static void vcpu_migrate(struct vcpu *v)
|
||||
spin_lock(old_lock);
|
||||
}
|
||||
|
||||
/* Select new CPU. */
|
||||
old_cpu = v->processor;
|
||||
if ( old_lock == per_cpu(schedule_data, old_cpu).schedule_lock )
|
||||
{
|
||||
/*
|
||||
* If we selected a CPU on the previosu iteration, check if it
|
||||
* remains suitable for running this vCPU.
|
||||
*/
|
||||
if ( pick_called &&
|
||||
(new_lock == per_cpu(schedule_data, new_cpu).schedule_lock) &&
|
||||
cpu_isset(new_cpu, v->cpu_affinity) &&
|
||||
cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) )
|
||||
break;
|
||||
|
||||
/* Select a new CPU. */
|
||||
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
|
||||
{
|
||||
/*
|
||||
* We do not hold the scheduler lock appropriate for this vCPU.
|
||||
* Thus we cannot select a new CPU on this iteration. Try again.
|
||||
*/
|
||||
pick_called = 0;
|
||||
}
|
||||
|
||||
if ( old_lock != new_lock )
|
||||
|
||||