diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c --- a/sys/kern/kern_intr.c +++ b/sys/kern/kern_intr.c @@ -3,6 +3,7 @@ * * Copyright (c) 1997, Stefan Esser * All rights reserved. + * Copyright © 2022 Elliott Mitchell * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -54,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -109,8 +111,8 @@ #endif static TAILQ_HEAD(, intr_event) event_list = TAILQ_HEAD_INITIALIZER(event_list); -static struct mtx event_lock; -MTX_SYSINIT(intr_event_list, &event_lock, "intr event list", MTX_DEF); +static struct sx event_lock; +SX_SYSINIT(intr_event_list, &event_lock, "intr event list"); static void intr_event_update(struct intr_event *ie); static int intr_event_schedule_thread(struct intr_event *ie, struct trapframe *frame); @@ -305,9 +307,9 @@ vsnprintf(ie->ie_name, sizeof(ie->ie_name), fmt, ap); va_end(ap); strlcpy(ie->ie_fullname, ie->ie_name, sizeof(ie->ie_fullname)); - mtx_lock(&event_lock); + sx_xlock(&event_lock); TAILQ_INSERT_TAIL(&event_list, ie, ie_list); - mtx_unlock(&event_lock); + sx_xunlock(&event_lock); if (event != NULL) *event = ie; CTR2(KTR_INTR, "%s: created %s", __func__, ie->ie_name); @@ -434,13 +436,13 @@ { struct intr_event *ie; - mtx_lock(&event_lock); + sx_slock(&event_lock); TAILQ_FOREACH(ie, &event_list, ie_list) if (ie->ie_irq == irq && (ie->ie_flags & IE_SOFT) == 0 && CK_SLIST_FIRST(&ie->ie_handlers) != NULL) break; - mtx_unlock(&event_lock); + sx_sunlock(&event_lock); return (ie); } @@ -535,11 +537,11 @@ if (ie == NULL) return (EINVAL); - mtx_lock(&event_lock); + sx_xlock(&event_lock); mtx_lock(&ie->ie_lock); if (!CK_SLIST_EMPTY(&ie->ie_handlers)) { mtx_unlock(&ie->ie_lock); - mtx_unlock(&event_lock); + sx_xunlock(&event_lock); return (EBUSY); } TAILQ_REMOVE(&event_list, ie, ie_list); @@ -550,7 +552,7 @@ } #endif mtx_unlock(&ie->ie_lock); - mtx_unlock(&event_lock); + sx_xunlock(&event_lock); mtx_destroy(&ie->ie_lock); free(ie, M_ITHREAD); return (0);