From: Mirela Simonovic Date: Fri, 1 Jun 2018 13:17:46 +0000 (+0200) Subject: xen/common: Restore IRQ affinity when hotplugging a pCPU X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~3704^2~17 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=efaa91afa28c36579a34702614fa3948c7e78aed;p=xen.git xen/common: Restore IRQ affinity when hotplugging a pCPU Non-boot pCPUs are being hot-unplugged during the system suspend to RAM and hotplugged during the resume. When non-boot pCPUs are hot-unplugged the interrupts that were targeted to them are migrated to the boot pCPU. On suspend, each guest could have its own wake-up devices/interrupts (passthrough) that could trigger the system resume. These interrupts could be targeted to a non-boot pCPU, e.g. if the guest's vCPU is pinned to a non-boot pCPU. Due to the hot-unplug of non-boot pCPUs during the suspend such interrupts will be migrated from non-boot pCPUs to the boot pCPU (this is fine). However, when non-boot pCPUs are hotplugged on resume, these interrupts are not migrated back to non-boot pCPUs, i.e. IRQ affinity is not restored on resume (this is wrong). This patch adds the restoration of IRQ affinity when a pCPU is hotplugged. Signed-off-by: Mirela Simonovic Reviewed-by: Dario Faggioli --- diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 049f93f7aa..ccf936db83 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -737,6 +737,7 @@ void restore_vcpu_affinity(struct domain *d) for_each_vcpu ( d, v ) { spinlock_t *lock; + unsigned int old_cpu = v->processor; ASSERT(!vcpu_runnable(v)); @@ -769,6 +770,9 @@ void restore_vcpu_affinity(struct domain *d) lock = vcpu_schedule_lock_irq(v); v->processor = SCHED_OP(vcpu_scheduler(v), pick_cpu, v); spin_unlock_irq(lock); + + if ( old_cpu != v->processor ) + sched_move_irqs(v); } domain_update_node_affinity(d);