Index: sys/x86/xen/xen_intr.c =================================================================== --- sys/x86/xen/xen_intr.c +++ sys/x86/xen/xen_intr.c @@ -299,8 +299,9 @@ vector = first_evtchn_irq + isrc_idx; isrc = (struct xenisrc *)intr_lookup_source(vector); - if (isrc != NULL - && isrc->xi_type == EVTCHN_TYPE_UNBOUND) { + if (__predict_true(isrc != NULL) && + __predict_true(isrc->xi_intsrc.is_pic == &xen_intr_pic) && + isrc->xi_type == EVTCHN_TYPE_UNBOUND) { KASSERT(isrc->xi_intsrc.is_handlers == 0, ("Free evtchn still has handlers")); isrc->xi_type = type; @@ -352,7 +353,12 @@ isrc->xi_intsrc.is_pic = &xen_intr_pic; isrc->xi_vector = vector; isrc->xi_type = type; - intr_register_source(&isrc->xi_intsrc); + if (__predict_false(intr_register_source(&isrc->xi_intsrc) != 0)) { + free(isrc, M_XENINTR); + printf("%s(): WARNING failed to register IRQ %u\n", __func__, + vector); + return (NULL); + } return (isrc); }