Skip site navigation (1)Skip section navigation (2)
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>