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