sdp_handle_sendsm(ssk, ntohl(h->mseq_ack));
break;
case SDP_MID_SRCAVAIL_CANCEL:
- if (ssk->rx_sa && after(ntohl(h->mseq), ssk->rx_sa->mseq)) {
+ if (ssk->rx_sa && after(ntohl(h->mseq), ssk->rx_sa->mseq) &&
+ (!ssk->tx_ring.rdma_inflight ||
+ !ssk->tx_ring.rdma_inflight->busy)) {
sdp_dbg(sk, "Handling SrcAvailCancel - post SendSM\n");
RX_SRCAVAIL_STATE(ssk->rx_sa->skb) = NULL;
kfree(ssk->rx_sa);
return err;
}
-static int sdp_wait_rdma_wr_finished(struct sdp_sock *ssk,
- struct rx_srcavail_state *rx_sa)
+static int sdp_wait_rdma_wr_finished(struct sdp_sock *ssk)
{
struct sock *sk = &ssk->isk.sk;
long timeo = SDP_RDMA_READ_TIMEOUT;
break;
}
- if (sdp_chk_sa_cancel(ssk, rx_sa)) {
- sdp_dbg_data(sk, "got SrcAvailCancel\n");
- rc = -EAGAIN; /* fall to BCopy */
- break;
- }
-
if (!ssk->qp_active) {
sdp_dbg_data(sk, "QP destroyed\n");
rc = -EPIPE;
sdp_prf1(sk, NULL, "Going to sleep");
sk_wait_event(sk, &timeo,
!ssk->tx_ring.rdma_inflight->busy ||
- sdp_chk_sa_cancel(ssk, rx_sa) ||
!ssk->qp_active);
sdp_prf1(sk, NULL, "Woke up");
sdp_dbg_data(&ssk->isk.sk, "woke up sleepers\n");
sdp_prf(sk, skb, "Finished posting, now to wait");
sdp_arm_tx_cq(sk);
- rc = sdp_wait_rdma_wr_finished(ssk, rx_sa);
+ rc = sdp_wait_rdma_wr_finished(ssk);
if (unlikely(rc))
- goto err_wait;
+ goto err_post_send;
copied = rx_sa->umem->length;
atomic_add(copied, &ssk->rcv_nxt);
*used = copied;
-err_wait:
- ssk->tx_ring.rdma_inflight = NULL;
-
err_post_send:
+ ssk->tx_ring.rdma_inflight = NULL;
sdp_free_fmr(sk, &rx_sa->fmr, &rx_sa->umem);
err_alloc_fmr: