The branch main has been updated by imp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=83519c1764f80ddbdf34e16de08ff110226aba2b

commit 83519c1764f80ddbdf34e16de08ff110226aba2b
Author:     Warner Losh <[email protected]>
AuthorDate: 2025-10-28 19:48:07 +0000
Commit:     Warner Losh <[email protected]>
CommitDate: 2025-10-28 22:35:32 +0000

    bus: Take the topolock in driver_module_handler()
    
    And sprinkler some asserts. Right now all module handlers are called
    with Giant, but I'd like to drop that so push the newbus locking one
    step further.
    
    Sponsored by:           Netflix
---
 sys/kern/subr_bus.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index bf5bda7e058d..d57886bca5e4 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -572,6 +572,8 @@ devclass_find_internal(const char *classname, const char 
*parentname,
 {
        devclass_t dc;
 
+       bus_topo_assert();
+
        PDEBUG(("looking for %s", classname));
        if (!classname)
                return (NULL);
@@ -712,6 +714,8 @@ devclass_add_driver(devclass_t dc, driver_t *driver, int 
pass, devclass_t *dcp)
        devclass_t child_dc;
        const char *parentname;
 
+       bus_topo_assert();
+
        PDEBUG(("%s", DRIVERNAME(driver)));
 
        /* Don't allow invalid pass values. */
@@ -784,6 +788,8 @@ devclass_driver_deleted(devclass_t busclass, devclass_t dc, 
driver_t *driver)
        device_t dev;
        int error, i;
 
+       bus_topo_assert();
+
        /*
         * Disassociate from any devices.  We iterate through all the
         * devices in the devclass of the driver and detach any which are
@@ -856,6 +862,8 @@ devclass_delete_driver(devclass_t busclass, driver_t 
*driver)
        driverlink_t dl;
        int error;
 
+       bus_topo_assert();
+
        PDEBUG(("%s from devclass %s", driver->name, DEVCLANAME(busclass)));
 
        if (!dc)
@@ -913,6 +921,8 @@ devclass_quiesce_driver(devclass_t busclass, driver_t 
*driver)
        int i;
        int error;
 
+       bus_topo_assert();
+
        PDEBUG(("%s from devclass %s", driver->name, DEVCLANAME(busclass)));
 
        if (!dc)
@@ -964,6 +974,8 @@ devclass_find_driver_internal(devclass_t dc, const char 
*classname)
 {
        driverlink_t dl;
 
+       bus_topo_assert();
+
        PDEBUG(("%s in devclass %s", classname, DEVCLANAME(dc)));
 
        TAILQ_FOREACH(dl, &dc->drivers, link) {
@@ -5255,6 +5267,8 @@ driver_module_handler(module_t mod, int what, void *arg)
        kobj_class_t driver;
        int error, pass;
 
+       bus_topo_lock();
+
        dmd = (struct driver_module_data *)arg;
        bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL, TRUE);
        error = 0;
@@ -5297,6 +5311,8 @@ driver_module_handler(module_t mod, int what, void *arg)
                break;
        }
 
+       bus_topo_unlock();
+
        return (error);
 }
 

Reply via email to