> On Feb 5, 2019, at 12:56 PM, Iain Barker <iain.bar...@oracle.com> wrote:
> 
> Hi everyone,
> 
> We just updated our application from DPDK 17.11.4 (LTS) to DPDK 18.11 (LTS) 
> and we noticed a regression.
> 
> Our host platform is providing 2MB huge pages, so for 8GB reservation this 
> means 4000 pages are allocated.
> 
> This worked fine in the prior LTS, but after upgrading DPDK what we are 
> seeing is that select() on an fd is failing.
> 
> select() works fine when the process starts up, but does not work after DPDK 
> has been initialized.
> 
> We did some investigation and found in the DPDK patches linked below, the 
> hugepage tracking mechanism was changed from mmap to an array of file 
> descriptors, and the rlimit for fd's is raised from the default to allow more 
> fd's to be open.
> 
> https://mails.dpdk.org/archives/dev/2018-September/110890.html
> https://mails.dpdk.org/archives/dev/2018-September/110889.html
> 
> The problem is that the GNU C library (glibc) has a limit for the maximum fd 
> passed to select(), and is hard-coded in the POSIX header file and libc at 
> 1024 (and probably many other OS libraries too as a result).
> 
> Raising the rlimit for fd >1024 has undefined results, per the manpage:
> 
> http://man7.org/linux/man-pages/man2/select.2.html
> An fd_set is a fixed size buffer.  Executing FD_CLR() or FD_SET()
> with a value of fd that is negative or is equal to or larger than
> FD_SETSIZE will result in undefined behavior.  Moreover, POSIX
> requires fd to be a valid file descriptor.
> 
> The Linux kernel allows file descriptor sets of arbitrary size,
> determining the length of the sets to be checked from the value of
> nfds.  However, in the glibc implementation, the fd_set type is fixed
> in size.
> 
> Specifically, libc's header include/sys/select.h has an array of fd's which 
> is FD_SETSIZE deep.
> __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
> 
> and usr/include/linux/posix_types.h is hard-coded with
> #define __FD_SETSIZE  1024
> 
> As this define and array are in libc, they are used in many libraries on a 
> Linux system. So to use setsize >1024 means recompiling OS libraries and any 
> other package that needs to use FDs, or ensuring that no library used by the 
> application ever calls select() on an fd set. That seems an unreasonable 
> burden...
> 
> Any thoughts?

Would poll work here instead?
> 
> thanks,
> Iain

Regards,
Keith

Reply via email to