]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: if can not allocate memory - no point of waiting
authorEldad Zinger <eldadz@mellanox.co.il>
Sun, 24 Oct 2010 09:16:56 +0000 (11:16 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:31 +0000 (05:05 -0700)
We don't wake up sleeper when we free memory, so mem sleeper will sleep forever.

Signed-off-by: Eldad Zinger <eldadz@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_main.c

index 32ff3f6572e06f3b64ca5cfac1b05860c4809016..d67e8d411c993434f9e7bf86250905ad6e44a8cd 100644 (file)
@@ -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)