]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: send packets without payload when credits=1
authorAmir Vadai <amirv@mellanox.co.il>
Sun, 6 Mar 2011 12:27:57 +0000 (14:27 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:44 +0000 (05:05 -0700)
This according to the SPEC, and prevent a deadlock in ZCopy. SrcAvailCancel
wasn't acked when credits got low.

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

index b1f0ce626d132f1d4bee6f0cc02315ca2d5122de..283e5ffe32621ea24579b1347d54ac2c6749c121 100644 (file)
@@ -216,13 +216,13 @@ again:
        }
 
        if (unlikely((ssk->sa_post_rdma_rd_compl || ssk->sa_post_sendsm) && 
-                       tx_credits(ssk) <= SDP_MIN_TX_CREDITS)) {
-               sdp_warn(sk, "Run out of credits, can't abort SrcAvail. "
+                       tx_credits(ssk) < SDP_MIN_TX_CREDITS)) {
+               sdp_dbg_data(sk, "Run out of credits, can't abort SrcAvail. "
                        "RdmaRdCompl: %d SendSm: %d\n",
                        ssk->sa_post_rdma_rd_compl, ssk->sa_post_sendsm);
        }
 
-       if (ssk->sa_post_rdma_rd_compl && tx_credits(ssk) > SDP_MIN_TX_CREDITS) {
+       if (ssk->sa_post_rdma_rd_compl && tx_credits(ssk) >= SDP_MIN_TX_CREDITS) {
                int unreported = ssk->sa_post_rdma_rd_compl;
 
                skb = sdp_alloc_skb_rdmardcompl(sk, unreported, 0);
@@ -233,7 +233,7 @@ again:
                ssk->sa_post_rdma_rd_compl = 0;
        }
 
-       if (ssk->sa_post_sendsm && tx_credits(ssk) > SDP_MIN_TX_CREDITS) {
+       if (ssk->sa_post_sendsm && tx_credits(ssk) >= SDP_MIN_TX_CREDITS) {
                skb = sdp_alloc_skb_sendsm(sk, 0);
                if (unlikely(!skb))
                        goto no_mem;
@@ -243,7 +243,7 @@ again:
        }
 
        if (ssk->recv_request &&
-           ring_tail(ssk->rx_ring) >= ssk->recv_request_head &&
+           ring_tail(ssk->rx_ring) >= SDP_MIN_TX_CREDITS &&
            tx_credits(ssk) >= min_credits &&
            sdp_tx_ring_slots_left(ssk)) {
                skb = sdp_alloc_skb_chrcvbuf_ack(sk,
@@ -297,7 +297,7 @@ again:
         * payload. */
        if (unlikely(ssk->sdp_disconnect) &&
                        !sk->sk_send_head &&
-                       tx_credits(ssk) > 1) {
+                       tx_credits(ssk) >= SDP_MIN_TX_CREDITS) {
                skb = sdp_alloc_skb_disconnect(sk, gfp);
                if (!skb)
                        goto no_mem;