diff --git a/sys/kern/kern_mbuf.c b/sys/kern/kern_mbuf.c index f48ec88bbe83..f1e76ef00c65 100644 --- a/sys/kern/kern_mbuf.c +++ b/sys/kern/kern_mbuf.c @@ -223,7 +223,7 @@ sysctl_nmbclusters(SYSCTL_HANDLER_ARGS) return (error); } SYSCTL_PROC(_kern_ipc, OID_AUTO, nmbclusters, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, &nmbclusters, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, &nmbclusters, 0, sysctl_nmbclusters, "IU", "Maximum number of mbuf clusters allowed"); @@ -245,7 +245,7 @@ sysctl_nmbjumbop(SYSCTL_HANDLER_ARGS) return (error); } SYSCTL_PROC(_kern_ipc, OID_AUTO, nmbjumbop, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, &nmbjumbop, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, &nmbjumbop, 0, sysctl_nmbjumbop, "IU", "Maximum number of mbuf page size jumbo clusters allowed"); @@ -267,7 +267,7 @@ sysctl_nmbjumbo9(SYSCTL_HANDLER_ARGS) return (error); } SYSCTL_PROC(_kern_ipc, OID_AUTO, nmbjumbo9, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, &nmbjumbo9, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, &nmbjumbo9, 0, sysctl_nmbjumbo9, "IU", "Maximum number of mbuf 9k jumbo clusters allowed"); @@ -289,7 +289,7 @@ sysctl_nmbjumbo16(SYSCTL_HANDLER_ARGS) return (error); } SYSCTL_PROC(_kern_ipc, OID_AUTO, nmbjumbo16, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, &nmbjumbo16, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, &nmbjumbo16, 0, sysctl_nmbjumbo16, "IU", "Maximum number of mbuf 16k jumbo clusters allowed"); @@ -311,7 +311,7 @@ sysctl_nmbufs(SYSCTL_HANDLER_ARGS) return (error); } SYSCTL_PROC(_kern_ipc, OID_AUTO, nmbufs, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, &nmbufs, 0, sysctl_nmbufs, "IU", "Maximum number of mbufs allowed"); diff --git a/sys/kern/kern_switch.c b/sys/kern/kern_switch.c index d8b735ccda7c..aec3b3d10e04 100644 --- a/sys/kern/kern_switch.c +++ b/sys/kern/kern_switch.c @@ -143,7 +143,7 @@ sysctl_stats_reset(SYSCTL_HANDLER_ARGS) } SYSCTL_PROC(_kern_sched_stats, OID_AUTO, reset, - CTLTYPE_INT | CTLFLAG_WR | CTLFLAG_NEEDGIANT, NULL, 0, + CTLTYPE_INT | CTLFLAG_WR | CTLFLAG_MPSAFE, NULL, 0, sysctl_stats_reset, "I", "Reset scheduler statistics"); #endif diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index a5d0fc773787..8b0b2de47cf5 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -245,7 +245,7 @@ devclass_sysctl_init(devclass_t dc) CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, ""); SYSCTL_ADD_PROC(&dc->sysctl_ctx, SYSCTL_CHILDREN(dc->sysctl_tree), OID_AUTO, "%parent", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, dc, DEVCLASS_SYSCTL_PARENT, devclass_sysctl_handler, "A", "parent class"); } diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index 1e62de4aef7f..42c94ae4a355 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -2128,16 +2129,6 @@ struct mbufprofile { uintmax_t segments[MP_BUCKETS]; } mbprof; -#define MP_MAXDIGITS 21 /* strlen("16,000,000,000,000,000,000") == 21 */ -#define MP_NUMLINES 6 -#define MP_NUMSPERLINE 16 -#define MP_EXTRABYTES 64 /* > strlen("used:\nwasted:\nsegments:\n") */ -/* work out max space needed and add a bit of spare space too */ -#define MP_MAXLINE ((MP_MAXDIGITS+1) * MP_NUMSPERLINE) -#define MP_BUFSIZE ((MP_MAXLINE * MP_NUMLINES) + 1 + MP_EXTRABYTES) - -char mbprofbuf[MP_BUFSIZE]; - void m_profile(struct mbuf *m) { @@ -2173,16 +2164,18 @@ m_profile(struct mbuf *m) mbprof.wasted[fls(wasted)]++; } -static void -mbprof_textify(void) +static int +mbprof_handler(SYSCTL_HANDLER_ARGS) { - int offset; - char *c; + char buf[256]; + struct sbuf sb; + int error; uint64_t *p; + sbuf_new_for_sysctl(&sb, buf, sizeof(buf), req); + p = &mbprof.wasted[0]; - c = mbprofbuf; - offset = snprintf(c, MP_MAXLINE + 10, + sbuf_printf(&sb, "wasted:\n" "%ju %ju %ju %ju %ju %ju %ju %ju " "%ju %ju %ju %ju %ju %ju %ju %ju\n", @@ -2190,16 +2183,14 @@ mbprof_textify(void) p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); #ifdef BIG_ARRAY p = &mbprof.wasted[16]; - c += offset; - offset = snprintf(c, MP_MAXLINE, + sbuf_printf(&sb, "%ju %ju %ju %ju %ju %ju %ju %ju " "%ju %ju %ju %ju %ju %ju %ju %ju\n", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); #endif p = &mbprof.used[0]; - c += offset; - offset = snprintf(c, MP_MAXLINE + 10, + sbuf_printf(&sb, "used:\n" "%ju %ju %ju %ju %ju %ju %ju %ju " "%ju %ju %ju %ju %ju %ju %ju %ju\n", @@ -2207,16 +2198,14 @@ mbprof_textify(void) p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); #ifdef BIG_ARRAY p = &mbprof.used[16]; - c += offset; - offset = snprintf(c, MP_MAXLINE, + sbuf_printf(&sb, "%ju %ju %ju %ju %ju %ju %ju %ju " "%ju %ju %ju %ju %ju %ju %ju %ju\n", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); #endif p = &mbprof.segments[0]; - c += offset; - offset = snprintf(c, MP_MAXLINE + 10, + sbuf_printf(&sb, "segments:\n" "%ju %ju %ju %ju %ju %ju %ju %ju " "%ju %ju %ju %ju %ju %ju %ju %ju\n", @@ -2224,22 +2213,15 @@ mbprof_textify(void) p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); #ifdef BIG_ARRAY p = &mbprof.segments[16]; - c += offset; - offset = snprintf(c, MP_MAXLINE, + sbuf_printf(&sb, "%ju %ju %ju %ju %ju %ju %ju %ju " "%ju %ju %ju %ju %ju %ju %ju %jju", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); #endif -} -static int -mbprof_handler(SYSCTL_HANDLER_ARGS) -{ - int error; - - mbprof_textify(); - error = SYSCTL_OUT(req, mbprofbuf, strlen(mbprofbuf) + 1); + error = sbuf_finish(&sb); + sbuf_delete(&sb); return (error); } @@ -2261,12 +2243,12 @@ mbprof_clr_handler(SYSCTL_HANDLER_ARGS) } SYSCTL_PROC(_kern_ipc, OID_AUTO, mbufprofile, - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, NULL, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, mbprof_handler, "A", "mbuf profiling statistics"); SYSCTL_PROC(_kern_ipc, OID_AUTO, mbufprofileclr, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, NULL, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, 0, mbprof_clr_handler, "I", "clear mbuf profiling statistics"); #endif