diff options
author | John Baldwin <jhb@FreeBSD.org> | 2023-09-08 23:30:35 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2023-10-11 15:09:52 +0000 |
commit | a2128fd12d6e3cf506541429ff3e4c29994c7c80 (patch) | |
tree | 8f0f5b32eb6e4398879c20eab77f7cdd4570a30e | |
parent | 358db6d8825b38296a205206ac3d25b2084aa5f4 (diff) | |
download | src-a2128fd12d6e3cf506541429ff3e4c29994c7c80.tar.gz src-a2128fd12d6e3cf506541429ff3e4c29994c7c80.zip |
cxgbe tom: Call t4_rcvd_locked from do_rx_data to return RX credits
In particular, the kernel RPC layer used by the NFS client never
invokes pru_rcvd since it always reads data from the socket upcall
via MSG_SOCALLBCK which avoids calling pru_rcvd. As a result, on an
NFS client connection managed by t4_tom, RX credits were never
returned to the TOE connection to open the TCP window resulting in
connection hangs.
To fix, expand the set of conditions in do_rx_data where RX credits
are returned to match those in t4_rcvd_locked by calling the function
directly.
Reviewed by: np
Sponsored by: Chelsio Communications
Differential Revision: https://reviews.freebsd.org/D41688
(cherry picked from commit dcfddc8dc091e7688abc8488a0307eba425fa7a2)
-rw-r--r-- | sys/dev/cxgbe/tom/t4_cpl_io.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/sys/dev/cxgbe/tom/t4_cpl_io.c b/sys/dev/cxgbe/tom/t4_cpl_io.c index 37470c1fb007..fe9dd4477ab3 100644 --- a/sys/dev/cxgbe/tom/t4_cpl_io.c +++ b/sys/dev/cxgbe/tom/t4_cpl_io.c @@ -1676,7 +1676,7 @@ do_rx_data(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) struct socket *so; struct sockbuf *sb; struct epoch_tracker et; - int len, rx_credits; + int len; uint32_t ddp_placed = 0; if (__predict_false(toep->flags & TPF_SYNQE)) { @@ -1808,12 +1808,7 @@ do_rx_data(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) } sbappendstream_locked(sb, m, 0); - rx_credits = sbspace(sb) > tp->rcv_wnd ? sbspace(sb) - tp->rcv_wnd : 0; - if (rx_credits > 0 && sbused(sb) + tp->rcv_wnd < sb->sb_lowat) { - rx_credits = send_rx_credits(sc, toep, rx_credits); - tp->rcv_wnd += rx_credits; - tp->rcv_adv += rx_credits; - } + t4_rcvd_locked(&toep->td->tod, tp); if (ulp_mode(toep) == ULP_MODE_TCPDDP && toep->ddp.waiting_count > 0 && sbavail(sb) != 0) { |