From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Baron Subject: Re: disappearing listen()ed SO_REUSEPORT sockets across fork() when using epoll Date: Mon, 25 Nov 2013 13:05:05 -0500 Message-ID: <52939151.8030908@akamai.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Tom Herbert To: Shawn Landden Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org On 11/22/2013 12:53 PM, Shawn Landden wrote: > Hello, when running the attached program on 3.12 child processes > are missing a socket fd opened, set with SO_REUSEPORT, listen()ed to, > and added to epoll_ctl(). > > This is the output I get when pointing "wget http://localhost:5555/" > at the attached program: > > main PID 31591 > PID 31634 started > PID 31634 accept()ed connection > PID 31635 started > PID 31636 started > PID 31635 accept() failed: Bad file descriptor > PID 31636 accept() failed: Bad file descriptor > PID 31634 accept()ed connection > PID 31634 accept()ed connection > PID 31634 accept()ed connection > PID 31634 accept()ed connection > > > While I would expect something like: > > main PID 31591 > PID 31634 started > PID 31634 accept()ed connection > PID 31635 started > PID 31636 started > PID 31635 accept()ed connection > PID 31636 accept()ed connection > > -more new processes, but inversely proportional to number of listening processes > -accept() always returns successfully > > The 'close(sockfd);' looks to be racing with the accept() calls. Removing seems to get the result you are looking for. Thanks, -Jason