diff options
| author | Abdelkader Boudih <freebsd@seuros.com> | 2026-02-03 03:21:43 +0000 |
|---|---|---|
| committer | Kyle Evans <kevans@FreeBSD.org> | 2026-02-03 03:21:43 +0000 |
| commit | ed3a2469a71e0ef48cf8e636c35e64a011756da3 (patch) | |
| tree | a3b289f2a409e4f752cb381edd516c6f56ac7f16 | |
| parent | d3f21856aa72c28408660ed40ce76bbd0716a991 (diff) | |
uart: fix sleeping while holding mutex in uart_tty_detach()
Move swi_remove() call before acquiring the tty lock. swi_remove() calls
intr_event_remove_handler() which may sleep via msleep(), causing a lock
order violation when called with the tty mutex held.
The software interrupt handler removal operates on the interrupt event
structure independently and does not require the tty lock. This matches
the pattern used in other drivers such as tcp_hpts.c where swi_remove()
is called without holding other locks.
Reviewed by: imp, kevans
MFC after: 3 days
Differential Revision: https://reviews.freebsd.org/D54953
| -rw-r--r-- | sys/dev/uart/uart_tty.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/dev/uart/uart_tty.c b/sys/dev/uart/uart_tty.c index d15d1d0c6ac2..7f0f730b3b6e 100644 --- a/sys/dev/uart/uart_tty.c +++ b/sys/dev/uart/uart_tty.c @@ -447,8 +447,9 @@ uart_tty_detach(struct uart_softc *sc) tp = sc->sc_u.u_tty.tp; - tty_lock(tp); swi_remove(sc->sc_softih); + + tty_lock(tp); tty_rel_gone(tp); return (0); |
