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

Commit 023bff1b authored by Alex Vesker's avatar Alex Vesker Committed by Greg Kroah-Hartman
Browse files

IB/ipoib: Grab rtnl lock on heavy flush when calling ndo_open/stop




[ Upstream commit b4b678b06f6eef18bff44a338c01870234db0bc9 ]

When ndo_open and ndo_stop are called RTNL lock should be held.
In this specific case ipoib_ib_dev_open calls the offloaded ndo_open
which re-sets the number of TX queue assuming RTNL lock is held.
Since RTNL lock is not held, RTNL assert will fail.

Signed-off-by: default avatarAlex Vesker <valex@mellanox.com>
Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 02ef1dd3
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -1203,10 +1203,15 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv,
		ipoib_ib_dev_down(dev);

	if (level == IPOIB_FLUSH_HEAVY) {
		rtnl_lock();
		if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
			ipoib_ib_dev_stop(dev);
		if (ipoib_ib_dev_open(dev) != 0)

		result = ipoib_ib_dev_open(dev);
		rtnl_unlock();
		if (result)
			return;

		if (netif_queue_stopped(dev))
			netif_start_queue(dev);
	}