|
Michal Suchanek |
b98fa3 |
From 3f5ec374ae3f3d5381622e29319a22c4ecd09413 Mon Sep 17 00:00:00 2001
|
|
Michal Suchanek |
b98fa3 |
From: Lijun Pan <ljp@linux.ibm.com>
|
|
Michal Suchanek |
b98fa3 |
Date: Wed, 6 Jan 2021 15:35:14 -0600
|
|
Michal Suchanek |
b98fa3 |
Subject: [PATCH] ibmvnic: merge do_change_param_reset into do_reset
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
References: bsc#1184114 ltc#192237 bsc#1183871 ltc#192139
|
|
Michal Suchanek |
b98fa3 |
Patch-mainline: v5.12-rc1
|
|
Michal Suchanek |
b98fa3 |
Git-commit: 3f5ec374ae3f3d5381622e29319a22c4ecd09413
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
Commit b27507bb59ed ("net/ibmvnic: unlock rtnl_lock in reset so
|
|
Michal Suchanek |
b98fa3 |
linkwatch_event can run") introduced do_change_param_reset function to
|
|
Michal Suchanek |
b98fa3 |
solve the rtnl lock issue. Majority of the code in do_change_param_reset
|
|
Michal Suchanek |
b98fa3 |
duplicates do_reset. Also, we can handle the rtnl lock issue in do_reset
|
|
Michal Suchanek |
b98fa3 |
itself. Hence merge do_change_param_reset back into do_reset to clean up
|
|
Michal Suchanek |
b98fa3 |
the code.
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
Signed-off-by: Lijun Pan <ljp@linux.ibm.com>
|
|
Michal Suchanek |
b98fa3 |
Link: https://lore.kernel.org/r/20210106213514.76027-1-ljp@linux.ibm.com
|
|
Michal Suchanek |
b98fa3 |
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
Michal Suchanek |
b98fa3 |
Acked-by: Michal Suchanek <msuchanek@suse.de>
|
|
Michal Suchanek |
b98fa3 |
---
|
|
Michal Suchanek |
b98fa3 |
drivers/net/ethernet/ibm/ibmvnic.c | 154 +++++++++--------------------
|
|
Michal Suchanek |
b98fa3 |
1 file changed, 44 insertions(+), 110 deletions(-)
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
|
|
Michal Suchanek |
b98fa3 |
index 9778c83150f1..aed985e08e8a 100644
|
|
Michal Suchanek |
b98fa3 |
--- a/drivers/net/ethernet/ibm/ibmvnic.c
|
|
Michal Suchanek |
b98fa3 |
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
|
|
Michal Suchanek |
b98fa3 |
@@ -1925,92 +1925,6 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
|
|
Michal Suchanek |
b98fa3 |
return rc;
|
|
Michal Suchanek |
b98fa3 |
}
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
-/**
|
|
Michal Suchanek |
b98fa3 |
- * do_change_param_reset returns zero if we are able to keep processing reset
|
|
Michal Suchanek |
b98fa3 |
- * events, or non-zero if we hit a fatal error and must halt.
|
|
Michal Suchanek |
b98fa3 |
- */
|
|
Michal Suchanek |
b98fa3 |
-static int do_change_param_reset(struct ibmvnic_adapter *adapter,
|
|
Michal Suchanek |
b98fa3 |
- struct ibmvnic_rwi *rwi,
|
|
Michal Suchanek |
b98fa3 |
- u32 reset_state)
|
|
Michal Suchanek |
b98fa3 |
-{
|
|
Michal Suchanek |
b98fa3 |
- struct net_device *netdev = adapter->netdev;
|
|
Michal Suchanek |
b98fa3 |
- int i, rc;
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- netdev_dbg(adapter->netdev, "Change param resetting driver (%d)\n",
|
|
Michal Suchanek |
b98fa3 |
- rwi->reset_reason);
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- netif_carrier_off(netdev);
|
|
Michal Suchanek |
b98fa3 |
- adapter->reset_reason = rwi->reset_reason;
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- ibmvnic_cleanup(netdev);
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- if (reset_state == VNIC_OPEN) {
|
|
Michal Suchanek |
b98fa3 |
- rc = __ibmvnic_close(netdev);
|
|
Michal Suchanek |
b98fa3 |
- if (rc)
|
|
Michal Suchanek |
b98fa3 |
- goto out;
|
|
Michal Suchanek |
b98fa3 |
- }
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- release_resources(adapter);
|
|
Michal Suchanek |
b98fa3 |
- release_sub_crqs(adapter, 1);
|
|
Michal Suchanek |
b98fa3 |
- release_crq_queue(adapter);
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- adapter->state = VNIC_PROBED;
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- rc = init_crq_queue(adapter);
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- if (rc) {
|
|
Michal Suchanek |
b98fa3 |
- netdev_err(adapter->netdev,
|
|
Michal Suchanek |
b98fa3 |
- "Couldn't initialize crq. rc=%d\n", rc);
|
|
Michal Suchanek |
b98fa3 |
- return rc;
|
|
Michal Suchanek |
b98fa3 |
- }
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- rc = ibmvnic_reset_init(adapter, true);
|
|
Michal Suchanek |
b98fa3 |
- if (rc) {
|
|
Michal Suchanek |
b98fa3 |
- rc = IBMVNIC_INIT_FAILED;
|
|
Michal Suchanek |
b98fa3 |
- goto out;
|
|
Michal Suchanek |
b98fa3 |
- }
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- /* If the adapter was in PROBE state prior to the reset,
|
|
Michal Suchanek |
b98fa3 |
- * exit here.
|
|
Michal Suchanek |
b98fa3 |
- */
|
|
Michal Suchanek |
b98fa3 |
- if (reset_state == VNIC_PROBED)
|
|
Michal Suchanek |
b98fa3 |
- goto out;
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- rc = ibmvnic_login(netdev);
|
|
Michal Suchanek |
b98fa3 |
- if (rc) {
|
|
Michal Suchanek |
b98fa3 |
- goto out;
|
|
Michal Suchanek |
b98fa3 |
- }
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- rc = init_resources(adapter);
|
|
Michal Suchanek |
b98fa3 |
- if (rc)
|
|
Michal Suchanek |
b98fa3 |
- goto out;
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- ibmvnic_disable_irqs(adapter);
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- adapter->state = VNIC_CLOSED;
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- if (reset_state == VNIC_CLOSED)
|
|
Michal Suchanek |
b98fa3 |
- return 0;
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- rc = __ibmvnic_open(netdev);
|
|
Michal Suchanek |
b98fa3 |
- if (rc) {
|
|
Michal Suchanek |
b98fa3 |
- rc = IBMVNIC_OPEN_FAILED;
|
|
Michal Suchanek |
b98fa3 |
- goto out;
|
|
Michal Suchanek |
b98fa3 |
- }
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- /* refresh device's multicast list */
|
|
Michal Suchanek |
b98fa3 |
- ibmvnic_set_multi(netdev);
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
- /* kick napi */
|
|
Michal Suchanek |
b98fa3 |
- for (i = 0; i < adapter->req_rx_queues; i++)
|
|
Michal Suchanek |
b98fa3 |
- napi_schedule(&adapter->napi[i]);
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
-out:
|
|
Michal Suchanek |
b98fa3 |
- if (rc)
|
|
Michal Suchanek |
b98fa3 |
- adapter->state = reset_state;
|
|
Michal Suchanek |
b98fa3 |
- return rc;
|
|
Michal Suchanek |
b98fa3 |
-}
|
|
Michal Suchanek |
b98fa3 |
-
|
|
Michal Suchanek |
b98fa3 |
/**
|
|
Michal Suchanek |
b98fa3 |
* do_reset returns zero if we are able to keep processing reset events, or
|
|
Michal Suchanek |
b98fa3 |
* non-zero if we hit a fatal error and must halt.
|
|
Michal Suchanek |
b98fa3 |
@@ -2028,7 +1942,11 @@ static int do_reset(struct ibmvnic_adapter *adapter,
|
|
Michal Suchanek |
b98fa3 |
adapter->state, adapter->failover_pending,
|
|
Michal Suchanek |
b98fa3 |
rwi->reset_reason, reset_state);
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
- rtnl_lock();
|
|
Michal Suchanek |
b98fa3 |
+ adapter->reset_reason = rwi->reset_reason;
|
|
Michal Suchanek |
b98fa3 |
+ /* requestor of VNIC_RESET_CHANGE_PARAM already has the rtnl lock */
|
|
Michal Suchanek |
b98fa3 |
+ if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM))
|
|
Michal Suchanek |
b98fa3 |
+ rtnl_lock();
|
|
Michal Suchanek |
b98fa3 |
+
|
|
Michal Suchanek |
b98fa3 |
/*
|
|
Michal Suchanek |
b98fa3 |
* Now that we have the rtnl lock, clear any pending failover.
|
|
Michal Suchanek |
b98fa3 |
* This will ensure ibmvnic_open() has either completed or will
|
|
Michal Suchanek |
b98fa3 |
@@ -2038,7 +1956,6 @@ static int do_reset(struct ibmvnic_adapter *adapter,
|
|
Michal Suchanek |
b98fa3 |
adapter->failover_pending = false;
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
netif_carrier_off(netdev);
|
|
Michal Suchanek |
b98fa3 |
- adapter->reset_reason = rwi->reset_reason;
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
old_num_rx_queues = adapter->req_rx_queues;
|
|
Michal Suchanek |
b98fa3 |
old_num_tx_queues = adapter->req_tx_queues;
|
|
Michal Suchanek |
b98fa3 |
@@ -2050,25 +1967,37 @@ static int do_reset(struct ibmvnic_adapter *adapter,
|
|
Michal Suchanek |
b98fa3 |
if (reset_state == VNIC_OPEN &&
|
|
Michal Suchanek |
b98fa3 |
adapter->reset_reason != VNIC_RESET_MOBILITY &&
|
|
Michal Suchanek |
b98fa3 |
adapter->reset_reason != VNIC_RESET_FAILOVER) {
|
|
Michal Suchanek |
b98fa3 |
- adapter->state = VNIC_CLOSING;
|
|
Michal Suchanek |
b98fa3 |
+ if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {
|
|
Michal Suchanek |
b98fa3 |
+ rc = __ibmvnic_close(netdev);
|
|
Michal Suchanek |
b98fa3 |
+ if (rc)
|
|
Michal Suchanek |
b98fa3 |
+ goto out;
|
|
Michal Suchanek |
b98fa3 |
+ } else {
|
|
Michal Suchanek |
b98fa3 |
+ adapter->state = VNIC_CLOSING;
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
- /* Release the RTNL lock before link state change and
|
|
Michal Suchanek |
b98fa3 |
- * re-acquire after the link state change to allow
|
|
Michal Suchanek |
b98fa3 |
- * linkwatch_event to grab the RTNL lock and run during
|
|
Michal Suchanek |
b98fa3 |
- * a reset.
|
|
Michal Suchanek |
b98fa3 |
- */
|
|
Michal Suchanek |
b98fa3 |
- rtnl_unlock();
|
|
Michal Suchanek |
b98fa3 |
- rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN);
|
|
Michal Suchanek |
b98fa3 |
- rtnl_lock();
|
|
Michal Suchanek |
b98fa3 |
- if (rc)
|
|
Michal Suchanek |
b98fa3 |
- goto out;
|
|
Michal Suchanek |
b98fa3 |
+ /* Release the RTNL lock before link state change and
|
|
Michal Suchanek |
b98fa3 |
+ * re-acquire after the link state change to allow
|
|
Michal Suchanek |
b98fa3 |
+ * linkwatch_event to grab the RTNL lock and run during
|
|
Michal Suchanek |
b98fa3 |
+ * a reset.
|
|
Michal Suchanek |
b98fa3 |
+ */
|
|
Michal Suchanek |
b98fa3 |
+ rtnl_unlock();
|
|
Michal Suchanek |
b98fa3 |
+ rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN);
|
|
Michal Suchanek |
b98fa3 |
+ rtnl_lock();
|
|
Michal Suchanek |
b98fa3 |
+ if (rc)
|
|
Michal Suchanek |
b98fa3 |
+ goto out;
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
- if (adapter->state != VNIC_CLOSING) {
|
|
Michal Suchanek |
b98fa3 |
- rc = -1;
|
|
Michal Suchanek |
b98fa3 |
- goto out;
|
|
Michal Suchanek |
b98fa3 |
+ if (adapter->state != VNIC_CLOSING) {
|
|
Michal Suchanek |
b98fa3 |
+ rc = -1;
|
|
Michal Suchanek |
b98fa3 |
+ goto out;
|
|
Michal Suchanek |
b98fa3 |
+ }
|
|
Michal Suchanek |
b98fa3 |
+
|
|
Michal Suchanek |
b98fa3 |
+ adapter->state = VNIC_CLOSED;
|
|
Michal Suchanek |
b98fa3 |
}
|
|
Michal Suchanek |
b98fa3 |
+ }
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
- adapter->state = VNIC_CLOSED;
|
|
Michal Suchanek |
b98fa3 |
+ if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {
|
|
Michal Suchanek |
b98fa3 |
+ release_resources(adapter);
|
|
Michal Suchanek |
b98fa3 |
+ release_sub_crqs(adapter, 1);
|
|
Michal Suchanek |
b98fa3 |
+ release_crq_queue(adapter);
|
|
Michal Suchanek |
b98fa3 |
}
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
if (adapter->reset_reason != VNIC_RESET_NON_FATAL) {
|
|
Michal Suchanek |
b98fa3 |
@@ -2077,7 +2006,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
|
|
Michal Suchanek |
b98fa3 |
*/
|
|
Michal Suchanek |
b98fa3 |
adapter->state = VNIC_PROBED;
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
- if (adapter->reset_reason == VNIC_RESET_MOBILITY) {
|
|
Michal Suchanek |
b98fa3 |
+ if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {
|
|
Michal Suchanek |
b98fa3 |
+ rc = init_crq_queue(adapter);
|
|
Michal Suchanek |
b98fa3 |
+ } else if (adapter->reset_reason == VNIC_RESET_MOBILITY) {
|
|
Michal Suchanek |
b98fa3 |
rc = ibmvnic_reenable_crq_queue(adapter);
|
|
Michal Suchanek |
b98fa3 |
release_sub_crqs(adapter, 1);
|
|
Michal Suchanek |
b98fa3 |
} else {
|
|
Michal Suchanek |
b98fa3 |
@@ -2116,7 +2047,11 @@ static int do_reset(struct ibmvnic_adapter *adapter,
|
|
Michal Suchanek |
b98fa3 |
goto out;
|
|
Michal Suchanek |
b98fa3 |
}
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
- if (adapter->req_rx_queues != old_num_rx_queues ||
|
|
Michal Suchanek |
b98fa3 |
+ if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {
|
|
Michal Suchanek |
b98fa3 |
+ rc = init_resources(adapter);
|
|
Michal Suchanek |
b98fa3 |
+ if (rc)
|
|
Michal Suchanek |
b98fa3 |
+ goto out;
|
|
Michal Suchanek |
b98fa3 |
+ } else if (adapter->req_rx_queues != old_num_rx_queues ||
|
|
Michal Suchanek |
b98fa3 |
adapter->req_tx_queues != old_num_tx_queues ||
|
|
Michal Suchanek |
b98fa3 |
adapter->req_rx_add_entries_per_subcrq !=
|
|
Michal Suchanek |
b98fa3 |
old_num_rx_slots ||
|
|
Michal Suchanek |
b98fa3 |
@@ -2181,7 +2116,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
|
|
Michal Suchanek |
b98fa3 |
/* restore the adapter state if reset failed */
|
|
Michal Suchanek |
b98fa3 |
if (rc)
|
|
Michal Suchanek |
b98fa3 |
adapter->state = reset_state;
|
|
Michal Suchanek |
b98fa3 |
- rtnl_unlock();
|
|
Michal Suchanek |
b98fa3 |
+ /* requestor of VNIC_RESET_CHANGE_PARAM should still hold the rtnl lock */
|
|
Michal Suchanek |
b98fa3 |
+ if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM))
|
|
Michal Suchanek |
b98fa3 |
+ rtnl_unlock();
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
netdev_dbg(adapter->netdev, "[S:%d FOP:%d] Reset done, rc %d\n",
|
|
Michal Suchanek |
b98fa3 |
adapter->state, adapter->failover_pending, rc);
|
|
Michal Suchanek |
b98fa3 |
@@ -2312,10 +2249,7 @@ static void __ibmvnic_reset(struct work_struct *work)
|
|
Michal Suchanek |
b98fa3 |
}
|
|
Michal Suchanek |
b98fa3 |
spin_unlock_irqrestore(&adapter->state_lock, flags);
|
|
Michal Suchanek |
b98fa3 |
|
|
Michal Suchanek |
b98fa3 |
- if (rwi->reset_reason == VNIC_RESET_CHANGE_PARAM) {
|
|
Michal Suchanek |
b98fa3 |
- /* CHANGE_PARAM requestor holds rtnl_lock */
|
|
Michal Suchanek |
b98fa3 |
- rc = do_change_param_reset(adapter, rwi, reset_state);
|
|
Michal Suchanek |
b98fa3 |
- } else if (adapter->force_reset_recovery) {
|
|
Michal Suchanek |
b98fa3 |
+ if (adapter->force_reset_recovery) {
|
|
Michal Suchanek |
b98fa3 |
/*
|
|
Michal Suchanek |
b98fa3 |
* Since we are doing a hard reset now, clear the
|
|
Michal Suchanek |
b98fa3 |
* failover_pending flag so we don't ignore any
|
|
Michal Suchanek |
b98fa3 |
--
|
|
Michal Suchanek |
b98fa3 |
2.26.2
|
|
Michal Suchanek |
b98fa3 |
|