}
return;
}
-
+again:
if (sdp_tx_ring_slots_left(ssk) < SDP_TX_SIZE / 2)
sdp_xmit_poll(ssk, 1);
}
}
- if (post_count)
- sdp_xmit_poll(ssk, 0);
+ if (!sdp_tx_ring_slots_left(ssk) || post_count) {
+ if (sdp_xmit_poll(ssk, 1))
+ goto again;
+ }
}
sdp_dbg(sk, "%s\n", __func__);
if (ssk->tx_ring.cq)
- sdp_xmit_poll(ssk, 1);
+ if (sdp_xmit_poll(ssk, 1))
+ sdp_post_sends(ssk, 0);
if (sk->sk_state == TCP_SYN_RECV) {
sdp_connected_handler(sk);
sdp_dbg(sk, "%s\n", __func__);
if (ssk->tx_ring.cq)
- sdp_xmit_poll(ssk, 1);
+ if (sdp_xmit_poll(ssk, 1))
+ sdp_post_sends(ssk, 0);
sdp_abort_srcavail(sk);
unsigned long timeout = jiffies + SDP_BZCOPY_POLL_TIMEOUT;
while (jiffies < timeout) {
- sdp_xmit_poll(sdp_sk(sk), 1);
+ if (sdp_xmit_poll(sdp_sk(sk), 1))
+ sdp_post_sends(ssk, 0);
if (!bz->busy)
break;
SDPSTATS_COUNTER_INC(bzcopy_poll_miss);
if (wc_processed) {
struct sock *sk = &ssk->isk.sk;
- sdp_post_sends(ssk, GFP_ATOMIC);
sdp_prf1(sk, NULL, "Waking sendmsg. inflight=%d",
(u32) tx_ring_posted(ssk));
sk_stream_write_space(&ssk->isk.sk);
wc_processed = sdp_process_tx_cq(ssk);
if (!wc_processed)
SDPSTATS_COUNTER_INC(tx_poll_miss);
- else
+ else {
+ sdp_post_sends(ssk, GFP_ATOMIC);
SDPSTATS_COUNTER_INC(tx_poll_hit);
+ }
inflight = (u32) tx_ring_posted(ssk);
sdp_prf1(&ssk->isk.sk, NULL, "finished tx proccessing. inflight = %d",
sdp_do_posts(ssk);
- sdp_xmit_poll(ssk, 1);
+ if (sdp_xmit_poll(ssk, 1))
+ sdp_post_sends(ssk, 0);
ret = sdp_tx_wait_memory(ssk, timeo_p, &credits_needed);