summaryrefslogtreecommitdiffstats
path: root/sys/sun4v/sun4v/intr_machdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/sun4v/sun4v/intr_machdep.c')
-rw-r--r--sys/sun4v/sun4v/intr_machdep.c13
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. */
OpenPOWER on IntegriCloud