Commit 3f5ec374 authored by Lijun Pan's avatar Lijun Pan Committed by Jakub Kicinski
Browse files

ibmvnic: merge do_change_param_reset into do_reset



Commit b27507bb ("net/ibmvnic: unlock rtnl_lock in reset so
linkwatch_event can run") introduced do_change_param_reset function to
solve the rtnl lock issue. Majority of the code in do_change_param_reset
duplicates do_reset. Also, we can handle the rtnl lock issue in do_reset
itself. Hence merge do_change_param_reset back into do_reset to clean up
the code.

Signed-off-by: default avatarLijun Pan <ljp@linux.ibm.com>
Link: https://lore.kernel.org/r/20210106213514.76027-1-ljp@linux.ibm.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 09b5b5fb
Loading
Loading
Loading
Loading
+44 −110
Original line number Diff line number Diff line
@@ -1925,92 +1925,6 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
	return rc;
}

/**
 * do_change_param_reset returns zero if we are able to keep processing reset
 * events, or non-zero if we hit a fatal error and must halt.
 */
static int do_change_param_reset(struct ibmvnic_adapter *adapter,
				 struct ibmvnic_rwi *rwi,
				 u32 reset_state)
{
	struct net_device *netdev = adapter->netdev;
	int i, rc;

	netdev_dbg(adapter->netdev, "Change param resetting driver (%d)\n",
		   rwi->reset_reason);

	netif_carrier_off(netdev);
	adapter->reset_reason = rwi->reset_reason;

	ibmvnic_cleanup(netdev);

	if (reset_state == VNIC_OPEN) {
		rc = __ibmvnic_close(netdev);
		if (rc)
			goto out;
	}

	release_resources(adapter);
	release_sub_crqs(adapter, 1);
	release_crq_queue(adapter);

	adapter->state = VNIC_PROBED;

	rc = init_crq_queue(adapter);

	if (rc) {
		netdev_err(adapter->netdev,
			   "Couldn't initialize crq. rc=%d\n", rc);
		return rc;
	}

	rc = ibmvnic_reset_init(adapter, true);
	if (rc) {
		rc = IBMVNIC_INIT_FAILED;
		goto out;
	}

	/* If the adapter was in PROBE state prior to the reset,
	 * exit here.
	 */
	if (reset_state == VNIC_PROBED)
		goto out;

	rc = ibmvnic_login(netdev);
	if (rc) {
		goto out;
	}

	rc = init_resources(adapter);
	if (rc)
		goto out;

	ibmvnic_disable_irqs(adapter);

	adapter->state = VNIC_CLOSED;

	if (reset_state == VNIC_CLOSED)
		return 0;

	rc = __ibmvnic_open(netdev);
	if (rc) {
		rc = IBMVNIC_OPEN_FAILED;
		goto out;
	}

	/* refresh device's multicast list */
	ibmvnic_set_multi(netdev);

	/* kick napi */
	for (i = 0; i < adapter->req_rx_queues; i++)
		napi_schedule(&adapter->napi[i]);

out:
	if (rc)
		adapter->state = reset_state;
	return rc;
}

/**
 * do_reset returns zero if we are able to keep processing reset events, or
 * non-zero if we hit a fatal error and must halt.
@@ -2028,7 +1942,11 @@ static int do_reset(struct ibmvnic_adapter *adapter,
		   adapter->state, adapter->failover_pending,
		   rwi->reset_reason, reset_state);

	adapter->reset_reason = rwi->reset_reason;
	/* requestor of VNIC_RESET_CHANGE_PARAM already has the rtnl lock */
	if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM))
		rtnl_lock();

	/*
	 * Now that we have the rtnl lock, clear any pending failover.
	 * This will ensure ibmvnic_open() has either completed or will
@@ -2038,7 +1956,6 @@ static int do_reset(struct ibmvnic_adapter *adapter,
		adapter->failover_pending = false;

	netif_carrier_off(netdev);
	adapter->reset_reason = rwi->reset_reason;

	old_num_rx_queues = adapter->req_rx_queues;
	old_num_tx_queues = adapter->req_tx_queues;
@@ -2050,6 +1967,11 @@ static int do_reset(struct ibmvnic_adapter *adapter,
	if (reset_state == VNIC_OPEN &&
	    adapter->reset_reason != VNIC_RESET_MOBILITY &&
	    adapter->reset_reason != VNIC_RESET_FAILOVER) {
		if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {
			rc = __ibmvnic_close(netdev);
			if (rc)
				goto out;
		} else {
			adapter->state = VNIC_CLOSING;

			/* Release the RTNL lock before link state change and
@@ -2070,6 +1992,13 @@ static int do_reset(struct ibmvnic_adapter *adapter,

			adapter->state = VNIC_CLOSED;
		}
	}

	if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {
		release_resources(adapter);
		release_sub_crqs(adapter, 1);
		release_crq_queue(adapter);
	}

	if (adapter->reset_reason != VNIC_RESET_NON_FATAL) {
		/* remove the closed state so when we call open it appears
@@ -2077,7 +2006,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
		 */
		adapter->state = VNIC_PROBED;

		if (adapter->reset_reason == VNIC_RESET_MOBILITY) {
		if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {
			rc = init_crq_queue(adapter);
		} else if (adapter->reset_reason == VNIC_RESET_MOBILITY) {
			rc = ibmvnic_reenable_crq_queue(adapter);
			release_sub_crqs(adapter, 1);
		} else {
@@ -2116,7 +2047,11 @@ static int do_reset(struct ibmvnic_adapter *adapter,
			goto out;
		}

		if (adapter->req_rx_queues != old_num_rx_queues ||
		if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {
			rc = init_resources(adapter);
			if (rc)
				goto out;
		} else if (adapter->req_rx_queues != old_num_rx_queues ||
		    adapter->req_tx_queues != old_num_tx_queues ||
		    adapter->req_rx_add_entries_per_subcrq !=
		    old_num_rx_slots ||
@@ -2181,6 +2116,8 @@ static int do_reset(struct ibmvnic_adapter *adapter,
	/* restore the adapter state if reset failed */
	if (rc)
		adapter->state = reset_state;
	/* requestor of VNIC_RESET_CHANGE_PARAM should still hold the rtnl lock */
	if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM))
		rtnl_unlock();

	netdev_dbg(adapter->netdev, "[S:%d FOP:%d] Reset done, rc %d\n",
@@ -2312,10 +2249,7 @@ static void __ibmvnic_reset(struct work_struct *work)
		}
		spin_unlock_irqrestore(&adapter->state_lock, flags);

		if (rwi->reset_reason == VNIC_RESET_CHANGE_PARAM) {
			/* CHANGE_PARAM requestor holds rtnl_lock */
			rc = do_change_param_reset(adapter, rwi, reset_state);
		} else if (adapter->force_reset_recovery) {
		if (adapter->force_reset_recovery) {
			/*
			 * Since we are doing a hard reset now, clear the
			 * failover_pending flag so we don't ignore any