Author: jch
Date: Mon Jul 18 08:20:31 2016
New Revision: 302995
URL: https://svnweb.freebsd.org/changeset/base/302995

Log:
  MFC r261242:
  
  Decrease lock contention within the TCP accept case by removing
  the INP_INFO lock from tcp_usr_accept.  As the PR/patch states
  this was following the advice already in the code.
  See the PR below for a full discussion of this change and its
  measured effects.
  
  PR:           183659
  Submitted by: Julien Charbon
  Reviewed by:  jhb

Modified:
  stable/10/sys/netinet/tcp_syncache.c
  stable/10/sys/netinet/tcp_usrreq.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/netinet/tcp_syncache.c
==============================================================================
--- stable/10/sys/netinet/tcp_syncache.c        Mon Jul 18 07:06:44 2016        
(r302994)
+++ stable/10/sys/netinet/tcp_syncache.c        Mon Jul 18 08:20:31 2016        
(r302995)
@@ -683,7 +683,7 @@ syncache_socket(struct syncache *sc, str
         * connection when the SYN arrived.  If we can't create
         * the connection, abort it.
         */
-       so = sonewconn(lso, SS_ISCONNECTED);
+       so = sonewconn(lso, 0);
        if (so == NULL) {
                /*
                 * Drop the connection; we will either send a RST or
@@ -922,6 +922,8 @@ syncache_socket(struct syncache *sc, str
 
        INP_WUNLOCK(inp);
 
+       soisconnected(so);
+
        TCPSTAT_INC(tcps_accepts);
        return (so);
 

Modified: stable/10/sys/netinet/tcp_usrreq.c
==============================================================================
--- stable/10/sys/netinet/tcp_usrreq.c  Mon Jul 18 07:06:44 2016        
(r302994)
+++ stable/10/sys/netinet/tcp_usrreq.c  Mon Jul 18 08:20:31 2016        
(r302995)
@@ -643,13 +643,6 @@ out:
 /*
  * Accept a connection.  Essentially all the work is done at higher levels;
  * just return the address of the peer, storing through addr.
- *
- * The rationale for acquiring the tcbinfo lock here is somewhat complicated,
- * and is described in detail in the commit log entry for r175612.  Acquiring
- * it delays an accept(2) racing with sonewconn(), which inserts the socket
- * before the inpcb address/port fields are initialized.  A better fix would
- * prevent the socket from being placed in the listen queue until all fields
- * are fully initialized.
  */
 static int
 tcp_usr_accept(struct socket *so, struct sockaddr **nam)
@@ -666,7 +659,6 @@ tcp_usr_accept(struct socket *so, struct
 
        inp = sotoinpcb(so);
        KASSERT(inp != NULL, ("tcp_usr_accept: inp == NULL"));
-       INP_INFO_RLOCK(&V_tcbinfo);
        INP_WLOCK(inp);
        if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
                error = ECONNABORTED;
@@ -686,7 +678,6 @@ tcp_usr_accept(struct socket *so, struct
 out:
        TCPDEBUG2(PRU_ACCEPT);
        INP_WUNLOCK(inp);
-       INP_INFO_RUNLOCK(&V_tcbinfo);
        if (error == 0)
                *nam = in_sockaddr(port, &addr);
        return error;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to