git: f3d3c63442ff - main - newbus: Simplify reallocation of devices array
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 01 Nov 2024 17:55:48 UTC
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=f3d3c63442fff813d4941e0c73b7260834642422 commit f3d3c63442fff813d4941e0c73b7260834642422 Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2024-10-31 22:50:42 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2024-11-01 17:56:20 +0000 newbus: Simplify reallocation of devices array Simplify the complex expression down to what it is on 64-bit systems. 32-bit kernels would allocate 2 at a time. Replace all that with reallocf which will eliminate a bunch of copies. This should be faster and simpler on both types of kernels. In addition, transition to M_WAITOK since this is a sleepable context. Suggested by: jhb Sponsored by: Netflix Reviewed by: jhb Differential Revision: https://reviews.freebsd.org/D47362 --- sys/kern/subr_bus.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 8fec2b3de139..cd5f97cc72fe 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -1229,28 +1229,18 @@ devclass_alloc_unit(devclass_t dc, device_t dev, int *unitp) } /* - * We've selected a unit beyond the length of the table, so let's - * extend the table to make room for all units up to and including - * this one. + * We've selected a unit beyond the length of the table, so let's extend + * the table to make room for all units up to and including this one. */ if (unit >= dc->maxunit) { - device_t *newlist, *oldlist; int newsize; - oldlist = dc->devices; - newsize = roundup((unit + 1), - MAX(1, MINALLOCSIZE / sizeof(device_t))); - newlist = malloc(sizeof(device_t) * newsize, M_BUS, M_NOWAIT); - if (!newlist) - return (ENOMEM); - if (oldlist != NULL) - bcopy(oldlist, newlist, sizeof(device_t) * dc->maxunit); - bzero(newlist + dc->maxunit, + newsize = unit + 1; + dc->devices = reallocf(dc->devices, + newsize * sizeof(*dc->devices), M_BUS, M_WAITOK); + memset(dc->devices + dc->maxunit, 0, sizeof(device_t) * (newsize - dc->maxunit)); - dc->devices = newlist; dc->maxunit = newsize; - if (oldlist != NULL) - free(oldlist, M_BUS); } PDEBUG(("now: unit %d in devclass %s", unit, DEVCLANAME(dc)));