From: Eldad Zinger Date: Sun, 1 Aug 2010 16:16:20 +0000 (+0300) Subject: sdp: better handling of page-allocation-failure X-Git-Tag: v4.1.12-92~264^2~5^2~126 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=80d53b61b2dd2a6dd608d99da91544b87fb7e37c;p=users%2Fjedix%2Flinux-maple.git sdp: better handling of page-allocation-failure Signed-off-by: Eldad Zinger --- diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index bc7fc4961734d..8b12cf04e8e66 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -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)