Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce423ef5 authored by Roland Dreier's avatar Roland Dreier
Browse files

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: default avatarRoland Dreier <rolandd@cisco.com>
parent e54664c0
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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)