Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 6 Jun 2015 18:31:28 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r284092 - stable/10/sys/dev/cxgbe/tom
Message-ID:  <201506061831.t56IVSRQ097866@svn.freebsd.org>

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



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