IPoIB: Make sure no receives are handled when stopping device
authorRoland Dreier <rolandd@cisco.com>
Wed, 10 Oct 2007 02:59:04 +0000 (19:59 -0700)
committerRoland Dreier <rolandd@cisco.com>
Wed, 10 Oct 2007 02:59:04 +0000 (19:59 -0700)
The current IPoIB code might process receive completions from
ipoib_drain_cq() when bringing down the interface.  This could cause
packets to be passed up the stack without the device's poll method
being called.  Avoid this by setting the status of any successful
completions to IB_WC_WR_FLUSH_ERR.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/ipoib/ipoib_ib.c

index 10944888cffd79de3c8b4751ceac2929a0296141..5a70e287f25d5592c9bd7cf6b3d972bf63869708 100644 (file)
@@ -558,6 +558,14 @@ void ipoib_drain_cq(struct net_device *dev)
        do {
                n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc);
                for (i = 0; i < n; ++i) {
+                       /*
+                        * Convert any successful completions to flush
+                        * errors to avoid passing packets up the
+                        * stack after bringing the device down.
+                        */
+                       if (priv->ibwc[i].status == IB_WC_SUCCESS)
+                               priv->ibwc[i].status = IB_WC_WR_FLUSH_ERR;
+
                        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)