x86/intr: allow mutex recursion in intr_remove_handler
This is needed so interrupt handlers can be removed while the PIC is resuming, it was previously not possible due to intr_resume holding the intr_table_lock and intr_remove_handler recursing on it. Sponsored by: Citrix Systems R&D Reviewed by: kib (previous version) MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D4114
This commit is contained in:
parent
3211f5ec16
commit
b2573c7bbd
@ -197,19 +197,28 @@ int
|
||||
intr_remove_handler(void *cookie)
|
||||
{
|
||||
struct intsrc *isrc;
|
||||
int error;
|
||||
int error, mtx_owned;
|
||||
|
||||
isrc = intr_handler_source(cookie);
|
||||
error = intr_event_remove_handler(cookie);
|
||||
if (error == 0) {
|
||||
mtx_lock(&intr_table_lock);
|
||||
/*
|
||||
* Recursion is needed here so PICs can remove interrupts
|
||||
* while resuming. It was previously not possible due to
|
||||
* intr_resume holding the intr_table_lock and
|
||||
* intr_remove_handler recursing on it.
|
||||
*/
|
||||
mtx_owned = mtx_owned(&intr_table_lock);
|
||||
if (mtx_owned == 0)
|
||||
mtx_lock(&intr_table_lock);
|
||||
isrc->is_handlers--;
|
||||
if (isrc->is_handlers == 0) {
|
||||
isrc->is_pic->pic_disable_source(isrc, PIC_NO_EOI);
|
||||
isrc->is_pic->pic_disable_intr(isrc);
|
||||
}
|
||||
intrcnt_updatename(isrc);
|
||||
mtx_unlock(&intr_table_lock);
|
||||
if (mtx_owned == 0)
|
||||
mtx_unlock(&intr_table_lock);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user