]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: Limit skb frag size to 64K-1
authorAmir Vadai <amirv@mellanox.co.il>
Sun, 26 Oct 2008 09:43:43 +0000 (11:43 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:19 +0000 (05:04 -0700)
When 64K pages are in use, the skb_frag size can become larger
than the skb_frag can address. An skb_frag's max size is 64K-1.
This patch defines SDP_MAX_PAYLOAD as 64K - SDP_HEADER_SIZE.
The patch changes sdp_post_recv() and sdp_sendmsg() to use the smaller of
PAGE_SIZE or SDP_MAX_PAYLOAD as it segment size.

This fix the bug here:
https://bugs.openfabrics.org/show_bug.cgi?id=1300

Signed-off-by: David Wilder <dwilder@us.ibm.com>
Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp.h
drivers/infiniband/ulp/sdp/sdp_bcopy.c
drivers/infiniband/ulp/sdp/sdp_main.c

index 13cc42db074f846c62ffd960cd0b4319886b402b..86384229f996b2c0cd11cfbba8af982003d0c434 100644 (file)
@@ -82,6 +82,7 @@ extern int sdp_data_debug_level;
 #define SDP_MAX_SEND_SKB_FRAGS (PAGE_SIZE > 0x8000 ? 1 : 0x8000 / PAGE_SIZE)
 #define SDP_HEAD_SIZE (PAGE_SIZE / 2 + sizeof(struct sdp_bsdh))
 #define SDP_NUM_WC 4
+#define SDP_MAX_PAYLOAD ((1 << 16) - SDP_HEAD_SIZE)
 
 #define SDP_MIN_ZCOPY_THRESH    1024
 #define SDP_MAX_ZCOPY_THRESH 1048576
index 20f6a330ddbeb82b5b23f17f59a46156fdf4736c..4677df0debd5ae013590c22a7d39e066a63b1315 100644 (file)
@@ -322,11 +322,11 @@ static void sdp_post_recv(struct sdp_sock *ssk)
                frag = &skb_shinfo(skb)->frags[i];
                frag->page                = page;
                frag->page_offset         = 0;
-               frag->size                = PAGE_SIZE;
+               frag->size                =  min(PAGE_SIZE, SDP_MAX_PAYLOAD);
                ++skb_shinfo(skb)->nr_frags;
-               skb->len += PAGE_SIZE;
-               skb->data_len += PAGE_SIZE;
-               skb->truesize += PAGE_SIZE;
+               skb->len += frag->size;
+               skb->data_len += frag->size;
+               skb->truesize += frag->size;
        }
 
         rx_req = ssk->rx_ring + (id & (SDP_RX_SIZE - 1));
index dfbe724f846ed6d3ee67f790265df11eacd757f2..32833cd7e4cf379b8b40c4c945dba9bdc4656625 100644 (file)
@@ -1637,6 +1637,10 @@ int sdp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
 
                iov++;
 
+               /* Limmiting the size_goal is reqired when using 64K pages*/
+               if (size_goal > SDP_MAX_PAYLOAD)
+                       size_goal = SDP_MAX_PAYLOAD;
+
                bz = sdp_bz_setup(ssk, from, seglen, size_goal);
 
                while (seglen > 0) {