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 <[EMAIL PROTECTED]> Signed-off-by: Amir Vadai <[EMAIL PROTECTED]> --- drivers/infiniband/ulp/sdp/sdp.h | 1 + drivers/infiniband/ulp/sdp/sdp_bcopy.c | 8 ++++---- drivers/infiniband/ulp/sdp/sdp_main.c | 4 ++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index 13cc42d..8638422 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -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 diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index 20f6a33..4677df0 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -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)); diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index dfbe724..32833cd 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -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) { -- 1.5.5.GIT _______________________________________________ general mailing list general@lists.openfabrics.org http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general