Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2dfbfc37121d307e1f1d24c2979382cb17b19347
Commit:     2dfbfc37121d307e1f1d24c2979382cb17b19347
Parent:     8fd357a6e3375083f7d321413eb8f6739491f342
Author:     Michael S. Tsirkin <[EMAIL PROTECTED]>
AuthorDate: Thu May 24 18:32:46 2007 +0300
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Thu May 24 14:02:40 2007 -0700

    IPoIB/cm: Drain cq in ipoib_cm_dev_stop()
    
    Since NAPI polling is disabled while ipoib_cm_dev_stop() is running,
    ipoib_cm_dev_stop() must poll the CQ itself in order to see the
    packets draining.
    
    Signed-off-by: Michael S. Tsirkin <[EMAIL PROTECTED]>
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/ulp/ipoib/ipoib.h    |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_ib.c |   31 +++++++++++++++++++------------
 3 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h 
b/drivers/infiniband/ulp/ipoib/ipoib.h
index a0b3782..158759e 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -429,6 +429,7 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned 
short pkey);
 
 void ipoib_pkey_poll(struct work_struct *work);
 int ipoib_pkey_dev_delay_open(struct net_device *dev);
+void ipoib_drain_cq(struct net_device *dev);
 
 #ifdef CONFIG_INFINIBAND_IPOIB_CM
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c 
b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index e8fcd62..f133b56 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -726,6 +726,7 @@ void ipoib_cm_dev_stop(struct net_device *dev)
                }
                spin_unlock_irq(&priv->lock);
                msleep(1);
+               ipoib_drain_cq(dev);
                spin_lock_irq(&priv->lock);
        }
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c 
b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index c1aad06..8404f05 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -550,13 +550,30 @@ static int recvs_pending(struct net_device *dev)
        return pending;
 }
 
+void ipoib_drain_cq(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       int i, n;
+       do {
+               n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc);
+               for (i = 0; i < n; ++i) {
+                       if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ)
+                               ipoib_cm_handle_rx_wc(dev, priv->ibwc + i);
+                       else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV)
+                               ipoib_ib_handle_rx_wc(dev, priv->ibwc + i);
+                       else
+                               ipoib_ib_handle_tx_wc(dev, priv->ibwc + i);
+               }
+       } while (n == IPOIB_NUM_WC);
+}
+
 int ipoib_ib_dev_stop(struct net_device *dev, int flush)
 {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ib_qp_attr qp_attr;
        unsigned long begin;
        struct ipoib_tx_buf *tx_req;
-       int i, n;
+       int i;
 
        clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
        netif_poll_disable(dev);
@@ -611,17 +628,7 @@ int ipoib_ib_dev_stop(struct net_device *dev, int flush)
                        goto timeout;
                }
 
-               do {
-                       n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc);
-                       for (i = 0; i < n; ++i) {
-                               if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ)
-                                       ipoib_cm_handle_rx_wc(dev, priv->ibwc + 
i);
-                               else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV)
-                                       ipoib_ib_handle_rx_wc(dev, priv->ibwc + 
i);
-                               else
-                                       ipoib_ib_handle_tx_wc(dev, priv->ibwc + 
i);
-                       }
-               } while (n == IPOIB_NUM_WC);
+               ipoib_drain_cq(dev);
 
                msleep(1);
        }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to