Use sbused() instead of sbspace() to avoid signed issues.

Inserting a full mbuf with an external cluster into the socket buffer
resulted in sbspace() returning -MLEN.  However, since sb_hiwat is
unsigned, the -MLEN value was converted to unsigned in comparisons.  As a
result, the socket buffer was never autosized.  Note that sb_lowat is signed
to permit direct comparisons with sbspace(), but sb_hiwat is unsigned.
Follow suit with what tcp_output() does and compare the value of sbused()
with sb_hiwat instead.

Approved by:	re (gjb)
Sponsored by:	Chelsio Communications
This commit is contained in:
John Baldwin 2016-06-15 21:08:51 +00:00
parent 49b39ebf49
commit ae0b1ccbab
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=301932

View File

@ -577,7 +577,7 @@ t4_push_frames(struct adapter *sc, struct toepcb *toep, int drop)
struct tcpcb *tp = intotcpcb(inp);
struct socket *so = inp->inp_socket;
struct sockbuf *sb = &so->so_snd;
int tx_credits, shove, compl, space, sowwakeup;
int tx_credits, shove, compl, sowwakeup;
struct ofld_tx_sdesc *txsd = &toep->txsd[toep->txsd_pidx];
INP_WLOCK_ASSERT(inp);
@ -652,9 +652,7 @@ t4_push_frames(struct adapter *sc, struct toepcb *toep, int drop)
}
}
space = sbspace(sb);
if (space <= sb->sb_hiwat * 3 / 8 &&
if (sbused(sb) > sb->sb_hiwat * 5 / 8 &&
toep->plen_nocompl + plen >= sb->sb_hiwat / 4)
compl = 1;
else
@ -663,7 +661,7 @@ t4_push_frames(struct adapter *sc, struct toepcb *toep, int drop)
if (sb->sb_flags & SB_AUTOSIZE &&
V_tcp_do_autosndbuf &&
sb->sb_hiwat < V_tcp_autosndbuf_max &&
space < sb->sb_hiwat / 8) {
sbused(sb) >= sb->sb_hiwat * 7 / 8) {
int newsize = min(sb->sb_hiwat + V_tcp_autosndbuf_inc,
V_tcp_autosndbuf_max);