From acf7409eb6ea49a264ba1a6ed5ae334559a2afd8 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sat, 26 Nov 2005 14:36:21 +0000 Subject: [PATCH] In unregister_int(): - Don't update i_mplock_required, if the unregistering intr record is not found - Use a local variable `rec0' to test whether after the unregistering there are still intr records which require MP lock. `rec' can't be reused here, since `rec' is the intr record to free, if it is reused in this test, *wrong* intr record will be freed --- sys/kern/kern_intr.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c index e3d31803d4..0a35d5f0cb 100644 --- a/sys/kern/kern_intr.c +++ b/sys/kern/kern_intr.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/kern/kern_intr.c,v 1.24.2.1 2001/10/14 20:05:50 luigi Exp $ - * $DragonFly: src/sys/kern/kern_intr.c,v 1.37 2005/11/22 06:13:42 dillon Exp $ + * $DragonFly: src/sys/kern/kern_intr.c,v 1.38 2005/11/26 14:36:21 sephe Exp $ * */ @@ -309,6 +309,8 @@ unregister_int(void *id) list = &rec->next; } if (rec) { + intrec_t rec0; + *list = rec->next; if (rec->intr_flags & INTR_FAST) --info->i_fast; @@ -316,18 +318,18 @@ unregister_int(void *id) --info->i_slow; if (intr < FIRST_SOFTINT && info->i_fast + info->i_slow == 0) machintr_vector_teardown(intr); - } - /* - * Clear i_mplock_required if no handlers in the chain require the - * MP lock. - */ - for (rec = info->i_reclist; rec; rec = rec->next) { - if ((rec->intr_flags & INTR_MPSAFE) == 0) - break; - } - if (rec == NULL) + /* + * Clear i_mplock_required if no handlers in the chain require the + * MP lock. + */ + for (rec0 = info->i_reclist; rec0; rec0 = rec0->next) { + if ((rec0->intr_flags & INTR_MPSAFE) == 0) + break; + } + if (rec0 == NULL) info->i_mplock_required = 0; + } crit_exit(); -- 2.41.0