From: Eldad Zinger Date: Sun, 17 Oct 2010 17:26:01 +0000 (+0200) Subject: sdp: SrcAvailCancel should not be processed during RDMA read X-Git-Tag: v4.1.12-92~264^2~5^2~86 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d66da862c8856b55c2de8ca8cc76e913e54db57b;p=users%2Fjedix%2Flinux-maple.git sdp: SrcAvailCancel should not be processed during RDMA read fmr should be freed only after tx completion, regardless if SrcAvailCancel arrived. Signed-off-by: Eldad Zinger --- diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index a6a22556e8aca..d1ac6812b493e 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -509,7 +509,9 @@ static int sdp_process_rx_ctl_skb(struct sdp_sock *ssk, struct sk_buff *skb) 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); diff --git a/drivers/infiniband/ulp/sdp/sdp_zcopy.c b/drivers/infiniband/ulp/sdp/sdp_zcopy.c index 6cdfc9644eb7a..6369b372afa12 100644 --- a/drivers/infiniband/ulp/sdp/sdp_zcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_zcopy.c @@ -218,8 +218,7 @@ static int sdp_wait_rdmardcompl(struct sdp_sock *ssk, long *timeo_p, 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; @@ -235,12 +234,6 @@ static int sdp_wait_rdma_wr_finished(struct sdp_sock *ssk, 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; @@ -258,7 +251,6 @@ static int sdp_wait_rdma_wr_finished(struct sdp_sock *ssk, 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"); @@ -586,9 +578,9 @@ int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb, 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; @@ -596,10 +588,8 @@ int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb, 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: