Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Mar 2015 01:22:21 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r280878 - head/sys/dev/cxgbe/tom
Message-ID:  <201503310122.t2V1MLYj047127@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503310122.t2V1MLYj047127>