Index: sys/x86/xen/xen_intr.c =================================================================== --- sys/x86/xen/xen_intr.c +++ sys/x86/xen/xen_intr.c @@ -678,16 +678,6 @@ panic("unable to rebind xen IPI: %d", error); isrc->xi_port = bind_ipi.port; - isrc->xi_cpu = 0; - xen_intr_port_to_isrc[isrc->xi_port] = isrc; - - error = xen_intr_assign_cpu(&isrc->xi_intsrc, - cpu_apic_ids[cpu]); - if (error) - panic("unable to bind xen IPI to CPU#%d: %d", - cpu, error); - - evtchn_unmask_port(bind_ipi.port); #else panic("Resume IPI event channel on UP"); #endif @@ -708,18 +698,45 @@ panic("unable to rebind xen VIRQ#%d: %d", isrc->xi_virq, error); isrc->xi_port = bind_virq.port; - isrc->xi_cpu = 0; +} + +static void +xen_intr_rebind_isrc(struct xenisrc *isrc) +{ +#ifdef SMP + int cpu = isrc->xi_cpu; + const char *errfmt; + int error; +#endif + + switch (isrc->xi_type) { + case EVTCHN_TYPE_IPI: + xen_rebind_ipi(isrc); +#ifdef SMP + errfmt = "%s: unable to bind xen IPI to CPU#%d: %d"; +#endif + break; + case EVTCHN_TYPE_VIRQ: + xen_rebind_virq(isrc); +#ifdef SMP + errfmt = "%1$s: unable to bind xen VIRQ#%4$d to CPU#%2$d: %3$d"; +#endif + break; + default: + return; + } + xen_intr_port_to_isrc[isrc->xi_port] = isrc; #ifdef SMP + isrc->xi_cpu = 0; error = xen_intr_assign_cpu(&isrc->xi_intsrc, cpu_apic_ids[cpu]); if (error) - panic("unable to bind xen VIRQ#%d to CPU#%d: %d", - isrc->xi_virq, cpu, error); + panic(errfmt, __func__, cpu, error, isrc->xi_virq); #endif - evtchn_unmask_port(bind_virq.port); + evtchn_unmask_port(isrc->xi_port); } /** @@ -760,16 +777,7 @@ isrc = (struct xenisrc *)intr_lookup_source(vector); if (isrc != NULL) { isrc->xi_port = ~0; - switch (isrc->xi_type) { - case EVTCHN_TYPE_IPI: - xen_rebind_ipi(isrc); - break; - case EVTCHN_TYPE_VIRQ: - xen_rebind_virq(isrc); - break; - default: - break; - } + xen_intr_rebind_isrc(isrc); } } }