[ofa-general] Re: [PATCH] IB/ipoib: drain cq in dev_stop

Roland Dreier rdreier at cisco.com
Mon Aug 13 10:20:04 PDT 2007


FWIW, I just added this to my for-2.6.24 branch:

commit c529c1d566008981622518405d2b60026f3a7b7e
Author: Roland Dreier <rolandd at cisco.com>
Date:   Mon Aug 13 10:19:36 2007 -0700

    IPoIB: Make sure no receives are handled when stopping device
    
    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 at cisco.com>

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 1094488..5a70e28 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -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)



More information about the general mailing list