diff options
Diffstat (limited to 'sys/sun4v/sun4v/intr_machdep.c')
-rw-r--r-- | sys/sun4v/sun4v/intr_machdep.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/sun4v/sun4v/intr_machdep.c b/sys/sun4v/sun4v/intr_machdep.c index 559bf8f..6b9f1fb 100644 --- a/sys/sun4v/sun4v/intr_machdep.c +++ b/sys/sun4v/sun4v/intr_machdep.c @@ -283,7 +283,7 @@ intr_execute_handlers(void *cookie) struct intr_vector *iv; struct intr_event *ie; struct intr_handler *ih; - int fast, thread; + int fast, thread, ret; iv = cookie; ie = iv->iv_event; @@ -292,6 +292,7 @@ intr_execute_handlers(void *cookie) return; } + ret = 0; fast = thread = 0; TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) { if (ih->ih_filter == NULL) { @@ -301,8 +302,16 @@ intr_execute_handlers(void *cookie) MPASS(ih->ih_filter != NULL && ih->ih_argument != NULL); CTR3(KTR_INTR, "%s: executing handler %p(%p)", __func__, ih->ih_filter, ih->ih_argument); - ih->ih_filter(ih->ih_argument); + ret = ih->ih_filter(ih->ih_argument); fast = 1; + /* + * Wrapper handler special case: see + * i386/intr_machdep.c::intr_execute_handlers() + */ + if (!thread) { + if (ret == FILTER_SCHEDULE_THREAD) + thread = 1; + } } /* Schedule a heavyweight interrupt process. */ |