Subject: Re: poll(2) oddity
To: <>
From: David Laight <david@l8s.co.uk>
List: tech-userlevel
Date: 07/08/2002 13:40:49
> > > Readable and doesn't waste kernel memory.
> > Just user space code bloat....
>
> No - during the poll, kernel allocates memory for array to hold
> all the poll structs userland has passed via poll(2) call. Also,
> the bigger the array the more time is spent copying structs from
> userland to kernel, especially if you watch many descriptors and
> call poll(2) frequently.
You will find that the cost of that code section is irrelevant
provided the supplied array isn't stupidly spare.
It is even possible that a copyin() loop is faster that the malloc()
case for calls with nfds > 32 until you get to VERY large numbers
(where the fact that you have to read the array twice becomes
relevant). But I don't want to do that benchmark!
> > The SuS says that EINVAL should be returned if the 'nfds' argument
> > is greater than OPEN_MAX.
>
> OPEN_MAX is fixed @ 64 (see <sys/syslimits.h>)
RTFM, it is a 'variable' constant and the run time value can
be different from the compile time one.
sysconf( _SC_OPEN_MAX ) could even return -1 implying that there
is no appropriate limit. After all setrlimit() could increase
it indefinitely.
> > (There should be a check in setrlimit to ensure that
> > p->p_rlimit[RLIMIT_NOFILE].rlim_cur > p->p_fd->fd_lastfile)
>
> I don't think so. There isn't anything wrong in setting NOFILE
> to lower value than current use; that would just prevent to open
> any new files until some descriptors are closed.
Erm, both netbsd and the SuS have:
The setrlimit() function may fail if:
[EINVAL] The limit specified to setrlimit() cannot be lowered, be-
cause current usage is already higher than the limit.
This would be useful because it would let a program determine
a (sensible) upper bound for the highest open fd.
This is a number that certain processes need to know (eg in order
to close all high numbered fds) but is impossible to determine.
Typically rlimit(NO_FILES) is used - causing a lot of failed close()
calls if it is set very high.
Given that some programs close all high numbered fds, I'm sure
there is a lurking security issue if you set rlimit(NO_FILES)
to below one of their open files - since it won't get closed.
OTOH I haven't spotted anything useful (yet).
David
--
David Laight: david@l8s.co.uk