struct ib_send_wr *bad_wr;
struct ib_send_wr wr = { NULL };
struct ib_sge sge;
+ int rc;
wr.opcode = IB_WR_RDMA_READ;
wr.next = NULL;
wr.send_flags = IB_SEND_SIGNALED;
- return ib_post_send(ssk->qp, &wr, &bad_wr);
+ rc = ib_post_send(ssk->qp, &wr, &bad_wr);
+ if (unlikely(rc)) {
+ rx_sa->busy--;
+ ssk->tx_ring.rdma_inflight = NULL;
+ }
+
+ return rc;
}
int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb,
rc = sdp_wait_rdma_wr_finished(ssk);
if (unlikely(rc))
- goto err_post_send;
+ goto err_wait;
copied = rx_sa->umem->length;
atomic_add(copied, &ssk->rcv_nxt);
*used = copied;
-err_post_send:
+err_wait:
ssk->tx_ring.rdma_inflight = NULL;
+
+err_post_send:
sdp_free_fmr(sk, &rx_sa->fmr, &rx_sa->umem);
err_alloc_fmr: