Index: sys/xen/xen_intr.c =================================================================== --- sys/xen/xen_intr.c +++ sys/xen/xen_intr.c @@ -282,7 +282,7 @@ if (isrc != NULL) { mtx_unlock(&xen_intr_x86_lock); - return (isrc); + goto out; } if (xen_intr_auto_vector_count >= NR_EVENT_CHANNELS) { @@ -310,6 +310,18 @@ return (NULL); } +out: +#ifdef SMP + if (type == EVTCHN_TYPE_PORT) { + /* + * By default all interrupts are assigned to vCPU#0 + * unless specified otherwise, so shuffle them to balance + * the interrupt load. + */ + isrc->xi_cpu = intr_next_cpu(0); + } +#endif + return (isrc); } @@ -413,12 +425,14 @@ #ifdef SMP if (type == EVTCHN_TYPE_PORT) { + int cpu = isrc->xi_cpu; + isrc->xi_cpu = 0; /* * By default all interrupts are assigned to vCPU#0 * unless specified otherwise, so shuffle them to balance * the interrupt load. */ - xen_intr_assign_cpu(isrc, intr_next_cpu(0)); + xen_intr_assign_cpu(isrc, cpu); } #endif