]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: fix driver to accept credit updates after RCV_SHUTDOWN
authorAmir Vadai <amirv@mellanox.co.il>
Mon, 27 Jul 2009 10:34:35 +0000 (13:34 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:35 +0000 (05:04 -0700)
Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_rx.c
drivers/infiniband/ulp/sdp/sdp_tx.c

index 80c62e753a9513d40c590ee8b52afc57886676f9..0476e4a62ea59da60e554728474ff7511d672a94 100644 (file)
@@ -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));
index 7eb7d31fe38878d72bae6f555a42653af29d7a72..d4569aa1f938ad39240e73232af271621d09c9e0 100644 (file)
@@ -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));