]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: SrcAvailCancel should not be processed during RDMA read
authorEldad Zinger <eldadz@mellanox.co.il>
Sun, 17 Oct 2010 17:26:01 +0000 (19:26 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:27 +0000 (05:05 -0700)
fmr should be freed only after tx completion, regardless if SrcAvailCancel arrived.

Signed-off-by: Eldad Zinger <eldadz@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_rx.c
drivers/infiniband/ulp/sdp/sdp_zcopy.c

index a6a22556e8aca5984f0328860f2419fd50c2d82b..d1ac6812b493ee2c57b4c4860de3ecfad5be0d42 100644 (file)
@@ -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);
index 6cdfc9644eb7ac5c2f051961d01772f1d1aee2a9..6369b372afa12a62fbe20dfa47796807a0302f34 100644 (file)
@@ -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: