git: 11a9117871e6 - main - Use bus_generic_detach to detach and delete child devices during detach
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 02 Jan 2025 18:28:33 UTC
The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=11a9117871e6037ae7b8011b243939322efce569 commit 11a9117871e6037ae7b8011b243939322efce569 Author: John Baldwin <jhb@FreeBSD.org> AuthorDate: 2025-01-02 18:25:12 +0000 Commit: John Baldwin <jhb@FreeBSD.org> CommitDate: 2025-01-02 18:25:12 +0000 Use bus_generic_detach to detach and delete child devices during detach This is simpler and more robust than individual calls to device_delete_child. Differential Revision: https://reviews.freebsd.org/D47972 --- sys/arm/ti/twl/twl.c | 8 ++++---- sys/dev/aac/aac.c | 10 ++++------ sys/dev/aacraid/aacraid.c | 7 ++++--- sys/dev/alpm/alpm.c | 9 +++++---- sys/dev/amdpm/amdpm.c | 8 ++++---- sys/dev/amdsmb/amdsmb.c | 8 ++++---- sys/dev/cas/if_cas.c | 2 +- sys/dev/enetc/if_enetc.c | 3 +-- sys/dev/gem/if_gem.c | 2 +- sys/dev/mgb/if_mgb.c | 3 +-- sys/dev/mlx/mlx.c | 14 ++++---------- sys/dev/nfsmb/nfsmb.c | 21 ++++++++------------- sys/dev/puc/puc.c | 18 ++++++++---------- sys/dev/sound/pci/hda/hdac.c | 15 +++------------ sys/dev/usb/net/usb_ethernet.c | 8 +++----- sys/dev/virtio/mmio/virtio_mmio.c | 10 +++------- sys/dev/virtio/pci/virtio_pci.c | 12 ++++-------- sys/dev/xilinx/if_xae.c | 3 +-- 18 files changed, 63 insertions(+), 98 deletions(-) diff --git a/sys/arm/ti/twl/twl.c b/sys/arm/ti/twl/twl.c index 3a7a0ddcb0b1..ee54b0ea1f2c 100644 --- a/sys/arm/ti/twl/twl.c +++ b/sys/arm/ti/twl/twl.c @@ -425,13 +425,13 @@ static int twl_detach(device_t dev) { struct twl_softc *sc; + int error; sc = device_get_softc(dev); - if (sc->sc_vreg) - device_delete_child(dev, sc->sc_vreg); - if (sc->sc_clks) - device_delete_child(dev, sc->sc_clks); + error = bus_generic_detach(dev); + if (error != 0) + return (error); TWL_LOCK_DESTROY(sc); diff --git a/sys/dev/aac/aac.c b/sys/dev/aac/aac.c index 12f5eb50426b..912b3dc903e3 100644 --- a/sys/dev/aac/aac.c +++ b/sys/dev/aac/aac.c @@ -669,6 +669,10 @@ aac_detach(device_t dev) sc = device_get_softc(dev); fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); + error = bus_generic_detach(dev); + if (error != 0) + return (error); + callout_drain(&sc->aac_daemontime); mtx_lock(&sc->aac_io_lock); @@ -683,9 +687,6 @@ aac_detach(device_t dev) /* Remove the child containers */ while ((co = TAILQ_FIRST(&sc->aac_container_tqh)) != NULL) { - error = device_delete_child(dev, co->co_disk); - if (error) - return (error); TAILQ_REMOVE(&sc->aac_container_tqh, co, co_link); free(co, M_AACBUF); } @@ -693,9 +694,6 @@ aac_detach(device_t dev) /* Remove the CAM SIMs */ while ((sim = TAILQ_FIRST(&sc->aac_sim_tqh)) != NULL) { TAILQ_REMOVE(&sc->aac_sim_tqh, sim, sim_link); - error = device_delete_child(dev, sim->sim_dev); - if (error) - return (error); free(sim, M_AACBUF); } diff --git a/sys/dev/aacraid/aacraid.c b/sys/dev/aacraid/aacraid.c index 9e9b1c602b9d..90a073d10039 100644 --- a/sys/dev/aacraid/aacraid.c +++ b/sys/dev/aacraid/aacraid.c @@ -739,6 +739,10 @@ aacraid_detach(device_t dev) sc = device_get_softc(dev); fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); + error = bus_generic_detach(dev); + if (error != 0) + return (error); + callout_drain(&sc->aac_daemontime); /* Remove the child containers */ while ((co = TAILQ_FIRST(&sc->aac_container_tqh)) != NULL) { @@ -749,9 +753,6 @@ aacraid_detach(device_t dev) /* Remove the CAM SIMs */ while ((sim = TAILQ_FIRST(&sc->aac_sim_tqh)) != NULL) { TAILQ_REMOVE(&sc->aac_sim_tqh, sim, sim_link); - error = device_delete_child(dev, sim->sim_dev); - if (error) - return (error); free(sim, M_AACRAIDBUF); } diff --git a/sys/dev/alpm/alpm.c b/sys/dev/alpm/alpm.c index 46dc85ebc485..d7c3d3657d3b 100644 --- a/sys/dev/alpm/alpm.c +++ b/sys/dev/alpm/alpm.c @@ -232,11 +232,12 @@ static int alpm_detach(device_t dev) { struct alpm_softc *alpm = device_get_softc(dev); + int error; + + error = bus_generic_detach(dev); + if (error != 0) + return (error); - if (alpm->smbus) { - device_delete_child(dev, alpm->smbus); - alpm->smbus = NULL; - } mtx_destroy(&alpm->lock); if (alpm->res) diff --git a/sys/dev/amdpm/amdpm.c b/sys/dev/amdpm/amdpm.c index 22b252f572b0..d744c0aa5d4b 100644 --- a/sys/dev/amdpm/amdpm.c +++ b/sys/dev/amdpm/amdpm.c @@ -229,11 +229,11 @@ static int amdpm_detach(device_t dev) { struct amdpm_softc *amdpm_sc = device_get_softc(dev); + int error; - if (amdpm_sc->smbus) { - device_delete_child(dev, amdpm_sc->smbus); - amdpm_sc->smbus = NULL; - } + error = bus_generic_detach(dev); + if (error != 0) + return (error); mtx_destroy(&amdpm_sc->lock); if (amdpm_sc->res) diff --git a/sys/dev/amdsmb/amdsmb.c b/sys/dev/amdsmb/amdsmb.c index 00e2f979b6cc..3d2e7a5e0c19 100644 --- a/sys/dev/amdsmb/amdsmb.c +++ b/sys/dev/amdsmb/amdsmb.c @@ -174,11 +174,11 @@ static int amdsmb_detach(device_t dev) { struct amdsmb_softc *amdsmb_sc = device_get_softc(dev); + int error; - if (amdsmb_sc->smbus) { - device_delete_child(dev, amdsmb_sc->smbus); - amdsmb_sc->smbus = NULL; - } + error = bus_generic_detach(dev); + if (error != 0) + return (error); mtx_destroy(&amdsmb_sc->lock); if (amdsmb_sc->res) diff --git a/sys/dev/cas/if_cas.c b/sys/dev/cas/if_cas.c index 1f684097bd3a..fed2c3a3a051 100644 --- a/sys/dev/cas/if_cas.c +++ b/sys/dev/cas/if_cas.c @@ -477,7 +477,7 @@ cas_detach(struct cas_softc *sc) taskqueue_drain(sc->sc_tq, &sc->sc_tx_task); if_free(ifp); taskqueue_free(sc->sc_tq); - device_delete_child(sc->sc_dev, sc->sc_miibus); + bus_generic_detach(sc->sc_dev); for (i = 0; i < CAS_NRXDESC; i++) if (sc->sc_rxdsoft[i].rxds_dmamap != NULL) diff --git a/sys/dev/enetc/if_enetc.c b/sys/dev/enetc/if_enetc.c index 3c0bc4723b05..3a5d6ec23282 100644 --- a/sys/dev/enetc/if_enetc.c +++ b/sys/dev/enetc/if_enetc.c @@ -459,8 +459,7 @@ enetc_detach(if_ctx_t ctx) for (i = 0; i < sc->rx_num_queues; i++) iflib_irq_free(ctx, &sc->rx_queues[i].irq); - if (sc->miibus != NULL) - device_delete_child(sc->dev, sc->miibus); + bus_generic_detach(sc->dev); if (sc->regs != NULL) error = bus_release_resource(sc->dev, SYS_RES_MEMORY, diff --git a/sys/dev/gem/if_gem.c b/sys/dev/gem/if_gem.c index 434c5309d019..74504a950d31 100644 --- a/sys/dev/gem/if_gem.c +++ b/sys/dev/gem/if_gem.c @@ -413,7 +413,7 @@ gem_detach(struct gem_softc *sc) callout_drain(&sc->sc_rx_ch); #endif if_free(ifp); - device_delete_child(sc->sc_dev, sc->sc_miibus); + bus_generic_detach(sc->sc_dev); for (i = 0; i < GEM_NRXDESC; i++) if (sc->sc_rxsoft[i].rxs_dmamap != NULL) diff --git a/sys/dev/mgb/if_mgb.c b/sys/dev/mgb/if_mgb.c index 05c4c242f739..1240d0f84415 100644 --- a/sys/dev/mgb/if_mgb.c +++ b/sys/dev/mgb/if_mgb.c @@ -482,8 +482,7 @@ mgb_detach(if_ctx_t ctx) iflib_irq_free(ctx, &sc->rx_irq); iflib_irq_free(ctx, &sc->admin_irq); - if (sc->miibus != NULL) - device_delete_child(sc->dev, sc->miibus); + bus_generic_detach(sc->dev); if (sc->pba != NULL) error = bus_release_resource(sc->dev, SYS_RES_MEMORY, diff --git a/sys/dev/mlx/mlx.c b/sys/dev/mlx/mlx.c index d9a2a1f5442b..f0c7591803e0 100644 --- a/sys/dev/mlx/mlx.c +++ b/sys/dev/mlx/mlx.c @@ -642,7 +642,7 @@ mlx_shutdown(device_t dev) static int mlx_shutdown_locked(struct mlx_softc *sc) { - int i, error; + int error; debug_called(1); @@ -660,17 +660,11 @@ mlx_shutdown_locked(struct mlx_softc *sc) printf("done\n"); } MLX_IO_UNLOCK(sc); - + /* delete all our child devices */ - for (i = 0; i < MLX_MAXDRIVES; i++) { - if (sc->mlx_sysdrive[i].ms_disk != 0) { - if ((error = device_delete_child(sc->mlx_dev, sc->mlx_sysdrive[i].ms_disk)) != 0) - return (error); - sc->mlx_sysdrive[i].ms_disk = 0; - } - } + error = bus_generic_detach(sc->mlx_dev); - return (0); + return (error); } /******************************************************************************** diff --git a/sys/dev/nfsmb/nfsmb.c b/sys/dev/nfsmb/nfsmb.c index 462f90264885..b88b2ca0001f 100644 --- a/sys/dev/nfsmb/nfsmb.c +++ b/sys/dev/nfsmb/nfsmb.c @@ -275,13 +275,13 @@ nfsmbsub_detach(device_t dev) { device_t parent; struct nfsmb_softc *nfsmbsub_sc = device_get_softc(dev); + int error; parent = device_get_parent(dev); - if (nfsmbsub_sc->smbus) { - device_delete_child(dev, nfsmbsub_sc->smbus); - nfsmbsub_sc->smbus = NULL; - } + error = bus_generic_detach(dev); + if (error != 0) + return (error); mtx_destroy(&nfsmbsub_sc->lock); if (nfsmbsub_sc->res) { bus_release_resource(parent, SYS_RES_IOPORT, nfsmbsub_sc->rid, @@ -295,16 +295,11 @@ static int nfsmb_detach(device_t dev) { struct nfsmb_softc *nfsmb_sc = device_get_softc(dev); + int error; - if (nfsmb_sc->subdev) { - device_delete_child(dev, nfsmb_sc->subdev); - nfsmb_sc->subdev = NULL; - } - - if (nfsmb_sc->smbus) { - device_delete_child(dev, nfsmb_sc->smbus); - nfsmb_sc->smbus = NULL; - } + error = bus_generic_detach(dev); + if (error != 0) + return (error); mtx_destroy(&nfsmb_sc->lock); if (nfsmb_sc->res) { diff --git a/sys/dev/puc/puc.c b/sys/dev/puc/puc.c index 01193acf85b4..e10d0374c7de 100644 --- a/sys/dev/puc/puc.c +++ b/sys/dev/puc/puc.c @@ -409,21 +409,19 @@ puc_bfe_detach(device_t dev) sc = device_get_softc(dev); /* Detach our children. */ - error = 0; + error = bus_generic_detach(dev); + if (error != 0) + return (error); + for (idx = 0; idx < sc->sc_nports; idx++) { port = &sc->sc_port[idx]; if (port->p_dev == NULL) continue; - if (device_delete_child(dev, port->p_dev) == 0) { - if (port->p_rres != NULL) - rman_release_resource(port->p_rres); - if (port->p_ires != NULL) - rman_release_resource(port->p_ires); - } else - error = ENXIO; + if (port->p_rres != NULL) + rman_release_resource(port->p_rres); + if (port->p_ires != NULL) + rman_release_resource(port->p_ires); } - if (error) - return (error); if (sc->sc_serdevs != 0UL) bus_teardown_intr(dev, sc->sc_ires, sc->sc_icookie); diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c index c9b11de01d18..4f9f70d98cb6 100644 --- a/sys/dev/sound/pci/hda/hdac.c +++ b/sys/dev/sound/pci/hda/hdac.c @@ -1740,20 +1740,11 @@ static int hdac_detach(device_t dev) { struct hdac_softc *sc = device_get_softc(dev); - device_t *devlist; - int cad, i, devcount, error; + int i, error; - if ((error = device_get_children(dev, &devlist, &devcount)) != 0) + error = bus_generic_detach(dev); + if (error != 0) return (error); - for (i = 0; i < devcount; i++) { - cad = (intptr_t)device_get_ivars(devlist[i]); - if ((error = device_delete_child(dev, devlist[i])) != 0) { - free(devlist, M_TEMP); - return (error); - } - sc->codecs[cad].dev = NULL; - } - free(devlist, M_TEMP); hdac_lock(sc); hdac_reset(sc, false); diff --git a/sys/dev/usb/net/usb_ethernet.c b/sys/dev/usb/net/usb_ethernet.c index 2f423f557569..977805cefe66 100644 --- a/sys/dev/usb/net/usb_ethernet.c +++ b/sys/dev/usb/net/usb_ethernet.c @@ -315,11 +315,9 @@ uether_ifdetach(struct usb_ether *ue) ether_ifdetach(ifp); /* detach miibus */ - if (ue->ue_miibus != NULL) { - bus_topo_lock(); - device_delete_child(ue->ue_dev, ue->ue_miibus); - bus_topo_unlock(); - } + bus_topo_lock(); + bus_generic_detach(ue->ue_dev); + bus_topo_unlock(); /* free interface instance */ if_free(ifp); diff --git a/sys/dev/virtio/mmio/virtio_mmio.c b/sys/dev/virtio/mmio/virtio_mmio.c index b1a4230f7b46..175b33b42ed8 100644 --- a/sys/dev/virtio/mmio/virtio_mmio.c +++ b/sys/dev/virtio/mmio/virtio_mmio.c @@ -292,17 +292,13 @@ static int vtmmio_detach(device_t dev) { struct vtmmio_softc *sc; - device_t child; int error; sc = device_get_softc(dev); - if ((child = sc->vtmmio_child_dev) != NULL) { - error = device_delete_child(dev, child); - if (error) - return (error); - sc->vtmmio_child_dev = NULL; - } + error = bus_generic_detach(dev); + if (error) + return (error); vtmmio_reset(sc); diff --git a/sys/dev/virtio/pci/virtio_pci.c b/sys/dev/virtio/pci/virtio_pci.c index fc26d62543c1..b7b34b448f6e 100644 --- a/sys/dev/virtio/pci/virtio_pci.c +++ b/sys/dev/virtio/pci/virtio_pci.c @@ -182,18 +182,14 @@ vtpci_add_child(struct vtpci_common *cn) int vtpci_delete_child(struct vtpci_common *cn) { - device_t dev, child; + device_t dev; int error; dev = cn->vtpci_dev; - child = cn->vtpci_child_dev; - if (child != NULL) { - error = device_delete_child(dev, child); - if (error) - return (error); - cn->vtpci_child_dev = NULL; - } + error = bus_generic_detach(dev); + if (error) + return (error); return (0); } diff --git a/sys/dev/xilinx/if_xae.c b/sys/dev/xilinx/if_xae.c index 26f1bf805ffa..080b13606525 100644 --- a/sys/dev/xilinx/if_xae.c +++ b/sys/dev/xilinx/if_xae.c @@ -1052,8 +1052,7 @@ xae_detach(device_t dev) ether_ifdetach(ifp); } - if (sc->miibus != NULL) - device_delete_child(dev, sc->miibus); + bus_generic_detach(dev); if (ifp != NULL) if_free(ifp);