[ewg] [PATCH] ipoib: disable napi while cq is being drained
Yossi Etigin
yosefe at voltaire.com
Fri Apr 17 08:26:46 PDT 2009
If napi is enabled while cq is being drained, it creates a race on priv->ibwc
between ipoib_poll and ipoib_drain_cq, leading to memory corruption.
The solution is to enable/disable napi in ipoib_ib_dev_open/stop instead of in
ipoib_open/stop, and sync napi on INITIALIZED bit instead on ADMIN_UP bit. This
way napi will be disabled when ipoib_drain_cq is called.
This fixes bugzilla #1587.
Signed-off-by: Yossi Etigin <yosefe at voltaire.com>
---
backport/2.6.16/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.17/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.18/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.19/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.20/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.21/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.22/ipoib_to_2.6.23.patch | 82 ++++-------
backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch | 82 ++++-------
backport/2.6.23/ipoib_to_2.6.23.patch | 82 ++++-------
backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch | 129 +++++++-----------
fixes/ipoib_0550_fix_napi_poll_race.patch | 72 ++++++++++
22 files changed, 1158 insertions(+), 1482 deletions(-)
diff --git a/kernel_patches/backport/2.6.16/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.16/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.16/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.16/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.17/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.17/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.17/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.17/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.18/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.19/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.19/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.19/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.19/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.20/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.20/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.20/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.20/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.21/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.21/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.21/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.21/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.22/ipoib_to_2.6.23.patch b/kernel_patches/backport/2.6.22/ipoib_to_2.6.23.patch
index a9dac58..702b647 100644
--- a/kernel_patches/backport/2.6.22/ipoib_to_2.6.23.patch
+++ b/kernel_patches/backport/2.6.22/ipoib_to_2.6.23.patch
@@ -10,11 +10,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_main.c | 19 ++++------------
3 files changed, 25 insertions(+), 32 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 19:30:31.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-17 16:53:49.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-17 16:56:10.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -23,7 +23,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -425,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +421,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -32,10 +32,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 19:30:31.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-17 16:57:35.000000000 +0300
@@ -408,20 +408,19 @@ static int poll_tx(struct ipoib_dev_priv
return n == MAX_SEND_CQE;
}
@@ -109,58 +109,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
}
static void drain_tx_cq(struct net_device *dev)
-@@ -809,6 +811,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +710,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +829,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +896,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +904,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 19:00:28.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 19:31:25.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-+ if (ipoib_ib_dev_open(dev))
- return -EINVAL;
-- }
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-17 16:56:10.000000000 +0300
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -169,7 +151,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -1008,10 +1003,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +991,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -180,7 +162,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1060,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1048,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
diff --git a/kernel_patches/backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch b/kernel_patches/backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch
index a9dac58..702b647 100644
--- a/kernel_patches/backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch
+++ b/kernel_patches/backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch
@@ -10,11 +10,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_main.c | 19 ++++------------
3 files changed, 25 insertions(+), 32 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 19:30:31.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-17 16:53:49.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-17 16:56:10.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -23,7 +23,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -425,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +421,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -32,10 +32,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 19:30:31.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-17 16:57:35.000000000 +0300
@@ -408,20 +408,19 @@ static int poll_tx(struct ipoib_dev_priv
return n == MAX_SEND_CQE;
}
@@ -109,58 +109,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
}
static void drain_tx_cq(struct net_device *dev)
-@@ -809,6 +811,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +710,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +829,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +896,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +904,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 19:00:28.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 19:31:25.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-+ if (ipoib_ib_dev_open(dev))
- return -EINVAL;
-- }
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-17 16:56:10.000000000 +0300
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -169,7 +151,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -1008,10 +1003,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +991,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -180,7 +162,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1060,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1048,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
diff --git a/kernel_patches/backport/2.6.23/ipoib_to_2.6.23.patch b/kernel_patches/backport/2.6.23/ipoib_to_2.6.23.patch
index a9dac58..702b647 100644
--- a/kernel_patches/backport/2.6.23/ipoib_to_2.6.23.patch
+++ b/kernel_patches/backport/2.6.23/ipoib_to_2.6.23.patch
@@ -10,11 +10,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_main.c | 19 ++++------------
3 files changed, 25 insertions(+), 32 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 19:30:31.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-17 16:53:49.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-17 16:56:10.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -23,7 +23,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -425,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +421,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -32,10 +32,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 19:30:31.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-17 16:57:35.000000000 +0300
@@ -408,20 +408,19 @@ static int poll_tx(struct ipoib_dev_priv
return n == MAX_SEND_CQE;
}
@@ -109,58 +109,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
}
static void drain_tx_cq(struct net_device *dev)
-@@ -809,6 +811,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +710,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +829,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +896,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +904,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 19:00:28.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 19:31:25.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-+ if (ipoib_ib_dev_open(dev))
- return -EINVAL;
-- }
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-17 16:56:10.000000000 +0300
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -169,7 +151,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -1008,10 +1003,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +991,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -180,7 +162,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1060,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1048,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
diff --git a/kernel_patches/backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 ++--
5 files changed, 61 insertions(+), 64 deletions(-)
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h 2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h 2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
struct net_device *dev;
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
unsigned long flags;
struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
struct ib_event_handler event_handler;
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
struct net_device *parent;
struct list_head child_intfs;
struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
/* functions */
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2009-04-16 23:46:20.000000000 +0300
@@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
ipoib_dbg(priv, "cm recv error "
"(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
if (has_srq)
goto repost;
else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
* this packet and reuse the old buffer.
*/
ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
goto repost;
}
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
skb_pull(skb, IPOIB_ENCAP_LEN);
dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
skb->dev = dev;
/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(skb->len > tx->mtu)) {
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
return;
}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
tx_req->skb = skb;
addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(skb);
return;
}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
addr, skb->len))) {
ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
dev_kfree_skb_any(skb);
} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
dev_kfree_skb_any(tx_req->skb);
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:49:04.000000000 +0300
@@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
* this packet and reuse the old buffer.
*/
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
--priv->tx_outstanding;
ipoib_dma_unmap_tx(priv->ca, tx_req);
dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+
+ return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
int i;
- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+- if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+- napi_disable(&priv->napi);
++ clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ netif_poll_disable(dev);
ipoib_cm_dev_stop(dev);
-@@ -893,6 +897,7 @@ timeout:
- msleep(1);
- }
+@@ -903,6 +905,7 @@ timeout:
+
+ ipoib_ah_dev_cleanup(dev);
+ netif_poll_enable(dev);
ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c 2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
-
- ipoib_dbg(priv, "bringing up interface\n");
-
-- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
-- napi_enable(&priv->napi);
-+ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-
- if (ipoib_pkey_dev_delay_open(dev))
- return 0;
-
-- if (ipoib_ib_dev_open(dev)) {
-- napi_disable(&priv->napi);
-- return -EINVAL;
-- }
-+ if (ipoib_ib_dev_open(dev))
-+ return -EINVAL;
-
- if (ipoib_ib_dev_up(dev)) {
- ipoib_ib_dev_stop(dev, 1);
-- napi_disable(&priv->napi);
- return -EINVAL;
- }
-
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
- ipoib_dbg(priv, "stopping interface\n");
-
- clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
-- napi_disable(&priv->napi);
-
- netif_stop_queue(dev);
-
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
return;
}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
err_path:
ipoib_neigh_free(dev, neigh);
err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
} else
__path_add(dev, path);
} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
skb_push(skb, sizeof *phdr);
__skb_queue_tail(&path->queue, skb);
} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
IPOIB_QPN(phdr->hwaddr),
IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
return NETDEV_TX_OK;
}
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
static int ipoib_hard_header(struct sk_buff *skb,
struct net_device *dev,
unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
{
struct ipoib_header *header;
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
{
struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev_kfree_skb_any(skb);
}
if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
priv->tx_ring = NULL;
}
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
void **tcph, u64 *hdr_flags, void *priv)
{
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
dev->change_mtu = ipoib_change_mtu;
dev->hard_start_xmit = ipoib_start_xmit;
dev->tx_timeout = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
dev->watchdog_timeo = HZ;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2009-04-16 23:46:20.000000000 +0300
@@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
}
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
}
netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto unlock;
}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device
if (!mcast) {
ipoib_warn(priv, "unable to allocate memory for "
"multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
dev_kfree_skb_any(skb);
goto out;
}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device
if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
skb_queue_tail(&mcast->pkt_queue, skb);
else {
diff --git a/kernel_patches/fixes/ipoib_0550_fix_napi_poll_race.patch b/kernel_patches/fixes/ipoib_0550_fix_napi_poll_race.patch
new file mode 100644
index 0000000..8bc1600
--- /dev/null
+++ b/kernel_patches/fixes/ipoib_0550_fix_napi_poll_race.patch
@@ -0,0 +1,72 @@
+ipoib: disable napi while cq is being drained
+
+ If napi is enabled while cq is being drained, it creates a race on priv->ibwc
+between ipoib_poll and ipoib_drain_cq, leading to memory corruption.
+ The solution is to enable/disable napi in ipoib_ib_dev_open/stop instead of in
+ipoib_open/stop, and sync napi on INITIALIZED bit instead on ADMIN_UP bit. This
+way napi will be disabled when ipoib_drain_cq is called.
+
+Fix bugzilla #1587.
+
+Signed-off-by: Yossi Etigin <yosefe at voltaire.com>
+
+
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+===================================================================
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2009-04-16 23:43:16.000000000 +0300
+@@ -708,7 +708,8 @@ int ipoib_ib_dev_open(struct net_device
+ priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ priv->poll_timer.data = (unsigned long)dev;
+
+- set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
++ if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
++ napi_enable(&priv->napi);
+
+ return 0;
+ }
+@@ -827,7 +828,8 @@ int ipoib_ib_dev_stop(struct net_device
+ struct ipoib_tx_buf *tx_req;
+ int i;
+
+- clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
++ if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
++ napi_disable(&priv->napi);
+
+ ipoib_cm_dev_stop(dev);
+
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
+===================================================================
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c 2009-04-16 23:44:02.000000000 +0300
+@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
+
+ ipoib_dbg(priv, "bringing up interface\n");
+
+- if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
+- napi_enable(&priv->napi);
++ set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
+
+ if (ipoib_pkey_dev_delay_open(dev))
+ return 0;
+
+- if (ipoib_ib_dev_open(dev)) {
+- napi_disable(&priv->napi);
++ if (ipoib_ib_dev_open(dev))
+ return -EINVAL;
+- }
+
+ if (ipoib_ib_dev_up(dev)) {
+ ipoib_ib_dev_stop(dev, 1);
+- napi_disable(&priv->napi);
+ return -EINVAL;
+ }
+
+@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device
+ ipoib_dbg(priv, "stopping interface\n");
+
+ clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
+- napi_disable(&priv->napi);
+
+ netif_stop_queue(dev);
+
More information about the ewg
mailing list