Index: sys/xen/xen_intr.c =================================================================== --- sys/xen/xen_intr.c +++ sys/xen/xen_intr.c @@ -281,7 +281,7 @@ if (isrc != NULL) { mtx_unlock(&xen_intr_x86_lock); - return (isrc); + goto out; } if (xen_intr_auto_vector_count >= NR_EVENT_CHANNELS) { @@ -309,6 +309,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); } @@ -410,12 +422,15 @@ #ifdef SMP if (type == EVTCHN_TYPE_PORT) { + u_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