From: Eldad Zinger Date: Mon, 20 Sep 2010 08:50:57 +0000 (+0200) Subject: sdp: remove recursion in tx_ring processing X-Git-Tag: v4.1.12-92~264^2~5^2~104 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=40e58aa8dd2ffafa2bcd01ced8d7253b11cf631e;p=users%2Fjedix%2Flinux-maple.git sdp: remove recursion in tx_ring processing Signed-off-by: Eldad Zinger --- diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index 166dae322964f..9ea92ee27c1aa 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -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; + } } diff --git a/drivers/infiniband/ulp/sdp/sdp_cma.c b/drivers/infiniband/ulp/sdp/sdp_cma.c index e5082b76561ad..950e46d374de0 100644 --- a/drivers/infiniband/ulp/sdp/sdp_cma.c +++ b/drivers/infiniband/ulp/sdp/sdp_cma.c @@ -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); diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 0ba25ef5bda4c..66853898da3cd 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -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); diff --git a/drivers/infiniband/ulp/sdp/sdp_tx.c b/drivers/infiniband/ulp/sdp/sdp_tx.c index 6e269ce40062e..dac171bf04289 100644 --- a/drivers/infiniband/ulp/sdp/sdp_tx.c +++ b/drivers/infiniband/ulp/sdp/sdp_tx.c @@ -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", diff --git a/drivers/infiniband/ulp/sdp/sdp_zcopy.c b/drivers/infiniband/ulp/sdp/sdp_zcopy.c index b12f78262a38d..f86907b9ff844 100644 --- a/drivers/infiniband/ulp/sdp/sdp_zcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_zcopy.c @@ -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);