From 7fa4651227ba934ddde3dff573bb6b7fd1a1d050 Mon Sep 17 00:00:00 2001 From: Eldad Zinger Date: Sun, 24 Oct 2010 11:16:56 +0200 Subject: [PATCH] sdp: if can not allocate memory - no point of waiting We don't wake up sleeper when we free memory, so mem sleeper will sleep forever. Signed-off-by: Eldad Zinger --- drivers/infiniband/ulp/sdp/sdp_main.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 32ff3f6572e0..d67e8d411c99 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -2022,8 +2022,10 @@ new_segment: } skb = sdp_alloc_skb_data(sk, min(seglen, size_goal), 0); - if (!skb) - goto wait_for_memory; + if (!skb) { + err = -ENOMEM; + goto do_error; + } BZCOPY_STATE(skb) = bz; @@ -2060,13 +2062,17 @@ new_segment: copy = (bz) ? sdp_bzcopy_get(sk, skb, from, copy, bz) : sdp_bcopy_get(sk, skb, from, copy); if (unlikely(copy < 0)) { - if (!++copy) - goto wait_for_memory; - if (!++copy) - goto new_segment; - if (!++copy) - goto do_fault; - goto do_error; + switch (copy) { + case SDP_DO_WAIT_MEM: + err = -ENOMEM; + goto do_error; + case SDP_NEW_SEG: + goto new_segment; + case SDP_ERR_FAULT: + goto do_fault; + default: + goto do_error; + } } if (!copied) @@ -2083,7 +2089,6 @@ new_segment: wait_for_sndbuf: set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); -wait_for_memory: sdp_prf(sk, skb, "wait for mem. credits: %d", tx_credits(ssk)); SDPSTATS_COUNTER_INC(send_wait_for_mem); if (copied) -- 2.50.1