summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_descrip.c
diff options
context:
space:
mode:
authorsobomax <sobomax@FreeBSD.org>2008-03-16 06:21:30 +0000
committersobomax <sobomax@FreeBSD.org>2008-03-16 06:21:30 +0000
commit1560402d31fc795d7c3f43a5af671bc3a1c5993b (patch)
treeabb94b15894e30e305aecbb46933267e61066559 /sys/kern/kern_descrip.c
parent3da38e35b432b5fa7610547f1a01f367bdae5dbf (diff)
downloadFreeBSD-src-1560402d31fc795d7c3f43a5af671bc3a1c5993b.zip
FreeBSD-src-1560402d31fc795d7c3f43a5af671bc3a1c5993b.tar.gz
Properly set size of the file_zone to match kern.maxfiles parameter.
Otherwise the parameter is no-op, since zone by default limits number of descriptors to some 12K entries. Attempt to allocate more ends up sleeping on zonelimit. MFC after: 2 weeks
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r--sys/kern/kern_descrip.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 5174c15..683da72 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -2801,8 +2801,38 @@ DB_SHOW_COMMAND(files, db_show_files)
SYSCTL_INT(_kern, KERN_MAXFILESPERPROC, maxfilesperproc, CTLFLAG_RW,
&maxfilesperproc, 0, "Maximum files allowed open per process");
-SYSCTL_INT(_kern, KERN_MAXFILES, maxfiles, CTLFLAG_RW,
- &maxfiles, 0, "Maximum number of files");
+/*
+ * User has changed the maximum number of files.
+ * This may require us to change size of the zone.
+ */
+static int
+sysctl_kern_maxfiles(SYSCTL_HANDLER_ARGS)
+{
+ int error;
+ int new_maxfiles;
+
+ new_maxfiles = maxfiles;
+ error = sysctl_handle_int(oidp, &new_maxfiles, sizeof(int), req);
+ if (error != 0 || req->newptr == NULL)
+ return (error);
+ if (new_maxfiles <= 0) {
+ return (EINVAL);
+ }
+ maxfiles = new_maxfiles;
+ EVENTHANDLER_INVOKE(maxfiles_change);
+ return (0);
+}
+
+static void
+file_zone_change(void *tag)
+{
+
+ uma_zone_set_max(file_zone, maxfiles);
+}
+
+SYSCTL_PROC(_kern, OID_AUTO, maxfiles, CTLTYPE_INT|CTLFLAG_RW,
+ __DEVOLATILE(int *, &maxfiles), 0, sysctl_kern_maxfiles, "IU",
+ "Maximum number of files");
SYSCTL_INT(_kern, OID_AUTO, openfiles, CTLFLAG_RD,
__DEVOLATILE(int *, &openfiles), 0, "System-wide number of open files");
@@ -2814,10 +2844,13 @@ filelistinit(void *dummy)
file_zone = uma_zcreate("Files", sizeof(struct file), NULL, NULL,
NULL, NULL, UMA_ALIGN_PTR, 0);
+ uma_zone_set_max(file_zone, maxfiles);
+ EVENTHANDLER_REGISTER(maxfiles_change, file_zone_change, NULL,
+ EVENTHANDLER_PRI_FIRST);
mtx_init(&sigio_lock, "sigio lock", NULL, MTX_DEF);
mtx_init(&fdesc_mtx, "fdesc", NULL, MTX_DEF);
}
-SYSINIT(select, SI_SUB_LOCK, SI_ORDER_FIRST, filelistinit, NULL)
+SYSINIT(select, SI_SUB_EVENTHANDLER+1, SI_ORDER_MIDDLE, filelistinit, NULL)
/*-------------------------------------------------------------------*/
OpenPOWER on IntegriCloud