Author: np
Date: Sat Jun  6 18:31:28 2015
New Revision: 284092
URL: https://svnweb.freebsd.org/changeset/base/284092

Log:
  MFC r280878:
  
  cxgbe/tom: return rx credits promptly if the socket buffer's low water
  mark cannot be reached because the window advertised to the peer isn't
  wide enough.  While here, tweak the normal credit return too.

Modified:
  stable/10/sys/dev/cxgbe/tom/t4_cpl_io.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/cxgbe/tom/t4_cpl_io.c
==============================================================================
--- stable/10/sys/dev/cxgbe/tom/t4_cpl_io.c     Sat Jun  6 18:21:16 2015        
(r284091)
+++ stable/10/sys/dev/cxgbe/tom/t4_cpl_io.c     Sat Jun  6 18:31:28 2015        
(r284092)
@@ -390,19 +390,17 @@ t4_rcvd(struct toedev *tod, struct tcpcb
                toep->rx_credits += toep->sb_cc - sb->sb_cc;
                toep->sb_cc = sb->sb_cc;
        }
-       credits = toep->rx_credits;
-       SOCKBUF_UNLOCK(sb);
-
-       if (credits > 0 &&
-           (credits + 16384 >= tp->rcv_wnd || credits >= 15 * 1024)) {
+       if (toep->rx_credits > 0 &&
+           (tp->rcv_wnd <= 32 * 1024 || toep->rx_credits >= 64 * 1024 ||
+           (toep->rx_credits >= 16 * 1024 && tp->rcv_wnd <= 128 * 1024) ||
+           toep->sb_cc + tp->rcv_wnd < sb->sb_lowat)) {
 
-               credits = send_rx_credits(sc, toep, credits);
-               SOCKBUF_LOCK(sb);
+               credits = send_rx_credits(sc, toep, toep->rx_credits);
                toep->rx_credits -= credits;
-               SOCKBUF_UNLOCK(sb);
                tp->rcv_wnd += credits;
                tp->rcv_adv += credits;
        }
+       SOCKBUF_UNLOCK(sb);
 }
 
 /*
@@ -1618,6 +1616,14 @@ do_rx_data(struct sge_iq *iq, const stru
        toep->rx_credits += toep->sb_cc - sb->sb_cc;
        sbappendstream_locked(sb, m);
        toep->sb_cc = sb->sb_cc;
+       if (toep->rx_credits > 0 && toep->sb_cc + tp->rcv_wnd < sb->sb_lowat) {
+               int credits;
+
+               credits = send_rx_credits(sc, toep, toep->rx_credits);
+               toep->rx_credits -= credits;
+               tp->rcv_wnd += credits;
+               tp->rcv_adv += credits;
+       }
        sorwakeup_locked(so);
        SOCKBUF_UNLOCK_ASSERT(sb);
 
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to