]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: SendSM wasn't sent sometimes after getting SrcAvailCancel
authorAmir Vadai <amirv@mellanox.co.il>
Thu, 25 Feb 2010 09:43:03 +0000 (11:43 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:49 +0000 (05:04 -0700)
* skb was freed if rx_sa is aborted - preventing SendSM
  to be sent.
* Didn't update rx_sa->used in case of SrcAvailCancel
  and therefore not sending RdmaRdCompl.
  This also caused the next read to fail because offset
  wasn't updated

Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_main.c
drivers/infiniband/ulp/sdp/sdp_proc.c
drivers/infiniband/ulp/sdp/sdp_tx.c
drivers/infiniband/ulp/sdp/sdp_zcopy.c

index 04256ccce356f5b68949e23ece27c8053660fba0..baeb8589fefdc7da8fd9ad8a67780e26414ed53e 100644 (file)
@@ -2122,7 +2122,7 @@ static int sdp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                        case SDP_MID_SRCAVAIL:
                                rx_sa = RX_SRCAVAIL_STATE(skb);
 
-                               if (rx_sa->flags & RX_SA_ABORTED) {
+                               if (rx_sa->mseq < ssk->srcavail_cancel_mseq) {
                                        sdp_dbg_data(sk, "Ignoring src avail "
                                                        "due to SrcAvailCancel\n");
                                        sdp_post_sendsm(sk);
@@ -2337,8 +2337,7 @@ skip_copy:
                if (!rx_sa && used + offset < skb->len)
                        continue;
 
-               if (rx_sa && !(rx_sa->flags & RX_SA_ABORTED) &&
-                               rx_sa->used < rx_sa->len)
+               if (rx_sa && rx_sa->used < rx_sa->len)
                        continue;
 
                offset = 0;
index 253a287683b544e1e709be471e7a9a53b64240b4..68b65920c67a9736712909a3cc7be60e4f333f51 100644 (file)
@@ -314,7 +314,7 @@ static int sdpstats_seq_show(struct seq_file *seq, void *v)
        seq_printf(seq, "ZCopy stats:\n");
        seq_printf(seq, "- TX timeout\t\t: %d\n", SDPSTATS_COUNTER_GET(zcopy_tx_timeout));
        seq_printf(seq, "- TX cross send\t\t: %d\n", SDPSTATS_COUNTER_GET(zcopy_cross_send));
-       seq_printf(seq, "- TX aborted by peer\t\t: %d\n", SDPSTATS_COUNTER_GET(zcopy_tx_aborted));
+       seq_printf(seq, "- TX aborted by peer\t: %d\n", SDPSTATS_COUNTER_GET(zcopy_tx_aborted));
        seq_printf(seq, "- TX error\t\t: %d\n", SDPSTATS_COUNTER_GET(zcopy_tx_error));
        return 0;
 }
index 3c46d40379a82bbe2ed4c2e6ca3ca7f1d389279c..426e6c7cf565ca86679391048c5310f8a0e472ba 100644 (file)
@@ -79,6 +79,9 @@ void sdp_post_send(struct sdp_sock *ssk, struct sk_buff *skb)
        SDPSTATS_COUNTER_MID_INC(post_send, h->mid);
        SDPSTATS_HIST(send_size, skb->len);
 
+       if (!ssk->qp_active)
+               goto err;
+
        ssk->tx_packets++;
        ssk->tx_bytes += skb->len;
 
@@ -156,6 +159,11 @@ void sdp_post_send(struct sdp_sock *ssk, struct sk_buff *skb)
                sdp_set_error(&ssk->isk.sk, -ECONNRESET);
                wake_up(&ssk->wq);
        }
+
+       return;
+
+err:
+       __kfree_skb(skb);               
 }
 
 static struct sk_buff *sdp_send_completion(struct sdp_sock *ssk, int mseq)
index 04b30977ca0d6eac7f070f95ad2c54f3658e5488..b7585e3d820e46e6f401a321257e0193b7988aab 100644 (file)
@@ -525,6 +525,7 @@ int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb,
        int got_srcavail_cancel;
        int rc = 0;
        int len = *used;
+       int copied;
 
        sdp_dbg_data(&ssk->isk.sk, "preparing RDMA read."
                " len: 0x%x. buffer len: 0x%lx\n", len, iov->iov_len);
@@ -566,15 +567,12 @@ int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb,
                goto err_post_send;
        }
 
-       /* Ignore any data copied after getting SrcAvailCancel */
-       if (!got_srcavail_cancel) {
-               int copied = rx_sa->umem->length;
+       copied = rx_sa->umem->length;
 
-               sdp_update_iov_used(sk, iov, copied);
-               rx_sa->used += copied;
-               atomic_add(copied, &ssk->rcv_nxt);
-               *used = copied;
-       }
+       sdp_update_iov_used(sk, iov, copied);
+       rx_sa->used += copied;
+       atomic_add(copied, &ssk->rcv_nxt);
+       *used = copied;
 
        ssk->tx_ring.rdma_inflight = NULL;