xen: sched: simplify ACPI S3 resume path.

In fact, when domains are being unpaused:
 - it's not necessary to put the vcpu to sleep, as
   they are all already paused;
 - it is not necessary to call vcpu_migrate(), as
   the vcpus are still paused, and therefore won't
   wakeup anyway.

Basically, the only important thing is to call
pick_cpu, to let the scheduler run and figure out
what would be the best initial placement (i.e., the
value stored in v->processor), for the vcpus, as
they come back up, one after another.

Note that this is consistent with what was happening
before this change, as vcpu_migrate() calls pick_cpu.
But much simpler and quicker.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
This commit is contained in:
Dario Faggioli authored and George Dunlap committed 2017-01-24 17:02:07 +00:00
1 parent c4fba1161b
commit 8a5d50dd0b
1 file changed
+10 -12
+10 -12
View File
@@ -635,7 +635,11 @@ void restore_vcpu_affinity(struct domain *d)
for_each_vcpu ( d, v )
{
spinlock_t *lock = vcpu_schedule_lock_irq(v);
spinlock_t *lock;
ASSERT(!vcpu_runnable(v));
lock = vcpu_schedule_lock_irq(v);
if ( v->affinity_broken )
{
@@ -659,17 +663,11 @@ void restore_vcpu_affinity(struct domain *d)
cpupool_domain_cpumask(v->domain));
v->processor = cpumask_any(cpumask_scratch_cpu(cpu));
if ( v->processor == cpu )
{
set_bit(_VPF_migrating, &v->pause_flags);
spin_unlock_irq(lock);;
vcpu_sleep_nosync(v);
vcpu_migrate(v);
}
else
{
spin_unlock_irq(lock);
}
spin_unlock_irq(lock);;
lock = vcpu_schedule_lock_irq(v);
v->processor = SCHED_OP(VCPU2OP(v), pick_cpu, v);
spin_unlock_irq(lock);
}
domain_update_node_affinity(d);
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.