From: Amir Vadai Date: Thu, 25 Feb 2010 09:43:03 +0000 (+0200) Subject: sdp: SendSM wasn't sent sometimes after getting SrcAvailCancel X-Git-Tag: v4.1.12-92~264^2~5^2~212 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=ac4125050b06fea543c9fb2ac6de9d74979697db;p=users%2Fjedix%2Flinux-maple.git sdp: SendSM wasn't sent sometimes after getting SrcAvailCancel * 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 --- diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 04256ccce356f..baeb8589fefdc 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -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; diff --git a/drivers/infiniband/ulp/sdp/sdp_proc.c b/drivers/infiniband/ulp/sdp/sdp_proc.c index 253a287683b54..68b65920c67a9 100644 --- a/drivers/infiniband/ulp/sdp/sdp_proc.c +++ b/drivers/infiniband/ulp/sdp/sdp_proc.c @@ -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; } diff --git a/drivers/infiniband/ulp/sdp/sdp_tx.c b/drivers/infiniband/ulp/sdp/sdp_tx.c index 3c46d40379a82..426e6c7cf565c 100644 --- a/drivers/infiniband/ulp/sdp/sdp_tx.c +++ b/drivers/infiniband/ulp/sdp/sdp_tx.c @@ -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) diff --git a/drivers/infiniband/ulp/sdp/sdp_zcopy.c b/drivers/infiniband/ulp/sdp/sdp_zcopy.c index 04b30977ca0d6..b7585e3d820e4 100644 --- a/drivers/infiniband/ulp/sdp/sdp_zcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_zcopy.c @@ -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;