Author: glebius
Date: Wed Oct  9 12:00:38 2013
New Revision: 256186
URL: http://svnweb.freebsd.org/changeset/base/256186

Log:
  When processing ACK in tcp_do_segment, use sbcut_locked() instead of
  sbdrop_locked() to cut acked mbufs from the socket buffer. Free this
  chain a batch manner after the socket buffer lock is dropped.
  
  This measurably reduces contention on socket buffer.
  
  Sponsored by: Netflix
  Sponsored by: Nginx, Inc.
  Approved by:  re (marius)

Modified:
  head/sys/netinet/tcp_input.c

Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c        Wed Oct  9 11:57:53 2013        
(r256185)
+++ head/sys/netinet/tcp_input.c        Wed Oct  9 12:00:38 2013        
(r256186)
@@ -1461,6 +1461,7 @@ tcp_do_segment(struct mbuf *m, struct tc
        u_long tiwin;
        char *s;
        struct in_conninfo *inc;
+       struct mbuf *mfree;
        struct tcpopt to;
 
 #ifdef TCPDEBUG
@@ -2718,15 +2719,17 @@ process_ACK:
                SOCKBUF_LOCK(&so->so_snd);
                if (acked > so->so_snd.sb_cc) {
                        tp->snd_wnd -= so->so_snd.sb_cc;
-                       sbdrop_locked(&so->so_snd, (int)so->so_snd.sb_cc);
+                       mfree = sbcut_locked(&so->so_snd,
+                           (int)so->so_snd.sb_cc);
                        ourfinisacked = 1;
                } else {
-                       sbdrop_locked(&so->so_snd, acked);
+                       mfree = sbcut_locked(&so->so_snd, acked);
                        tp->snd_wnd -= acked;
                        ourfinisacked = 0;
                }
                /* NB: sowwakeup_locked() does an implicit unlock. */
                sowwakeup_locked(so);
+               m_freem(mfree);
                /* Detect una wraparound. */
                if (!IN_RECOVERY(tp->t_flags) &&
                    SEQ_GT(tp->snd_una, tp->snd_recover) &&
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to