* [Intel-wired-lan] [PATCH net v2 2/2] iavf: Fix init and watchdog state machines
@ 2021-06-11 9:59 Mateusz Palczewski
2021-06-11 12:58 ` Stefan Assmann
0 siblings, 1 reply; 2+ messages in thread
From: Mateusz Palczewski @ 2021-06-11 9:59 UTC (permalink / raw)
To: intel-wired-lan
From: Jan Sokolowski <jan.sokolowski@intel.com>
Use single state machine for driver initialization
and for service initialized driver. The init state
machine implemented in init_task() is merged
into the watchdog_task(). The init_task() function
is removed.
Testing-Hints: Change is only for VF driver state machine,
should be checked load/unload/reset and
set/get driver parameters.
Fixes: bac8486116b0 ("iavf: Refactor the watchdog state machine")
Signed-off-by: Jakub Pawlak <jakub.pawlak@intel.com>
Signed-off-by: Jan Sokolowski <jan.sokolowski@intel.com>
Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
---
v2: Splitted the patch into 2 to make them smaller
---
drivers/net/ethernet/intel/iavf/iavf.h | 2 +-
drivers/net/ethernet/intel/iavf/iavf_main.c | 156 +++++++++-----------
2 files changed, 74 insertions(+), 84 deletions(-)
diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h
index e13d2d1..5967db9 100644
--- a/drivers/net/ethernet/intel/iavf/iavf.h
+++ b/drivers/net/ethernet/intel/iavf/iavf.h
@@ -176,6 +176,7 @@ enum iavf_state_t {
__IAVF_INIT_VERSION_CHECK, /* aq msg sent, awaiting reply */
__IAVF_INIT_GET_RESOURCES, /* aq msg sent, awaiting reply */
__IAVF_INIT_SW, /* got resources, setting up structs */
+ __IAVF_INIT_FAILED, /* init failed, restarting procedure */
__IAVF_RESETTING, /* in reset */
__IAVF_COMM_FAILED, /* communication with PF failed */
/* Below here, watchdog is running */
@@ -231,7 +232,6 @@ struct iavf_adapter {
struct work_struct reset_task;
struct work_struct adminq_task;
struct delayed_work client_task;
- struct delayed_work init_task;
wait_queue_head_t down_waitqueue;
struct iavf_q_vector *q_vectors;
struct list_head vlan_filter_list;
diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c
index 7c264e4..58536e1 100644
--- a/drivers/net/ethernet/intel/iavf/iavf_main.c
+++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
@@ -14,7 +14,7 @@
static int iavf_setup_all_tx_resources(struct iavf_adapter *adapter);
static int iavf_setup_all_rx_resources(struct iavf_adapter *adapter);
static int iavf_close(struct net_device *netdev);
-static int iavf_init_get_resources(struct iavf_adapter *adapter);
+static void iavf_init_get_resources(struct iavf_adapter *adapter);
static int iavf_check_reset_complete(struct iavf_hw *hw);
char iavf_driver_name[] = "iavf";
@@ -1671,9 +1671,9 @@ static int iavf_process_aq_command(struct iavf_adapter *adapter)
*
* Function process __IAVF_STARTUP driver state.
* When success the state is changed to __IAVF_INIT_VERSION_CHECK
- * when fails it returns -EAGAIN
+ * when fails the state is changed to __IAVF_INIT_FAILED
**/
-static int iavf_startup(struct iavf_adapter *adapter)
+static void iavf_startup(struct iavf_adapter *adapter)
{
struct pci_dev *pdev = adapter->pdev;
struct iavf_hw *hw = &adapter->hw;
@@ -1713,8 +1713,9 @@ static int iavf_startup(struct iavf_adapter *adapter)
goto err;
}
iavf_change_state(adapter, __IAVF_INIT_VERSION_CHECK);
+ return;
err:
- return err;
+ iavf_change_state(adapter, __IAVF_INIT_FAILED);
}
/**
@@ -1723,9 +1724,9 @@ err:
*
* Function process __IAVF_INIT_VERSION_CHECK driver state.
* When success the state is changed to __IAVF_INIT_GET_RESOURCES
- * when fails it returns -EAGAIN
+ * when fails the state is changed to __IAVF_INIT_FAILED
**/
-static int iavf_init_version_check(struct iavf_adapter *adapter)
+static void iavf_init_version_check(struct iavf_adapter *adapter)
{
struct pci_dev *pdev = adapter->pdev;
struct iavf_hw *hw = &adapter->hw;
@@ -1760,8 +1761,9 @@ static int iavf_init_version_check(struct iavf_adapter *adapter)
goto err;
}
iavf_change_state(adapter, __IAVF_INIT_GET_RESOURCES);
+ return;
err:
- return err;
+ iavf_change_state(adapter, __IAVF_INIT_FAILED);
}
/**
@@ -1771,9 +1773,9 @@ err:
* Function process __IAVF_INIT_GET_RESOURCES driver state and
* finishes driver initialization procedure.
* When success the state is changed to __IAVF_DOWN
- * when fails it returns -EAGAIN
+ * when fails it changes state to __IAVF_INIT_FAILED;
**/
-static int iavf_init_get_resources(struct iavf_adapter *adapter)
+static void iavf_init_get_resources(struct iavf_adapter *adapter)
{
struct net_device *netdev = adapter->netdev;
struct pci_dev *pdev = adapter->pdev;
@@ -1801,7 +1803,7 @@ static int iavf_init_get_resources(struct iavf_adapter *adapter)
*/
iavf_shutdown_adminq(hw);
dev_err(&pdev->dev, "Unable to get VF config due to PF error condition, not retrying\n");
- return 0;
+ return;
}
if (err) {
dev_err(&pdev->dev, "Unable to get VF config (%d)\n", err);
@@ -1893,7 +1895,7 @@ static int iavf_init_get_resources(struct iavf_adapter *adapter)
else
iavf_init_rss(adapter);
- return err;
+ return;
err_mem:
iavf_free_rss(adapter);
err_register:
@@ -1904,7 +1906,7 @@ err_alloc:
kfree(adapter->vf_res);
adapter->vf_res = NULL;
err:
- return err;
+ iavf_change_state(adapter, __IAVF_INIT_FAILED);
}
/**
@@ -1931,7 +1933,49 @@ static void iavf_watchdog_task(struct work_struct *work)
if (adapter->flags & IAVF_FLAG_PF_COMMS_FAILED)
iavf_change_state(adapter, __IAVF_COMM_FAILED);
+ if (adapter->flags & IAVF_FLAG_RESET_NEEDED &&
+ adapter->state != __IAVF_RESETTING) {
+ iavf_change_state(adapter, __IAVF_RESETTING);
+ adapter->aq_required = 0;
+ adapter->current_op = VIRTCHNL_OP_UNKNOWN;
+ }
+
switch (adapter->state) {
+ case __IAVF_STARTUP:
+ iavf_startup(adapter);
+ clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
+ queue_delayed_work(iavf_wq, &adapter->watchdog_task,
+ msecs_to_jiffies(30));
+ return;
+ case __IAVF_INIT_VERSION_CHECK:
+ iavf_init_version_check(adapter);
+ clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
+ queue_delayed_work(iavf_wq, &adapter->watchdog_task,
+ msecs_to_jiffies(30));
+ return;
+ case __IAVF_INIT_GET_RESOURCES:
+ iavf_init_get_resources(adapter);
+ clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
+ queue_delayed_work(iavf_wq, &adapter->watchdog_task,
+ msecs_to_jiffies(1));
+ return;
+ case __IAVF_INIT_FAILED:
+ if (++adapter->aq_wait_count > IAVF_AQ_MAX_ERR) {
+ dev_err(&adapter->pdev->dev,
+ "Failed to communicate with PF; waiting before retry\n");
+ adapter->flags |= IAVF_FLAG_PF_COMMS_FAILED;
+ iavf_shutdown_adminq(hw);
+ clear_bit(__IAVF_IN_CRITICAL_TASK,
+ &adapter->crit_section);
+ queue_delayed_work(iavf_wq,
+ &adapter->watchdog_task, (5 * HZ));
+ return;
+ }
+ /* Try again from failed step*/
+ iavf_change_state(adapter, adapter->last_state);
+ clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
+ queue_delayed_work(iavf_wq, &adapter->watchdog_task, HZ);
+ return;
case __IAVF_COMM_FAILED:
reg_val = rd32(hw, IAVF_VFGEN_RSTAT) &
IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
@@ -1940,17 +1984,12 @@ static void iavf_watchdog_task(struct work_struct *work)
/* A chance for redemption! */
dev_err(&adapter->pdev->dev,
"Hardware came out of reset. Attempting reinit.\n");
- iavf_change_state(adapter, __IAVF_STARTUP);
- adapter->flags &= ~IAVF_FLAG_PF_COMMS_FAILED;
- queue_delayed_work(iavf_wq, &adapter->init_task, 10);
- clear_bit(__IAVF_IN_CRITICAL_TASK,
- &adapter->crit_section);
- /* Don't reschedule the watchdog, since we've restarted
- * the init task. When init_task contacts the PF and
+ /* When init task contacts the PF and
* gets everything set up again, it'll restart the
* watchdog for us. Down, boy. Sit. Stay. Woof.
*/
- return;
+ iavf_change_state(adapter, __IAVF_STARTUP);
+ adapter->flags &= ~IAVF_FLAG_PF_COMMS_FAILED;
}
adapter->aq_required = 0;
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
@@ -1959,7 +1998,7 @@ static void iavf_watchdog_task(struct work_struct *work)
queue_delayed_work(iavf_wq,
&adapter->watchdog_task,
msecs_to_jiffies(10));
- goto watchdog_done;
+ return;
case __IAVF_RESETTING:
clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
queue_delayed_work(iavf_wq, &adapter->watchdog_task, HZ * 2);
@@ -1982,12 +2021,14 @@ static void iavf_watchdog_task(struct work_struct *work)
adapter->state == __IAVF_RUNNING)
iavf_request_stats(adapter);
}
+ if (adapter->state == __IAVF_RUNNING)
+ iavf_detect_recover_hung(&adapter->vsi);
break;
case __IAVF_REMOVE:
clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
return;
default:
- goto restart_watchdog;
+ return;
}
/* check for hw reset */
@@ -1999,22 +2040,22 @@ static void iavf_watchdog_task(struct work_struct *work)
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
dev_err(&adapter->pdev->dev, "Hardware reset detected\n");
queue_work(iavf_wq, &adapter->reset_task);
- goto watchdog_done;
+ clear_bit(__IAVF_IN_CRITICAL_TASK,
+ &adapter->crit_section);
+ queue_delayed_work(iavf_wq,
+ &adapter->watchdog_task, HZ * 2);
+ return;
}
schedule_delayed_work(&adapter->client_task, msecs_to_jiffies(5));
-watchdog_done:
- if (adapter->state == __IAVF_RUNNING ||
- adapter->state == __IAVF_COMM_FAILED)
- iavf_detect_recover_hung(&adapter->vsi);
clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
restart_watchdog:
+ queue_work(iavf_wq, &adapter->adminq_task);
if (adapter->aq_required)
queue_delayed_work(iavf_wq, &adapter->watchdog_task,
msecs_to_jiffies(20));
else
queue_delayed_work(iavf_wq, &adapter->watchdog_task, HZ * 2);
- queue_work(iavf_wq, &adapter->adminq_task);
}
static void iavf_disable_vf(struct iavf_adapter *adapter)
@@ -2287,6 +2328,8 @@ continue_reset:
return;
reset_err:
+ if (running)
+ iavf_change_state(adapter, __IAVF_RUNNING);
clear_bit(__IAVF_IN_CLIENT_TASK, &adapter->crit_section);
clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n");
@@ -3627,58 +3670,6 @@ int iavf_process_config(struct iavf_adapter *adapter)
return 0;
}
-/**
- * iavf_init_task - worker thread to perform delayed initialization
- * @work: pointer to work_struct containing our data
- *
- * This task completes the work that was begun in probe. Due to the nature
- * of VF-PF communications, we may need to wait tens of milliseconds to get
- * responses back from the PF. Rather than busy-wait in probe and bog down the
- * whole system, we'll do it in a task so we can sleep.
- * This task only runs during driver init. Once we've established
- * communications with the PF driver and set up our netdev, the watchdog
- * takes over.
- **/
-static void iavf_init_task(struct work_struct *work)
-{
- struct iavf_adapter *adapter = container_of(work,
- struct iavf_adapter,
- init_task.work);
- struct iavf_hw *hw = &adapter->hw;
-
- switch (adapter->state) {
- case __IAVF_STARTUP:
- if (iavf_startup(adapter) < 0)
- goto init_failed;
- break;
- case __IAVF_INIT_VERSION_CHECK:
- if (iavf_init_version_check(adapter) < 0)
- goto init_failed;
- break;
- case __IAVF_INIT_GET_RESOURCES:
- if (iavf_init_get_resources(adapter) < 0)
- goto init_failed;
- return;
- default:
- goto init_failed;
- }
-
- queue_delayed_work(iavf_wq, &adapter->init_task,
- msecs_to_jiffies(30));
- return;
-init_failed:
- if (++adapter->aq_wait_count > IAVF_AQ_MAX_ERR) {
- dev_err(&adapter->pdev->dev,
- "Failed to communicate with PF; waiting before retry\n");
- adapter->flags |= IAVF_FLAG_PF_COMMS_FAILED;
- iavf_shutdown_adminq(hw);
- iavf_change_state(adapter, __IAVF_STARTUP);
- queue_delayed_work(iavf_wq, &adapter->init_task, HZ * 5);
- return;
- }
- queue_delayed_work(iavf_wq, &adapter->init_task, HZ);
-}
-
/**
* iavf_shutdown - Shutdown the device in preparation for a reboot
* @pdev: pci device structure
@@ -3807,8 +3798,7 @@ static int iavf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
INIT_WORK(&adapter->adminq_task, iavf_adminq_task);
INIT_DELAYED_WORK(&adapter->watchdog_task, iavf_watchdog_task);
INIT_DELAYED_WORK(&adapter->client_task, iavf_client_task);
- INIT_DELAYED_WORK(&adapter->init_task, iavf_init_task);
- queue_delayed_work(iavf_wq, &adapter->init_task,
+ queue_delayed_work(iavf_wq, &adapter->watchdog_task,
msecs_to_jiffies(5 * (pdev->devfn & 0x07)));
/* Setup the wait queue for indicating transition to down status */
@@ -3916,8 +3906,8 @@ static void iavf_remove(struct pci_dev *pdev)
* to run/schedule any driver tasks
*/
set_bit(__IAVF_IN_REMOVE_TASK, &adapter->crit_section);
- cancel_delayed_work_sync(&adapter->init_task);
cancel_work_sync(&adapter->reset_task);
+ cancel_delayed_work_sync(&adapter->watchdog_task);
cancel_delayed_work_sync(&adapter->client_task);
iavf_misc_irq_disable(adapter);
if (adapter->netdev_registered) {
--
2.27.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [Intel-wired-lan] [PATCH net v2 2/2] iavf: Fix init and watchdog state machines
2021-06-11 9:59 [Intel-wired-lan] [PATCH net v2 2/2] iavf: Fix init and watchdog state machines Mateusz Palczewski
@ 2021-06-11 12:58 ` Stefan Assmann
0 siblings, 0 replies; 2+ messages in thread
From: Stefan Assmann @ 2021-06-11 12:58 UTC (permalink / raw)
To: intel-wired-lan
On 2021-06-11 11:59, Mateusz Palczewski wrote:
> From: Jan Sokolowski <jan.sokolowski@intel.com>
>
> Use single state machine for driver initialization
> and for service initialized driver. The init state
> machine implemented in init_task() is merged
> into the watchdog_task(). The init_task() function
> is removed.
This still lacks lots of explanations for all the changes being made.
Why is the init_task functionality merged into the watchdog?
> diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h
> index e13d2d1..5967db9 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf.h
> +++ b/drivers/net/ethernet/intel/iavf/iavf.h
> @@ -176,6 +176,7 @@ enum iavf_state_t {
> __IAVF_INIT_VERSION_CHECK, /* aq msg sent, awaiting reply */
> __IAVF_INIT_GET_RESOURCES, /* aq msg sent, awaiting reply */
> __IAVF_INIT_SW, /* got resources, setting up structs */
> + __IAVF_INIT_FAILED, /* init failed, restarting procedure */
New flag, why do we need this?
> __IAVF_RESETTING, /* in reset */
> __IAVF_COMM_FAILED, /* communication with PF failed */
> /* Below here, watchdog is running */
> @@ -231,7 +232,6 @@ struct iavf_adapter {
> struct work_struct reset_task;
> struct work_struct adminq_task;
> struct delayed_work client_task;
> - struct delayed_work init_task;
> wait_queue_head_t down_waitqueue;
> struct iavf_q_vector *q_vectors;
> struct list_head vlan_filter_list;
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c
> index 7c264e4..58536e1 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_main.c
> +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
> @@ -14,7 +14,7 @@
> static int iavf_setup_all_tx_resources(struct iavf_adapter *adapter);
> static int iavf_setup_all_rx_resources(struct iavf_adapter *adapter);
> static int iavf_close(struct net_device *netdev);
> -static int iavf_init_get_resources(struct iavf_adapter *adapter);
> +static void iavf_init_get_resources(struct iavf_adapter *adapter);
Changing return type, why?
> @@ -1931,7 +1933,49 @@ static void iavf_watchdog_task(struct work_struct *work)
> if (adapter->flags & IAVF_FLAG_PF_COMMS_FAILED)
> iavf_change_state(adapter, __IAVF_COMM_FAILED);
>
> + if (adapter->flags & IAVF_FLAG_RESET_NEEDED &&
> + adapter->state != __IAVF_RESETTING) {
> + iavf_change_state(adapter, __IAVF_RESETTING);
> + adapter->aq_required = 0;
> + adapter->current_op = VIRTCHNL_OP_UNKNOWN;
> + }
Lacks explanation.
> switch (adapter->state) {
> + case __IAVF_STARTUP:
> + iavf_startup(adapter);
> + clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> + queue_delayed_work(iavf_wq, &adapter->watchdog_task,
> + msecs_to_jiffies(30));
Why 30ms?
> + return;
> + case __IAVF_INIT_VERSION_CHECK:
> + iavf_init_version_check(adapter);
> + clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> + queue_delayed_work(iavf_wq, &adapter->watchdog_task,
> + msecs_to_jiffies(30));
> + return;
> + case __IAVF_INIT_GET_RESOURCES:
> + iavf_init_get_resources(adapter);
> + clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> + queue_delayed_work(iavf_wq, &adapter->watchdog_task,
> + msecs_to_jiffies(1));
Why 1ms?
> + return;
> + case __IAVF_INIT_FAILED:
> + if (++adapter->aq_wait_count > IAVF_AQ_MAX_ERR) {
> + dev_err(&adapter->pdev->dev,
> + "Failed to communicate with PF; waiting before retry\n");
> + adapter->flags |= IAVF_FLAG_PF_COMMS_FAILED;
> + iavf_shutdown_adminq(hw);
> + clear_bit(__IAVF_IN_CRITICAL_TASK,
> + &adapter->crit_section);
> + queue_delayed_work(iavf_wq,
> + &adapter->watchdog_task, (5 * HZ));
Why all the different delays, I see HZ, 2 * HZ, 5 * HZ?
> + return;
> + }
> + /* Try again from failed step*/
> + iavf_change_state(adapter, adapter->last_state);
> + clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> + queue_delayed_work(iavf_wq, &adapter->watchdog_task, HZ);
> + return;
> case __IAVF_COMM_FAILED:
> reg_val = rd32(hw, IAVF_VFGEN_RSTAT) &
> IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
> @@ -1940,17 +1984,12 @@ static void iavf_watchdog_task(struct work_struct *work)
> /* A chance for redemption! */
> dev_err(&adapter->pdev->dev,
> "Hardware came out of reset. Attempting reinit.\n");
> - iavf_change_state(adapter, __IAVF_STARTUP);
> - adapter->flags &= ~IAVF_FLAG_PF_COMMS_FAILED;
> - queue_delayed_work(iavf_wq, &adapter->init_task, 10);
> - clear_bit(__IAVF_IN_CRITICAL_TASK,
> - &adapter->crit_section);
> - /* Don't reschedule the watchdog, since we've restarted
> - * the init task. When init_task contacts the PF and
> + /* When init task contacts the PF and
Wait, didn't you just remove the init task functionality?
> * gets everything set up again, it'll restart the
> * watchdog for us. Down, boy. Sit. Stay. Woof.
> */
> - return;
> + iavf_change_state(adapter, __IAVF_STARTUP);
> + adapter->flags &= ~IAVF_FLAG_PF_COMMS_FAILED;
> }
> adapter->aq_required = 0;
> adapter->current_op = VIRTCHNL_OP_UNKNOWN;
> @@ -1959,7 +1998,7 @@ static void iavf_watchdog_task(struct work_struct *work)
> queue_delayed_work(iavf_wq,
> &adapter->watchdog_task,
> msecs_to_jiffies(10));
> - goto watchdog_done;
> + return;
> case __IAVF_RESETTING:
> clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> queue_delayed_work(iavf_wq, &adapter->watchdog_task, HZ * 2);
> @@ -1982,12 +2021,14 @@ static void iavf_watchdog_task(struct work_struct *work)
> adapter->state == __IAVF_RUNNING)
> iavf_request_stats(adapter);
> }
> + if (adapter->state == __IAVF_RUNNING)
> + iavf_detect_recover_hung(&adapter->vsi);
Lacks explanation.
> break;
> case __IAVF_REMOVE:
> clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> return;
> default:
> - goto restart_watchdog;
> + return;
> }
> /* check for hw reset */
> @@ -1999,22 +2040,22 @@ static void iavf_watchdog_task(struct work_struct *work)
> adapter->current_op = VIRTCHNL_OP_UNKNOWN;
> dev_err(&adapter->pdev->dev, "Hardware reset detected\n");
> queue_work(iavf_wq, &adapter->reset_task);
> - goto watchdog_done;
> + clear_bit(__IAVF_IN_CRITICAL_TASK,
> + &adapter->crit_section);
> + queue_delayed_work(iavf_wq,
> + &adapter->watchdog_task, HZ * 2);
> + return;
> }
Lacks explanation.
> schedule_delayed_work(&adapter->client_task, msecs_to_jiffies(5));
> -watchdog_done:
> - if (adapter->state == __IAVF_RUNNING ||
> - adapter->state == __IAVF_COMM_FAILED)
> - iavf_detect_recover_hung(&adapter->vsi);
> clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> restart_watchdog:
> + queue_work(iavf_wq, &adapter->adminq_task);
> if (adapter->aq_required)
> queue_delayed_work(iavf_wq, &adapter->watchdog_task,
> msecs_to_jiffies(20));
> else
> queue_delayed_work(iavf_wq, &adapter->watchdog_task, HZ * 2);
> - queue_work(iavf_wq, &adapter->adminq_task);
> }
Lacks explanation.
>
> static void iavf_disable_vf(struct iavf_adapter *adapter)
> @@ -2287,6 +2328,8 @@ continue_reset:
>
> return;
> reset_err:
> + if (running)
> + iavf_change_state(adapter, __IAVF_RUNNING);
Lacks explanation.
> clear_bit(__IAVF_IN_CLIENT_TASK, &adapter->crit_section);
> clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n");
> @@ -3627,58 +3670,6 @@ int iavf_process_config(struct iavf_adapter *adapter)
> return 0;
> }
>
> -/**
> - * iavf_init_task - worker thread to perform delayed initialization
> - * @work: pointer to work_struct containing our data
> - *
> - * This task completes the work that was begun in probe. Due to the nature
> - * of VF-PF communications, we may need to wait tens of milliseconds to get
> - * responses back from the PF. Rather than busy-wait in probe and bog down the
> - * whole system, we'll do it in a task so we can sleep.
> - * This task only runs during driver init. Once we've established
> - * communications with the PF driver and set up our netdev, the watchdog
> - * takes over.
> - **/
> -static void iavf_init_task(struct work_struct *work)
> -{
> - struct iavf_adapter *adapter = container_of(work,
> - struct iavf_adapter,
> - init_task.work);
> - struct iavf_hw *hw = &adapter->hw;
> -
> - switch (adapter->state) {
> - case __IAVF_STARTUP:
> - if (iavf_startup(adapter) < 0)
> - goto init_failed;
> - break;
> - case __IAVF_INIT_VERSION_CHECK:
> - if (iavf_init_version_check(adapter) < 0)
> - goto init_failed;
> - break;
> - case __IAVF_INIT_GET_RESOURCES:
> - if (iavf_init_get_resources(adapter) < 0)
> - goto init_failed;
> - return;
> - default:
> - goto init_failed;
> - }
> -
> - queue_delayed_work(iavf_wq, &adapter->init_task,
> - msecs_to_jiffies(30));
> - return;
> -init_failed:
> - if (++adapter->aq_wait_count > IAVF_AQ_MAX_ERR) {
> - dev_err(&adapter->pdev->dev,
> - "Failed to communicate with PF; waiting before retry\n");
> - adapter->flags |= IAVF_FLAG_PF_COMMS_FAILED;
> - iavf_shutdown_adminq(hw);
> - iavf_change_state(adapter, __IAVF_STARTUP);
> - queue_delayed_work(iavf_wq, &adapter->init_task, HZ * 5);
> - return;
> - }
> - queue_delayed_work(iavf_wq, &adapter->init_task, HZ);
> -}
> -
> /**
> * iavf_shutdown - Shutdown the device in preparation for a reboot
> * @pdev: pci device structure
> @@ -3807,8 +3798,7 @@ static int iavf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> INIT_WORK(&adapter->adminq_task, iavf_adminq_task);
> INIT_DELAYED_WORK(&adapter->watchdog_task, iavf_watchdog_task);
> INIT_DELAYED_WORK(&adapter->client_task, iavf_client_task);
> - INIT_DELAYED_WORK(&adapter->init_task, iavf_init_task);
> - queue_delayed_work(iavf_wq, &adapter->init_task,
> + queue_delayed_work(iavf_wq, &adapter->watchdog_task,
> msecs_to_jiffies(5 * (pdev->devfn & 0x07)));
What is this magic ?
Stefan
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-06-11 12:58 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-11 9:59 [Intel-wired-lan] [PATCH net v2 2/2] iavf: Fix init and watchdog state machines Mateusz Palczewski
2021-06-11 12:58 ` Stefan Assmann
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.