Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 1573

kernel-2.6.18-238.el5.src.rpm

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)) {