Index: sys/x86/xen/xen_intr.c =================================================================== --- sys/x86/xen/xen_intr.c +++ sys/x86/xen/xen_intr.c @@ -369,8 +369,6 @@ { mtx_lock(&xen_intr_isrc_lock); - KASSERT(isrc->xi_intsrc.is_handlers == 0, - ("Release called, but xenisrc still in use")); evtchn_mask_port(isrc->xi_port); evtchn_clear_port(isrc->xi_port); @@ -378,6 +376,13 @@ evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port); evtchn_cpu_unmask_port(0, isrc->xi_port); + if (isrc->xi_cookie != NULL) { + xen_arch_intr_remove_handler(isrc); + isrc->xi_cookie = NULL; + } + KASSERT(!xen_arch_intr_has_handlers(isrc), + ("Handler removed, but xenisrc still has handlers")); + if (isrc->xi_port < NR_EVENT_CHANNELS) { if (isrc->xi_close != 0) { struct evtchn_close close = { .port = isrc->xi_port }; @@ -1280,8 +1285,6 @@ } mtx_unlock(&xen_intr_isrc_lock); - if (isrc->xi_cookie != NULL) - intr_remove_handler(isrc->xi_cookie); xen_intr_release_isrc(isrc); }