svn commit: r280878 - head/sys/dev/cxgbe/tom
Navdeep Parhar
np at FreeBSD.org
Tue Mar 31 01:22:21 UTC 2015
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);
More information about the svn-src-all
mailing list