diff options
author | ps <ps@FreeBSD.org> | 2006-04-21 09:25:40 +0000 |
---|---|---|
committer | ps <ps@FreeBSD.org> | 2006-04-21 09:25:40 +0000 |
commit | 10b2fe8deaf19b4c81cb9088e607c6b818b49a2b (patch) | |
tree | 104c2b8ecefe4f49f0608012d591ed6bc153383e /sys/kern | |
parent | 71dd15704489306788703f67dac59f4814c34efe (diff) | |
download | FreeBSD-src-10b2fe8deaf19b4c81cb9088e607c6b818b49a2b.zip FreeBSD-src-10b2fe8deaf19b4c81cb9088e607c6b818b49a2b.tar.gz |
Allow for nmbclusters and maxsockets to be increased via sysctl.
An eventhandler is used to update all the various zones that depend
on these values.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_mbuf.c | 20 | ||||
-rw-r--r-- | sys/kern/uipc_domain.c | 10 | ||||
-rw-r--r-- | sys/kern/uipc_sockbuf.c | 26 | ||||
-rw-r--r-- | sys/kern/uipc_socket2.c | 26 | ||||
-rw-r--r-- | sys/kern/uipc_usrreq.c | 12 |
5 files changed, 88 insertions, 6 deletions
diff --git a/sys/kern/kern_mbuf.c b/sys/kern/kern_mbuf.c index 84682de..7f39bd8 100644 --- a/sys/kern/kern_mbuf.c +++ b/sys/kern/kern_mbuf.c @@ -112,7 +112,25 @@ SYSINIT(tunable_mbinit, SI_SUB_TUNABLES, SI_ORDER_ANY, tunable_mbinit, NULL); SYSCTL_DECL(_kern_ipc); /* XXX: These should be tuneables. Can't change UMA limits on the fly. */ -SYSCTL_INT(_kern_ipc, OID_AUTO, nmbclusters, CTLFLAG_RW, &nmbclusters, 0, +static int +sysctl_nmbclusters(SYSCTL_HANDLER_ARGS) +{ + int error, newnmbclusters; + + newnmbclusters = nmbclusters; + error = sysctl_handle_int(oidp, &newnmbclusters, sizeof(int), req); + if (error == 0 && req->newptr) { + if (newnmbclusters > nmbclusters) { + nmbclusters = newnmbclusters; + uma_zone_set_max(zone_clust, nmbclusters); + EVENTHANDLER_INVOKE(nmbclusters_change); + } else + error = EINVAL; + } + return (error); +} +SYSCTL_PROC(_kern_ipc, OID_AUTO, nmbclusters, CTLTYPE_INT|CTLFLAG_RW, +&nmbclusters, 0, sysctl_nmbclusters, "IU", "Maximum number of mbuf clusters allowed"); SYSCTL_INT(_kern_ipc, OID_AUTO, nmbjumbop, CTLFLAG_RW, &nmbjumbop, 0, "Maximum number of mbuf page size jumbo clusters allowed"); diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c index 7a26ff5..6adb336 100644 --- a/sys/kern/uipc_domain.c +++ b/sys/kern/uipc_domain.c @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include <sys/socket.h> #include <sys/protosw.h> #include <sys/domain.h> +#include <sys/eventhandler.h> #include <sys/mbuf.h> #include <sys/kernel.h> #include <sys/lock.h> @@ -189,6 +190,13 @@ net_add_domain(void *data) net_init_domain(dp); } +static void +socket_zone_change(void *tag) +{ + + uma_zone_set_max(socket_zone, maxsockets); +} + /* ARGSUSED*/ static void domaininit(void *dummy) @@ -201,6 +209,8 @@ domaininit(void *dummy) socket_zone = uma_zcreate("socket", sizeof(struct socket), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); uma_zone_set_max(socket_zone, maxsockets); + EVENTHANDLER_REGISTER(maxsockets_change, socket_zone_change, NULL, + EVENTHANDLER_PRI_FIRST); if (max_linkhdr < 16) /* XXX */ max_linkhdr = 16; diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c index 4afe8c5..b18ff4a 100644 --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include <sys/aio.h> /* for aio_swake proto */ #include <sys/domain.h> #include <sys/event.h> +#include <sys/eventhandler.h> #include <sys/file.h> /* for maxfiles */ #include <sys/kernel.h> #include <sys/lock.h> @@ -1508,8 +1509,29 @@ static int dummy; SYSCTL_INT(_kern, KERN_DUMMY, dummy, CTLFLAG_RW, &dummy, 0, ""); SYSCTL_OID(_kern_ipc, KIPC_MAXSOCKBUF, maxsockbuf, CTLTYPE_ULONG|CTLFLAG_RW, &sb_max, 0, sysctl_handle_sb_max, "LU", "Maximum socket buffer size"); -SYSCTL_INT(_kern_ipc, OID_AUTO, maxsockets, CTLFLAG_RDTUN, - &maxsockets, 0, "Maximum number of sockets avaliable"); +static int +sysctl_maxsockets(SYSCTL_HANDLER_ARGS) +{ + int error, newmaxsockets; + + newmaxsockets = maxsockets; + error = sysctl_handle_int(oidp, &newmaxsockets, sizeof(int), req); + if (error == 0 && req->newptr) { + if (newmaxsockets > maxsockets) { + maxsockets = newmaxsockets; + if (maxsockets > ((maxfiles / 4) * 3)) { + maxfiles = (maxsockets * 5) / 4; + maxfilesperproc = (maxfiles * 9) / 10; + } + EVENTHANDLER_INVOKE(maxsockets_change); + } else + error = EINVAL; + } + return (error); +} +SYSCTL_PROC(_kern_ipc, OID_AUTO, maxsockets, CTLTYPE_INT|CTLFLAG_RW, + &maxsockets, 0, sysctl_maxsockets, "IU", + "Maximum number of sockets avaliable"); SYSCTL_ULONG(_kern_ipc, KIPC_SOCKBUF_WASTE, sockbuf_waste_factor, CTLFLAG_RW, &sb_efficiency, 0, ""); diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index 4afe8c5..b18ff4a 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include <sys/aio.h> /* for aio_swake proto */ #include <sys/domain.h> #include <sys/event.h> +#include <sys/eventhandler.h> #include <sys/file.h> /* for maxfiles */ #include <sys/kernel.h> #include <sys/lock.h> @@ -1508,8 +1509,29 @@ static int dummy; SYSCTL_INT(_kern, KERN_DUMMY, dummy, CTLFLAG_RW, &dummy, 0, ""); SYSCTL_OID(_kern_ipc, KIPC_MAXSOCKBUF, maxsockbuf, CTLTYPE_ULONG|CTLFLAG_RW, &sb_max, 0, sysctl_handle_sb_max, "LU", "Maximum socket buffer size"); -SYSCTL_INT(_kern_ipc, OID_AUTO, maxsockets, CTLFLAG_RDTUN, - &maxsockets, 0, "Maximum number of sockets avaliable"); +static int +sysctl_maxsockets(SYSCTL_HANDLER_ARGS) +{ + int error, newmaxsockets; + + newmaxsockets = maxsockets; + error = sysctl_handle_int(oidp, &newmaxsockets, sizeof(int), req); + if (error == 0 && req->newptr) { + if (newmaxsockets > maxsockets) { + maxsockets = newmaxsockets; + if (maxsockets > ((maxfiles / 4) * 3)) { + maxfiles = (maxsockets * 5) / 4; + maxfilesperproc = (maxfiles * 9) / 10; + } + EVENTHANDLER_INVOKE(maxsockets_change); + } else + error = EINVAL; + } + return (error); +} +SYSCTL_PROC(_kern_ipc, OID_AUTO, maxsockets, CTLTYPE_INT|CTLFLAG_RW, + &maxsockets, 0, sysctl_maxsockets, "IU", + "Maximum number of sockets avaliable"); SYSCTL_ULONG(_kern_ipc, KIPC_SOCKBUF_WASTE, sockbuf_waste_factor, CTLFLAG_RW, &sb_efficiency, 0, ""); diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 956013a..ee7bcc0 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include <sys/domain.h> #include <sys/fcntl.h> #include <sys/malloc.h> /* XXX must be before <sys/file.h> */ +#include <sys/eventhandler.h> #include <sys/file.h> #include <sys/filedesc.h> #include <sys/jail.h> @@ -1325,6 +1326,13 @@ next: return (error); } +static void +unp_zone_change(void *tag) +{ + + uma_zone_set_max(unp_zone, maxsockets); +} + void unp_init(void) { @@ -1332,7 +1340,9 @@ unp_init(void) NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); if (unp_zone == NULL) panic("unp_init"); - uma_zone_set_max(unp_zone, nmbclusters); + uma_zone_set_max(unp_zone, maxsockets); + EVENTHANDLER_REGISTER(maxsockets_change, unp_zone_change, + NULL, EVENTHANDLER_PRI_ANY); LIST_INIT(&unp_dhead); LIST_INIT(&unp_shead); TASK_INIT(&unp_gc_task, 0, unp_gc, NULL); |