git: 815a0973b23c - main - bus: mark sysctls MPSAFE
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 10 Dec 2021 00:05:11 UTC
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=815a0973b23cf97e3e6c2d8bd34d98d54e318873 commit 815a0973b23cf97e3e6c2d8bd34d98d54e318873 Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2021-12-09 23:52:34 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2021-12-10 00:04:57 +0000 bus: mark sysctls MPSAFE Mark the sysctls MPSAFE and pickup the bus topo lock while processing them. Sponsored by: Netflix Reviewed by: mav, jhb Differential Revision: https://reviews.freebsd.org/D31832 --- sys/kern/subr_bus.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 008cec6b5417..2544826e9028 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -267,6 +267,7 @@ device_sysctl_handler(SYSCTL_HANDLER_ARGS) sbuf_new_for_sysctl(&sb, NULL, 1024, req); sbuf_clear_flags(&sb, SBUF_INCLUDENUL); + bus_topo_lock(); switch (arg2) { case DEVICE_SYSCTL_DESC: sbuf_cat(&sb, dev->desc ? dev->desc : ""); @@ -284,10 +285,12 @@ device_sysctl_handler(SYSCTL_HANDLER_ARGS) sbuf_cat(&sb, dev->parent ? dev->parent->nameunit : ""); break; default: - sbuf_delete(&sb); - return (EINVAL); + error = EINVAL; + goto out; } error = sbuf_finish(&sb); +out: + bus_topo_unlock(); sbuf_delete(&sb); return (error); } @@ -307,33 +310,33 @@ device_sysctl_init(device_t dev) dev->nameunit + strlen(dc->name), CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "", "device_index"); SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), - OID_AUTO, "%desc", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, + OID_AUTO, "%desc", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, dev, DEVICE_SYSCTL_DESC, device_sysctl_handler, "A", "device description"); SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%driver", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, dev, DEVICE_SYSCTL_DRIVER, device_sysctl_handler, "A", "device driver name"); SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%location", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, dev, DEVICE_SYSCTL_LOCATION, device_sysctl_handler, "A", "device location relative to parent"); SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%pnpinfo", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, dev, DEVICE_SYSCTL_PNPINFO, device_sysctl_handler, "A", "device identification"); SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%parent", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, dev, DEVICE_SYSCTL_PARENT, device_sysctl_handler, "A", "parent device"); if (bus_get_domain(dev, &domain) == 0) SYSCTL_ADD_INT(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%domain", - CTLFLAG_RD, NULL, domain, "NUMA domain"); + CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, domain, "NUMA domain"); } static void