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
This commit is contained in:
Navdeep Parhar 2015-03-31 01:22:20 +00:00
parent 403df7a672
commit 7ef00d7884
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=280878

View File

@ -390,19 +390,17 @@ t4_rcvd(struct toedev *tod, struct tcpcb *tp)
toep->rx_credits += toep->sb_cc - sbused(sb);
toep->sb_cc = sbused(sb);
}
credits = toep->rx_credits;
SOCKBUF_UNLOCK(sb);
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)) {
if (credits > 0 &&
(credits + 16384 >= tp->rcv_wnd || credits >= 15 * 1024)) {
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 struct rss_header *rss, struct mbuf *m)
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);