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

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

IPoIB: Fix hang in napi_disable() if P_Key is never found



After commit fe25c561 ("IPoIB: Don't enable NAPI when it's already
enabled"), if an interface is brought up but the corresponding P_Key
never appears, then ipoib_stop() will hang in napi_disable(), because
ipoib_open() returns before it does napi_enable().

Fix this by changing ipoib_open() to call napi_enable() even if the
P_Key isn't present.

Reported-by: default avatarYossi Etigin <yosefe@Voltaire.COM>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent e0b325d3
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -106,23 +106,17 @@ int ipoib_open(struct net_device *dev)

	ipoib_dbg(priv, "bringing up interface\n");

	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
		napi_enable(&priv->napi);

	if (ipoib_pkey_dev_delay_open(dev))
		return 0;

	napi_enable(&priv->napi);
	if (ipoib_ib_dev_open(dev))
		goto err_disable;

	if (ipoib_ib_dev_open(dev)) {
		napi_disable(&priv->napi);
		return -EINVAL;
	}

	if (ipoib_ib_dev_up(dev)) {
		ipoib_ib_dev_stop(dev, 1);
		napi_disable(&priv->napi);
		return -EINVAL;
	}
	if (ipoib_ib_dev_up(dev))
		goto err_stop;

	if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
		struct ipoib_dev_priv *cpriv;
@@ -144,6 +138,15 @@ int ipoib_open(struct net_device *dev)
	netif_start_queue(dev);

	return 0;

err_stop:
	ipoib_ib_dev_stop(dev, 1);

err_disable:
	napi_disable(&priv->napi);
	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);

	return -EINVAL;
}

static int ipoib_stop(struct net_device *dev)