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:
Roger Pau Monné 2015-11-18 18:09:49 +00:00
parent 6f42d16f43
commit 531cfe55e2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=291022

View File

@ -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);
}