[ewg] RE: [ofa-general] OFED 1.3 beta status on kernel 2.6.24 rebase

Eli Cohen eli at dev.mellanox.co.il
Wed Nov 14 08:29:43 PST 2007


On Wed, 2007-11-14 at 10:23 +0200, Moni Levy wrote:

> I guess that the one Tziporet is talking about is:
> 
> "IPoIB: Use shinfo->gso_size to indicate tcp mss instead of using link MTU"
> 
> Tziporet, am I right ?
> 

No this is not the critical bug we're Tziporet was referring to. The one
she was referring to was a backport patch for ipoib from kernel 2.6.24
to older kernels. The previous version of the backport did not return a
correct return value from the poll function. Here is the new backport
for 2.6.23:

Backport IPOIB to kernel 2.6.23

Signed-off-by: Eli Cohen <eli at mellanox.co.il>

---

Index: ofed_kernel-2.6.23/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
--- ofed_kernel-2.6.23.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2007-11-13 11:56:43.000000000 +0200
+++ ofed_kernel-2.6.23/drivers/infiniband/ulp/ipoib/ipoib.h	2007-11-13 11:56:48.000000000 +0200
@@ -324,8 +324,6 @@ struct ipoib_dev_priv {
 
 	struct net_device *dev;
 
-	struct napi_struct napi;
-
 	unsigned long flags;
 
 	struct mutex mcast_mutex;
@@ -451,7 +449,7 @@ extern struct workqueue_struct *ipoib_wo
 
 /* functions */
 
-int ipoib_poll(struct napi_struct *napi, int budget);
+int ipoib_poll(struct net_device *dev, int *budget);
 void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
 
 struct ipoib_ah *ipoib_create_ah(struct net_device *dev,
Index: ofed_kernel-2.6.23/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
--- ofed_kernel-2.6.23.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2007-11-13 11:56:43.000000000 +0200
+++ ofed_kernel-2.6.23/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2007-11-13 12:02:29.000000000 +0200
@@ -295,20 +295,19 @@ static void ipoib_ib_handle_tx_wc(struct
 			   wc->status, wr_id, wc->vendor_err);
 }
 
-int ipoib_poll(struct napi_struct *napi, int budget)
+int ipoib_poll(struct net_device *dev, int *budget)
 {
-	struct ipoib_dev_priv *priv = container_of(napi, struct ipoib_dev_priv, napi);
-	struct net_device *dev = priv->dev;
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+	int max = min(*budget, dev->quota);
 	int done;
 	int t;
 	int n, i;
+	int ret;
 
 	done  = 0;
 
 poll_more:
-	while (done < budget) {
-		int max = (budget - done);
-
+	while (max) {
 		t = min(IPOIB_NUM_WC, max);
 		n = ib_poll_cq(priv->cq, t, priv->ibwc);
 
@@ -317,6 +316,7 @@ poll_more:
 
 			if (wc->wr_id & IPOIB_OP_RECV) {
 				++done;
+				--max;
 				if (wc->wr_id & IPOIB_OP_CM)
 					ipoib_cm_handle_rx_wc(dev, wc);
 				else
@@ -333,24 +333,26 @@ poll_more:
 			break;
 	}
 
-	if (done < budget) {
-		netif_rx_complete(dev, napi);
+	if (max) {
+		netif_rx_complete(dev);
 		if (unlikely(ib_req_notify_cq(priv->cq,
 					      IB_CQ_NEXT_COMP |
 					      IB_CQ_REPORT_MISSED_EVENTS)) &&
-		    netif_rx_reschedule(dev, napi))
+		    netif_rx_reschedule(dev, 0))
 			goto poll_more;
-	}
+		ret = 0;
+	} else
+		ret = 1;
+
+	dev->quota -= done;
+	*budget -= done;
 
-	return done;
+	return ret;
 }
 
 void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr)
 {
-	struct net_device *dev = dev_ptr;
-	struct ipoib_dev_priv *priv = netdev_priv(dev);
-
-	netif_rx_schedule(dev, &priv->napi);
+	netif_rx_schedule(dev_ptr);
 }
 
 static inline int post_send(struct ipoib_dev_priv *priv,
Index: ofed_kernel-2.6.23/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
--- ofed_kernel-2.6.23.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2007-11-13 11:56:43.000000000 +0200
+++ ofed_kernel-2.6.23/drivers/infiniband/ulp/ipoib/ipoib_main.c	2007-11-13 11:56:48.000000000 +0200
@@ -101,20 +101,16 @@ int ipoib_open(struct net_device *dev)
 
 	ipoib_dbg(priv, "bringing up interface\n");
 
-	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;
 	}
 
@@ -147,7 +143,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);
 
@@ -805,7 +800,7 @@ static void ipoib_timeout(struct net_dev
 static int ipoib_hard_header(struct sk_buff *skb,
 			     struct net_device *dev,
 			     unsigned short type,
-			     const void *daddr, const void *saddr, unsigned len)
+			     void *daddr, void *saddr, unsigned len)
 {
 	struct ipoib_header *header;
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -980,10 +975,6 @@ void ipoib_dev_cleanup(struct net_device
 	priv->tx_ring = NULL;
 }
 
-static const struct header_ops ipoib_header_ops = {
-	.create	= ipoib_hard_header,
-};
-
 static void ipoib_setup(struct net_device *dev)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -993,13 +984,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;
-	dev->header_ops 	 = &ipoib_header_ops;
+	dev->hard_header         = ipoib_hard_header;
 	dev->set_multicast_list  = ipoib_set_mcast_list;
 	dev->neigh_setup         = ipoib_neigh_setup_dev;
-
 	ipoib_set_ethtool_ops(dev);
+	dev->poll                = ipoib_poll;
+	dev->weight              = 100;
 
-	netif_napi_add(dev, &priv->napi, ipoib_poll, 100);
 
 	dev->watchdog_timeo 	 = HZ;
 







More information about the ewg mailing list