Date: Sat, 25 Apr 2026 16:15:33 +0000 From: Enji Cooper <ngie@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 589ece518441 - stable/15 - asmc: resource cleanup simplifications Message-ID: <69ece8a5.41f63.192ce6f8@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch stable/15 has been updated by ngie: URL: https://cgit.FreeBSD.org/src/commit/?id=589ece518441d787a5267abfa8fe6f704171dd78 commit 589ece518441d787a5267abfa8fe6f704171dd78 Author: Enji Cooper <ngie@FreeBSD.org> AuthorDate: 2026-01-30 06:55:08 +0000 Commit: Enji Cooper <ngie@FreeBSD.org> CommitDate: 2026-04-25 16:14:50 +0000 asmc: resource cleanup simplifications This change makes `asmc_detach(..)` reentrant by setting freed resources to known invalid values when done, and makes `asmc_attach(..)` call `asmc_detach(..)` instead of attempting to the semi-equivalent way of cleaning up the driver resources allocated in `asmc_detach(..)`. MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D55413 (cherry picked from commit eda36ae09dd1fab78bd377739fc5d6c65c61f5d7) --- sys/dev/asmc/asmc.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c index 1623d2d9bf98..b874599dcc81 100644 --- a/sys/dev/asmc/asmc.c +++ b/sys/dev/asmc/asmc.c @@ -835,7 +835,7 @@ asmc_attach(device_t dev) if (sc->sc_irq == NULL) { device_printf(dev, "unable to allocate IRQ resource\n"); ret = ENXIO; - goto err2; + goto err; } ret = bus_setup_intr(dev, sc->sc_irq, @@ -845,18 +845,14 @@ asmc_attach(device_t dev) if (ret) { device_printf(dev, "unable to setup SMS IRQ\n"); - goto err1; + goto err; } + nosms: return (0); -err1: - bus_release_resource(dev, SYS_RES_IRQ, sc->sc_rid_irq, sc->sc_irq); -err2: - bus_release_resource(dev, SYS_RES_IOPORT, sc->sc_rid_port, - sc->sc_ioport); - mtx_destroy(&sc->sc_mtx); - if (sc->sc_sms_tq) - taskqueue_free(sc->sc_sms_tq); + +err: + asmc_detach(dev); return (ret); } @@ -869,16 +865,25 @@ asmc_detach(device_t dev) if (sc->sc_sms_tq) { taskqueue_drain(sc->sc_sms_tq, &sc->sc_sms_task); taskqueue_free(sc->sc_sms_tq); + sc->sc_sms_tq = NULL; } - if (sc->sc_cookie) + if (sc->sc_cookie) { bus_teardown_intr(dev, sc->sc_irq, sc->sc_cookie); - if (sc->sc_irq) + sc->sc_cookie = NULL; + } + if (sc->sc_irq) { bus_release_resource(dev, SYS_RES_IRQ, sc->sc_rid_irq, sc->sc_irq); - if (sc->sc_ioport) + sc->sc_irq = NULL; + } + if (sc->sc_ioport) { bus_release_resource(dev, SYS_RES_IOPORT, sc->sc_rid_port, sc->sc_ioport); - mtx_destroy(&sc->sc_mtx); + sc->sc_ioport = NULL; + } + if (mtx_initialized(&sc->sc_mtx)) { + mtx_destroy(&sc->sc_mtx); + } return (0); }home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69ece8a5.41f63.192ce6f8>
