From: Amir Vadai Date: Mon, 27 Jul 2009 10:34:35 +0000 (+0300) Subject: sdp: fix driver to accept credit updates after RCV_SHUTDOWN X-Git-Tag: v4.1.12-92~264^2~5^2~259 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=394ed774d9cfe9bf5e1195d4d04703df59af26ac;p=users%2Fjedix%2Flinux-maple.git sdp: fix driver to accept credit updates after RCV_SHUTDOWN Signed-off-by: Amir Vadai --- diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index 80c62e753a951..0476e4a62ea59 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -484,6 +484,9 @@ static int sdp_process_rx_ctl_skb(struct sdp_sock *ssk, struct sk_buff *skb) sdp_post_sendsm(ssk); break; case SDP_MID_DISCONN: + sdp_dbg_data(sk, "Handling DISCONN\n"); + sdp_prf(sk, NULL, "Handling DISCONN"); + sdp_handle_disconn(sk); break; case SDP_MID_CHRCVBUF: sdp_dbg_data(sk, "Handling RX CHRCVBUF\n"); @@ -542,6 +545,12 @@ static int sdp_process_rx_skb(struct sdp_sock *ssk, struct sk_buff *skb) skb_pull(skb, sizeof(struct sdp_bsdh)); + if (unlikely(h->mid == SDP_MID_DATA && skb->len == 0)) { + /* Credit update is valid even after RCV_SHUTDOWN */ + __kfree_skb(skb); + return 0; + } + if ((h->mid != SDP_MID_DATA && h->mid != SDP_MID_SRCAVAIL && h->mid != SDP_MID_DISCONN) || unlikely(sk->sk_shutdown & RCV_SHUTDOWN)) { @@ -557,11 +566,6 @@ static int sdp_process_rx_skb(struct sdp_sock *ssk, struct sk_buff *skb) return 0; } - if (unlikely(h->mid == SDP_MID_DATA && skb->len <= 0)) { - __kfree_skb(skb); - return 0; - } - sdp_prf(sk, NULL, "queueing %s skb", mid2str(h->mid)); skb = sdp_sock_queue_rcv_skb(sk, skb); @@ -889,8 +893,12 @@ void sdp_rx_ring_destroy(struct sdp_sock *ssk) } if (ssk->rx_ring.cq) { - ib_destroy_cq(ssk->rx_ring.cq); - ssk->rx_ring.cq = NULL; + if (ib_destroy_cq(ssk->rx_ring.cq)) { + sdp_warn(&ssk->isk.sk, "destroy cq(%p) failed\n", + ssk->rx_ring.cq); + } else { + ssk->rx_ring.cq = NULL; + } } WARN_ON(ring_head(ssk->rx_ring) != ring_tail(ssk->rx_ring)); diff --git a/drivers/infiniband/ulp/sdp/sdp_tx.c b/drivers/infiniband/ulp/sdp/sdp_tx.c index 7eb7d31fe3887..d4569aa1f938a 100644 --- a/drivers/infiniband/ulp/sdp/sdp_tx.c +++ b/drivers/infiniband/ulp/sdp/sdp_tx.c @@ -476,8 +476,12 @@ void sdp_tx_ring_destroy(struct sdp_sock *ssk) } if (ssk->tx_ring.cq) { - ib_destroy_cq(ssk->tx_ring.cq); - ssk->tx_ring.cq = NULL; + if (ib_destroy_cq(ssk->tx_ring.cq)) { + sdp_warn(&ssk->isk.sk, "destroy cq(%p) failed\n", + ssk->tx_ring.cq); + } else { + ssk->tx_ring.cq = NULL; + } } WARN_ON(ring_head(ssk->tx_ring) != ring_tail(ssk->tx_ring));