mirror of
https://github.com/opnsense/src.git
synced 2026-06-04 22:32:43 -04:00
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
This commit is contained in:
parent
2a4096b012
commit
dcfddc8dc0
1 changed files with 2 additions and 7 deletions
|
|
@ -1647,7 +1647,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)) {
|
||||
|
|
@ -1779,12 +1779,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) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue