From: Doug Ledford <dledford@redhat.com> Date: Mon, 15 Jun 2009 09:52:43 -0400 Subject: [infiniband] ipoib/sdp: update to ofed 1.4.1 final bits Message-id: b42e6c8830c036b7a687c4061ad7242fa3a60f06.1245072810.git.dledford@redhat.com O-Subject: [Patch RHEL5.4 08/16] [ipoib/sdp] update to ofed 1.4.1 final bits Bugzilla: 506097 Signed-off-by: Doug Ledford <dledford@redhat.com> diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 53409b6..c70f04f 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -115,11 +115,11 @@ int ipoib_open(struct net_device *dev) return 0; if (ipoib_ib_dev_open(dev)) - return -EINVAL; + goto err; if (ipoib_ib_dev_up(dev)) { ipoib_ib_dev_stop(dev, 1); - return -EINVAL; + goto err; } if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { @@ -142,6 +142,9 @@ int ipoib_open(struct net_device *dev) netif_start_queue(dev); return 0; +err: + clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); + return -EINVAL; } static int ipoib_stop(struct net_device *dev) diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index afb3b12..2f3fc43 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -330,7 +330,13 @@ static void sdp_post_recv(struct sdp_sock *ssk) frag = &skb_shinfo(skb)->frags[i]; frag->page = page; frag->page_offset = 0; - frag->size = min(PAGE_SIZE, SDP_MAX_PAYLOAD); + + /* Bugzilla 1311 */ + if ( sizeof(frag->size) < 4 ) + frag->size = min(PAGE_SIZE, SDP_MAX_PAYLOAD); + else + frag->size = PAGE_SIZE; + ++skb_shinfo(skb)->nr_frags; skb->len += frag->size; skb->data_len += frag->size; @@ -607,17 +613,16 @@ int sdp_init_buffers(struct sdp_sock *ssk, u32 new_size) int sdp_resize_buffers(struct sdp_sock *ssk, u32 new_size) { + skb_frag_t skb_frag; u32 curr_size = SDP_HEAD_SIZE + ssk->recv_frags * PAGE_SIZE; -#if defined(__ia64__) - /* for huge PAGE_SIZE systems, aka IA64, limit buffers size - [re-]negotiation to a known+working size that will not - trigger a HW error/rc to be interpreted as a IB_WC_LOC_LEN_ERR */ - u32 max_size = (SDP_HEAD_SIZE + SDP_MAX_SEND_SKB_FRAGS * PAGE_SIZE) <= - 32784 ? - (SDP_HEAD_SIZE + SDP_MAX_SEND_SKB_FRAGS * PAGE_SIZE): 32784; -#else u32 max_size = SDP_HEAD_SIZE + SDP_MAX_SEND_SKB_FRAGS * PAGE_SIZE; -#endif + + /* Bugzilla 1311, Kernels using smaller fragments must reject + * re-size requests larger than 32k to prevent being sent + * fragment larger than the receive buffer fragment. + */ + if ( (sizeof(skb_frag.size) < 4) && (max_size > 0x8000)) + max_size = 0x8000; if (new_size > curr_size && new_size <= max_size && sdp_get_large_socket(ssk)) {