]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: remove recursion in tx_ring processing
authorEldad Zinger <eldadz@mellanox.co.il>
Mon, 20 Sep 2010 08:50:57 +0000 (10:50 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:22 +0000 (05:05 -0700)
Signed-off-by: Eldad Zinger <eldadz@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_bcopy.c
drivers/infiniband/ulp/sdp/sdp_cma.c
drivers/infiniband/ulp/sdp/sdp_main.c
drivers/infiniband/ulp/sdp/sdp_tx.c
drivers/infiniband/ulp/sdp/sdp_zcopy.c

index 166dae322964f0f7374212bb4ed192c6057744c4..9ea92ee27c1aa268654caa571929b077bf587d5c 100644 (file)
@@ -202,7 +202,7 @@ void sdp_post_sends(struct sdp_sock *ssk, gfp_t gfp)
                }
                return;
        }
-
+again:
        if (sdp_tx_ring_slots_left(ssk) < SDP_TX_SIZE / 2)
                sdp_xmit_poll(ssk,  1);
 
@@ -274,6 +274,8 @@ void sdp_post_sends(struct sdp_sock *ssk, gfp_t gfp)
                }
        }
 
-       if (post_count)
-               sdp_xmit_poll(ssk, 0);
+       if (!sdp_tx_ring_slots_left(ssk) || post_count) {
+               if (sdp_xmit_poll(ssk, 1))
+                       goto again;
+       }
 }
index e5082b76561ade7e7b9291f1e7477ded92a7e645..950e46d374de0230bd81b96d0bea190262255be9 100644 (file)
@@ -299,7 +299,8 @@ static int sdp_disconnected_handler(struct sock *sk)
        sdp_dbg(sk, "%s\n", __func__);
 
        if (ssk->tx_ring.cq)
-               sdp_xmit_poll(ssk, 1);
+               if (sdp_xmit_poll(ssk, 1))
+                       sdp_post_sends(ssk, 0);
 
        if (sk->sk_state == TCP_SYN_RECV) {
                sdp_connected_handler(sk);
index 0ba25ef5bda4c7bf8d134d88188142fd31332e19..66853898da3cdf4e9e0bc555eda8fecec4be2592 100644 (file)
@@ -428,7 +428,8 @@ void sdp_reset_sk(struct sock *sk, int rc)
        sdp_dbg(sk, "%s\n", __func__);
 
        if (ssk->tx_ring.cq)
-               sdp_xmit_poll(ssk, 1);
+               if (sdp_xmit_poll(ssk, 1))
+                       sdp_post_sends(ssk, 0);
 
        sdp_abort_srcavail(sk);
 
@@ -1497,7 +1498,8 @@ static inline struct bzcopy_state *sdp_bz_cleanup(struct bzcopy_state *bz)
                unsigned long timeout = jiffies + SDP_BZCOPY_POLL_TIMEOUT;
 
                while (jiffies < timeout) {
-                       sdp_xmit_poll(sdp_sk(sk), 1);
+                       if (sdp_xmit_poll(sdp_sk(sk), 1))
+                               sdp_post_sends(ssk, 0);
                        if (!bz->busy)
                                break;
                        SDPSTATS_COUNTER_INC(bzcopy_poll_miss);
index 6e269ce40062eafc80618e64eca8eddb8f0e9a49..dac171bf042891b0a5b6f0a220999ead2e18d5f1 100644 (file)
@@ -306,7 +306,6 @@ static int sdp_process_tx_cq(struct sdp_sock *ssk)
 
        if (wc_processed) {
                struct sock *sk = &ssk->isk.sk;
-               sdp_post_sends(ssk, GFP_ATOMIC);
                sdp_prf1(sk, NULL, "Waking sendmsg. inflight=%d",
                                (u32) tx_ring_posted(ssk));
                sk_stream_write_space(&ssk->isk.sk);
@@ -388,8 +387,10 @@ static void sdp_poll_tx_timeout(unsigned long data)
        wc_processed = sdp_process_tx_cq(ssk);
        if (!wc_processed)
                SDPSTATS_COUNTER_INC(tx_poll_miss);
-       else
+       else {
+               sdp_post_sends(ssk, GFP_ATOMIC);
                SDPSTATS_COUNTER_INC(tx_poll_hit);
+       }
 
        inflight = (u32) tx_ring_posted(ssk);
        sdp_prf1(&ssk->isk.sk, NULL, "finished tx proccessing. inflight = %d",
index b12f78262a38d1de135c832f2e6731a2575e899e..f86907b9ff8446e7524b04aa3f6ba6f62f9636cc 100644 (file)
@@ -613,7 +613,8 @@ static inline int wait_for_sndbuf(struct sock *sk, long *timeo_p)
 
        sdp_do_posts(ssk);
 
-       sdp_xmit_poll(ssk, 1);
+       if (sdp_xmit_poll(ssk, 1))
+               sdp_post_sends(ssk, 0);
 
        ret = sdp_tx_wait_memory(ssk, timeo_p, &credits_needed);