Author: np
Date: Tue Mar 31 01:22:20 2015
New Revision: 280878
URL: https://svnweb.freebsd.org/changeset/base/280878

Log:
  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.
  
  MFC after:    1 month

Modified:
  head/sys/dev/cxgbe/tom/t4_cpl_io.c

Modified: head/sys/dev/cxgbe/tom/t4_cpl_io.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_cpl_io.c  Tue Mar 31 01:08:51 2015        
(r280877)
+++ head/sys/dev/cxgbe/tom/t4_cpl_io.c  Tue Mar 31 01:22:20 2015        
(r280878)
@@ -390,19 +390,17 @@ t4_rcvd(struct toedev *tod, struct tcpcb
                toep->rx_credits += toep->sb_cc - sbused(sb);
                toep->sb_cc = sbused(sb);
        }
-       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);
 }
 
 /*
@@ -1606,6 +1604,14 @@ do_rx_data(struct sge_iq *iq, const stru
        toep->rx_credits += toep->sb_cc - sbused(sb);
        sbappendstream_locked(sb, m, 0);
        toep->sb_cc = sbused(sb);
+       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);
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to