From: Amir Vadai Date: Sun, 6 Mar 2011 12:33:00 +0000 (+0200) Subject: sdp: fix a hole in rx memory limit X-Git-Tag: v4.1.12-92~264^2~5^2~29 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=6bd33d07a38ca173e5427c71ac4caa7dd78d4669;p=users%2Fjedix%2Flinux-maple.git sdp: fix a hole in rx memory limit Signed-off-by: Amir Vadai --- diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index 0afe5f15029e1..e6cd2293138b8 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -144,8 +144,10 @@ static void sdp_sock_rfree(struct sk_buff *skb) static int sdp_post_recv(struct sdp_sock *ssk) { + struct sock *sk = sk_ssk(ssk); struct sdp_buf *rx_req; - int i, rc, frags; + int i, frags; + int rc = 0; u64 addr; struct ib_device *dev; struct ib_recv_wr rx_wr = { NULL }; @@ -198,6 +200,12 @@ static int sdp_post_recv(struct sdp_sock *ssk) ++skb_shinfo(skb)->nr_frags; } skb->truesize += ssk->recv_frags * min(PAGE_SIZE, SDP_MAX_PAYLOAD); + if (!sk_rmem_schedule(sk, ssk->recv_frags * min(PAGE_SIZE, SDP_MAX_PAYLOAD))) { + sdp_dbg(sk, "RX couldn't post, rx posted = %d.", + rx_ring_posted(sdp_sk(sk))); + sdp_dbg(sk, "Out of memory\n"); + goto err; + } dev = ssk->ib_device; addr = ib_dma_map_single(dev, h, SDP_SKB_HEAD_SIZE, DMA_FROM_DEVICE); @@ -248,7 +256,9 @@ static int sdp_post_recv(struct sdp_sock *ssk) err: sdp_cleanup_sdp_buf(ssk, rx_req, SDP_SKB_HEAD_SIZE, DMA_FROM_DEVICE); __kfree_skb(skb); - sdp_reset(sk_ssk(ssk)); + + if (rc) + sdp_reset(sk_ssk(ssk)); return -1; }