svn commit: r244121 - user/andre/tcp_workqueue/sys/kern
Andre Oppermann
andre at FreeBSD.org
Tue Dec 11 13:51:06 UTC 2012
Author: andre
Date: Tue Dec 11 13:51:05 2012
New Revision: 244121
URL: http://svnweb.freebsd.org/changeset/base/244121
Log:
Do not return ECONNABORTED on accept() when a connection has
closed again already if there are more connections waiting.
Instead loop and return the next from the queue.
Modified:
user/andre/tcp_workqueue/sys/kern/uipc_syscalls.c
Modified: user/andre/tcp_workqueue/sys/kern/uipc_syscalls.c
==============================================================================
--- user/andre/tcp_workqueue/sys/kern/uipc_syscalls.c Tue Dec 11 13:03:33 2012 (r244120)
+++ user/andre/tcp_workqueue/sys/kern/uipc_syscalls.c Tue Dec 11 13:51:05 2012 (r244121)
@@ -344,7 +344,7 @@ kern_accept(struct thread *td, int s, st
struct filedesc *fdp;
struct file *headfp, *nfp = NULL;
struct sockaddr *sa = NULL;
- int error;
+ int error, more;
struct socket *head, *so;
int fd;
u_int fflag;
@@ -375,6 +375,7 @@ kern_accept(struct thread *td, int s, st
error = falloc(td, &nfp, &fd, 0);
if (error)
goto done;
+again:
ACCEPT_LOCK();
if ((head->so_state & SS_NBIO) && TAILQ_EMPTY(&head->so_comp)) {
ACCEPT_UNLOCK();
@@ -418,6 +419,7 @@ kern_accept(struct thread *td, int s, st
so->so_head = NULL;
SOCK_UNLOCK(so);
+ more = !TAILQ_EMPTY(&head->so_comp);
ACCEPT_UNLOCK();
/* An extra reference on `nfp' has been held for us by falloc(). */
@@ -445,6 +447,18 @@ kern_accept(struct thread *td, int s, st
*/
if (name)
*namelen = 0;
+
+ /*
+ * If we have more sockets waiting in the accept
+ * queue try the next one. No need to return an
+ * error and do a round-trip to usespace.
+ */
+ if (more) {
+ SOCK_LOCK(so);
+ soclose(so);
+ goto again;
+ }
+
goto noconnection;
}
if (sa == NULL) {
More information about the svn-src-user
mailing list