> >     I've been using kern.maxproc=kern.maxprocfiles=2*32768 for my
> >     tests and that worked successfully.
>
> Ok, so then we don't need to change FreeBSD?

    Well, it would be cool, if an administrator could impose a
    more restrictive limit on the maximum number of open fds
    while still allowing applications to poll large sets of fds.

    For example, the appended patch adds kern.maxfilesperpoll
    which is used in place of the current check in poll().  This
    could be used to fine-tune servers for specific
    configurations more easily.  At the same time, it would get
    rid of the (per the sys_generic.c comment) "bogus" relation
    between fd limits and the limits imposed by poll(2).

    - Sascha                                     Experience IRCG
      http://schumann.cx/                http://schumann.cx/ircg

--- ./conf/param.c~     Sun Jun 17 22:04:18 2001
+++ ./conf/param.c      Sun Jun 17 22:08:25 2001
@@ -69,6 +69,7 @@
 int    maxprocperuid = NPROC-1;                /* maximum # of processes per user */
 int    maxfiles = MAXFILES;                    /* system wide open files limit */
 int    maxfilesperproc = MAXFILES;             /* per-process open files limit */
+int    maxfilesperpoll = MAXFILES;             /* maximum files per poll */
 int    ncallout = 16 + NPROC + MAXFILES;       /* maximum # of timer events */
 int    mbuf_wait = 32;                         /* mbuf sleep time in ticks */
 
--- ./kern/kern_descrip.c~      Sun Jun 17 22:03:29 2001
+++ ./kern/kern_descrip.c       Sun Jun 17 22:05:36 2001
@@ -1454,6 +1454,9 @@
 SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD,
     0, 0, sysctl_kern_file, "S,file", "Entire file table");
 
+SYSCTL_INT(_kern, KERN_MAXFILESPERPOLL, maxfilesperpoll, CTLFLAG_RW, 
+    &maxfilesperpoll, 0, "Maximum files per poll");
+
 SYSCTL_INT(_kern, KERN_MAXFILESPERPROC, maxfilesperproc, CTLFLAG_RW, 
     &maxfilesperproc, 0, "Maximum files allowed open per process");
 
--- ./kern/sys_generic.c~       Sun Jun 17 22:06:12 2001
+++ ./kern/sys_generic.c        Sun Jun 17 22:06:32 2001
@@ -851,14 +851,7 @@
        size_t ni;
 
        nfds = SCARG(uap, nfds);
-       /*
-        * This is kinda bogus.  We have fd limits, but that is not
-        * really related to the size of the pollfd array.  Make sure
-        * we let the process use at least FD_SETSIZE entries and at
-        * least enough for the current limits.  We want to be reasonably
-        * safe, but not overly restrictive.
-        */
-       if (nfds > p->p_rlimit[RLIMIT_NOFILE].rlim_cur && nfds > FD_SETSIZE)
+       if (nfds > maxfilesperpoll)
                return (EINVAL);
        ni = nfds * sizeof(struct pollfd);
        if (ni > sizeof(smallbits))
--- ./sys/file.h~       Sun Jun 17 22:09:53 2001
+++ ./sys/file.h        Sun Jun 17 22:10:18 2001
@@ -106,6 +106,7 @@
 extern struct fileops badfileops;
 extern int maxfiles;           /* kernel limit on number of open files */
 extern int maxfilesperproc;    /* per process limit on number of open files */
+extern int maxfilesperpoll;    /* maximum number of fds per poll */
 extern int nfiles;             /* actual number of open files */
 
 static __inline void fhold __P((struct file *fp));
--- ./sys/sysctl.h~     Sun Jun 17 22:02:18 2001
+++ ./sys/sysctl.h      Sun Jun 17 22:10:37 2001
@@ -329,6 +329,7 @@
 #define        KERN_USRSTACK           33      /* int: address of USRSTACK */
 #define        KERN_LOGSIGEXIT         34      /* int: do we log sigexit procs? */
 #define KERN_MAXID             35      /* number of valid kern ids */
+#define        KERN_MAXFILESPERPOLL    36      /* int: max files per poll */
 
 #define CTL_KERN_NAMES { \
        { 0, 0 }, \
@@ -359,6 +360,7 @@
        { "ntp_pll", CTLTYPE_NODE }, \
        { "bootfile", CTLTYPE_STRING }, \
        { "maxfilesperproc", CTLTYPE_INT }, \
+       { "maxfilesperpoll", CTLTYPE_INT }, \
        { "maxprocperuid", CTLTYPE_INT }, \
        { "dumpdev", CTLTYPE_STRUCT }, /* we lie; don't print as int */ \
        { "ipc", CTLTYPE_NODE }, \

Reply via email to