]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: better handling of page-allocation-failure
authorEldad Zinger <eldadz@mellanox.co.il>
Sun, 1 Aug 2010 16:16:20 +0000 (19:16 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:15 +0000 (05:05 -0700)
Signed-off-by: Eldad Zinger <eldadz@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_rx.c

index bc7fc4961734dbd07689f2bf06cf3b14147557ec..8b12cf04e8e663816f0544f69c056cd230aa857f 100644 (file)
@@ -186,17 +186,17 @@ static int sdp_post_recv(struct sdp_sock *ssk)
                        page = rx_req->pages[i];
                else {
                        rx_req->pages[i] = page = alloc_pages(gfp_page, 0);
+                       if (unlikely(!page))
+                               goto err;
                        pages_alloced++;
                }
-
-               BUG_ON(!page);
                frag = &skb_shinfo(skb)->frags[i];
                frag->page                = page;
                frag->page_offset         = 0;
                frag->size                = min(PAGE_SIZE, SDP_MAX_PAYLOAD);
+               ++skb_shinfo(skb)->nr_frags;
        }
        skb->truesize += ssk->recv_frags * min(PAGE_SIZE, SDP_MAX_PAYLOAD);
-       skb_shinfo(skb)->nr_frags = ssk->recv_frags;
 
        dev = ssk->ib_device;
        addr = ib_dma_map_single(dev, h, SDP_SKB_HEAD_SIZE, DMA_FROM_DEVICE);
@@ -233,13 +233,7 @@ static int sdp_post_recv(struct sdp_sock *ssk)
        rc = ib_post_recv(ssk->qp, &rx_wr, &bad_wr);
        if (unlikely(rc)) {
                sdp_warn(&ssk->isk.sk, "ib_post_recv failed. status %d\n", rc);
-
-               sdp_cleanup_sdp_buf(ssk, rx_req, SDP_SKB_HEAD_SIZE, DMA_FROM_DEVICE);
-               __kfree_skb(skb);
-
-               sdp_reset(&ssk->isk.sk);
-
-               return -1;
+               goto err;
        }
 
        atomic_inc(&ssk->rx_ring.head);
@@ -247,6 +241,12 @@ static int sdp_post_recv(struct sdp_sock *ssk)
        atomic_add(pages_alloced, &sdp_current_mem_usage);
 
        return 0;
+
+err:
+       sdp_cleanup_sdp_buf(ssk, rx_req, SDP_SKB_HEAD_SIZE, DMA_FROM_DEVICE);
+       __kfree_skb(skb);
+       sdp_reset(&ssk->isk.sk);
+       return -1;
 }
 
 static inline int sdp_post_recvs_needed(struct sdp_sock *ssk)