bhndb(4): Fix leak of child devices and MSI vectors.

- Add missing call to device_delete_children() in bhndb_detach(), without
  which we're left with stale child devices on module unload.
- Pass the parent PCI device to pci_release_msi(), not the bhndb_pci(4)
  child.

Approved by:	adrian (mentor, implicit)
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
landonf 2017-12-02 01:07:41 +00:00
parent 12100615d8
commit cc78c9c494
2 changed files with 9 additions and 3 deletions

View File

@ -639,6 +639,10 @@ bhndb_generic_detach(device_t dev)
if ((error = bus_generic_detach(dev)))
return (error);
/* Delete children */
if ((error = device_delete_children(dev)))
return (error);
/* Clean up our service registry */
if ((error = bhnd_service_registry_fini(&sc->services)))
return (error);

View File

@ -303,8 +303,10 @@ bhndb_pci_alloc_msi(struct bhndb_pci_softc *sc, int *msi_count)
return (error);
}
if (count < BHNDB_PCI_MSI_COUNT)
if (count < BHNDB_PCI_MSI_COUNT) {
pci_release_msi(sc->parent);
return (ENXIO);
}
*msi_count = count;
return (0);
@ -412,7 +414,7 @@ bhndb_pci_attach(device_t dev)
bhndb_free_intr_isrc(sc->isrc);
if (sc->msi_count > 0)
pci_release_msi(dev);
pci_release_msi(sc->parent);
if (cores != NULL)
free(cores, M_BHND);
@ -449,7 +451,7 @@ bhndb_pci_detach(device_t dev)
/* Release MSI interrupts */
if (sc->msi_count > 0)
pci_release_msi(dev);
pci_release_msi(sc->parent);
/* Disable PCI bus mastering */
pci_disable_busmaster(sc->parent);