Index: sys/kern/kern_intr.c =================================================================== --- sys/kern/kern_intr.c +++ sys/kern/kern_intr.c @@ -286,11 +286,51 @@ { struct intr_event *ie; va_list ap; + int res; + + ie = malloc(sizeof(struct intr_event), M_ITHREAD, M_WAITOK | M_ZERO); + va_start(ap, fmt); + res = intr_event_initv(ie, source, flags, irq, pre_ithread, + post_ithread, post_filter, assign_cpu, fmt, ap); + va_end(ap); + + if (res != 0) { + free(ie, M_ITHREAD); + return (res); + } + + if (event != NULL) + *event = ie; + return (res); +} + +int +intr_event_init(struct intr_event *ie, void *source, int flags, int irq, + void (*pre_ithread)(void *), void (*post_ithread)(void *), + void (*post_filter)(void *), int (*assign_cpu)(void *, int), + const char *fmt, ...) +{ + va_list ap; + int res; + + va_start(ap, fmt); + res = intr_event_initv(ie, source, flags, irq, pre_ithread, + post_ithread, post_filter, assign_cpu, fmt, ap); + va_end(ap); + + return (res); +} + +int +intr_event_initv(struct intr_event *ie, void *source, int flags, int irq, + void (*pre_ithread)(void *), void (*post_ithread)(void *), + void (*post_filter)(void *), int (*assign_cpu)(void *, int), + const char *fmt, __va_list ap) +{ /* The only valid flag during creation is IE_SOFT. */ if ((flags & ~IE_SOFT) != 0) return (EINVAL); - ie = malloc(sizeof(struct intr_event), M_ITHREAD, M_WAITOK | M_ZERO); ie->ie_source = source; ie->ie_pre_ithread = pre_ithread; ie->ie_post_ithread = post_ithread; @@ -302,15 +342,11 @@ CK_SLIST_INIT(&ie->ie_handlers); mtx_init(&ie->ie_lock, "intr event", NULL, MTX_DEF); - va_start(ap, fmt); vsnprintf(ie->ie_name, sizeof(ie->ie_name), fmt, ap); - va_end(ap); strlcpy(ie->ie_fullname, ie->ie_name, sizeof(ie->ie_fullname)); mtx_lock(&event_lock); TAILQ_INSERT_TAIL(&event_list, ie, ie_list); mtx_unlock(&event_lock); - if (event != NULL) - *event = ie; CTR2(KTR_INTR, "%s: created %s", __func__, ie->ie_name); return (0); } @@ -531,6 +567,15 @@ int intr_event_destroy(struct intr_event *ie) +{ + + intr_event_shutdown(ie); + free(ie, M_ITHREAD); + return (0); +} + +int +intr_event_shutdown(struct intr_event *ie) { mtx_lock(&event_lock); @@ -550,7 +595,6 @@ mtx_unlock(&ie->ie_lock); mtx_unlock(&event_lock); mtx_destroy(&ie->ie_lock); - free(ie, M_ITHREAD); return (0); } Index: sys/sys/interrupt.h =================================================================== --- sys/sys/interrupt.h +++ sys/sys/interrupt.h @@ -180,9 +180,20 @@ void (*post_ithread)(void *), void (*post_filter)(void *), int (*assign_cpu)(void *, int), const char *fmt, ...) __printflike(9, 10); +int intr_event_init(struct intr_event *event, void *source, + int flags, int irq, void (*pre_ithread)(void *), + void (*post_ithread)(void *), void (*post_filter)(void *), + int (*assign_cpu)(void *, int), const char *fmt, ...) + __printflike(9, 10); +int intr_event_initv(struct intr_event *event, void *source, + int flags, int irq, void (*pre_ithread)(void *), + void (*post_ithread)(void *), void (*post_filter)(void *), + int (*assign_cpu)(void *, int), const char *fmt, __va_list) + __printflike(9, 0); int intr_event_describe_handler(struct intr_event *ie, void *cookie, const char *descr); int intr_event_destroy(struct intr_event *ie); +int intr_event_shutdown(struct intr_event *ie); int intr_event_handle(struct intr_event *ie, struct trapframe *frame); int intr_event_remove_handler(void *cookie); int intr_event_suspend_handler(void *cookie);