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 <[EMAIL PROTECTED]>

---

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;
 




_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to