Date: Tue, 28 Oct 2025 22:36:13 GMT From: Warner Losh <imp@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 83519c1764f8 - main - bus: Take the topolock in driver_module_handler() Message-ID: <202510282236.59SMaDqM008537@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=83519c1764f80ddbdf34e16de08ff110226aba2b commit 83519c1764f80ddbdf34e16de08ff110226aba2b Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2025-10-28 19:48:07 +0000 Commit: Warner Losh <imp@FreeBSD.org> 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); }home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202510282236.59SMaDqM008537>
