Some changes to intr_execute_handlers():
- Fix NULL pointer dereferences caused when an ithread or a handler is NULL which happens when a stray interrupt triggers after the respective device interrupt was torn down. - Remove the critical section around INTR_FAST handlers which actually was a nested critical section. Both tl0_intr() and tl1_intr() already enter a critical section for calling intr_execute_handlers(). MFC after: 3 days
This commit is contained in:
parent
50f046e614
commit
197bb5864f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=145152
@ -240,12 +240,13 @@ intr_execute_handlers(void *cookie)
|
||||
|
||||
iv = cookie;
|
||||
ithd = iv->iv_ithd;
|
||||
MPASS(ithd != NULL);
|
||||
|
||||
ih = TAILQ_FIRST(&ithd->it_handlers);
|
||||
if (ih->ih_flags & IH_FAST) {
|
||||
if (ithd == NULL)
|
||||
ih = NULL;
|
||||
else
|
||||
ih = TAILQ_FIRST(&ithd->it_handlers);
|
||||
if (ih != NULL && ih->ih_flags & IH_FAST) {
|
||||
/* Execute fast interrupt handlers directly. */
|
||||
critical_enter();
|
||||
TAILQ_FOREACH(ih, &ithd->it_handlers, ih_next) {
|
||||
MPASS(ih->ih_flags & IH_FAST &&
|
||||
ih->ih_argument != NULL);
|
||||
@ -253,12 +254,11 @@ intr_execute_handlers(void *cookie)
|
||||
__func__, ih->ih_handler, ih->ih_argument);
|
||||
ih->ih_handler(ih->ih_argument);
|
||||
}
|
||||
critical_exit();
|
||||
return;
|
||||
}
|
||||
|
||||
/* Schedule a heavyweight interrupt process. */
|
||||
error = ithread_schedule(iv->iv_ithd);
|
||||
error = ithread_schedule(ithd);
|
||||
if (error == EINVAL)
|
||||
intr_stray_vector(iv);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user