The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=b8b5cc330490810fc28621ac16d8147d9c53c276
commit b8b5cc330490810fc28621ac16d8147d9c53c276 Author: John Baldwin <j...@freebsd.org> AuthorDate: 2025-03-10 17:35:21 +0000 Commit: John Baldwin <j...@freebsd.org> CommitDate: 2025-03-10 17:35:21 +0000 new-bus: Use M_WAITOK in more places M_NOWAIT is now only used for devclass_get_devices, devclass_get_drivers, and device_get_children. Other functions are generally called from sleepable contexts such as module event handlers, attach/detach routines, and the ioctl handler for /dev/devctl2. Suggested by: mjg (devclass_add_device) Differential Revision: https://reviews.freebsd.org/D49274 --- sys/kern/subr_bus.c | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 63de61262554..1cbb91634d43 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -575,9 +575,7 @@ devclass_find_internal(const char *classname, const char *parentname, if (create && !dc) { PDEBUG(("creating %s", classname)); dc = malloc(sizeof(struct devclass) + strlen(classname) + 1, - M_BUS, M_NOWAIT | M_ZERO); - if (!dc) - return (NULL); + M_BUS, M_WAITOK | M_ZERO); dc->parent = NULL; dc->name = (char*) (dc + 1); strcpy(dc->name, classname); @@ -711,9 +709,7 @@ devclass_add_driver(devclass_t dc, driver_t *driver, int pass, devclass_t *dcp) if (pass <= BUS_PASS_ROOT) return (EINVAL); - dl = malloc(sizeof *dl, M_BUS, M_NOWAIT|M_ZERO); - if (!dl) - return (ENOMEM); + dl = malloc(sizeof *dl, M_BUS, M_WAITOK|M_ZERO); /* * Compile the driver's methods. Also increase the reference count @@ -1306,9 +1302,7 @@ devclass_add_device(devclass_t dc, device_t dev) buflen = snprintf(NULL, 0, "%s%d$", dc->name, INT_MAX); if (buflen < 0) return (ENOMEM); - dev->nameunit = malloc(buflen, M_BUS, M_NOWAIT|M_ZERO); - if (!dev->nameunit) - return (ENOMEM); + dev->nameunit = malloc(buflen, M_BUS, M_WAITOK|M_ZERO); if ((error = devclass_alloc_unit(dc, dev, &dev->unit)) != 0) { free(dev->nameunit, M_BUS); @@ -1385,10 +1379,7 @@ make_device(device_t parent, const char *name, int unit) dc = NULL; } - dev = malloc(sizeof(*dev), M_BUS, M_NOWAIT|M_ZERO); - if (!dev) - return (NULL); - + dev = malloc(sizeof(*dev), M_BUS, M_WAITOK|M_ZERO); dev->parent = parent; TAILQ_INIT(&dev->children); kobj_init((kobj_t) dev, &null_class); @@ -2116,7 +2107,7 @@ device_set_desc_copy(device_t dev, const char *desc) { char *buf; - buf = strdup_flags(desc, M_BUS, M_NOWAIT); + buf = strdup_flags(desc, M_BUS, M_WAITOK); device_set_desc_internal(dev, buf, true); } @@ -2476,13 +2467,7 @@ device_set_driver(device_t dev, driver_t *driver) else policy = DOMAINSET_RR(); dev->softc = malloc_domainset(driver->size, M_BUS_SC, - policy, M_NOWAIT | M_ZERO); - if (!dev->softc) { - kobj_delete((kobj_t) dev, NULL); - kobj_init((kobj_t) dev, &null_class); - dev->driver = NULL; - return (ENOMEM); - } + policy, M_WAITOK | M_ZERO); } } else { kobj_init((kobj_t) dev, &null_class); @@ -2935,9 +2920,7 @@ resource_list_add(struct resource_list *rl, int type, int rid, rle = resource_list_find(rl, type, rid); if (!rle) { rle = malloc(sizeof(struct resource_list_entry), M_BUS, - M_NOWAIT); - if (!rle) - panic("resource_list_add: can't record entry"); + M_WAITOK); STAILQ_INSERT_TAIL(rl, rle, link); rle->type = type; rle->rid = rid;