mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-24 01:54:01 -05:00
iavf: centralize watchdog requeueing itself
Centralize the unlock(critlock); unlock(netdev); queue_delayed_work(watchog_task); pattern to one place. Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> Tested-by: Rafal Romanowski <rafal.romanowski@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
committed by
Tony Nguyen
parent
dba35a4bb4
commit
099418da91
@@ -2911,6 +2911,8 @@ static void iavf_init_config_adapter(struct iavf_adapter *adapter)
|
||||
iavf_change_state(adapter, __IAVF_INIT_FAILED);
|
||||
}
|
||||
|
||||
static const int IAVF_NO_RESCHED = -1;
|
||||
|
||||
/**
|
||||
* iavf_watchdog_task - Periodic call-back task
|
||||
* @work: pointer to work_struct
|
||||
@@ -2922,6 +2924,7 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
watchdog_task.work);
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
struct iavf_hw *hw = &adapter->hw;
|
||||
int msec_delay;
|
||||
u32 reg_val;
|
||||
|
||||
netdev_lock(netdev);
|
||||
@@ -2940,39 +2943,24 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
switch (adapter->state) {
|
||||
case __IAVF_STARTUP:
|
||||
iavf_startup(adapter);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
|
||||
msecs_to_jiffies(30));
|
||||
return;
|
||||
msec_delay = 30;
|
||||
goto watchdog_done;
|
||||
case __IAVF_INIT_VERSION_CHECK:
|
||||
iavf_init_version_check(adapter);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
|
||||
msecs_to_jiffies(30));
|
||||
return;
|
||||
msec_delay = 30;
|
||||
goto watchdog_done;
|
||||
case __IAVF_INIT_GET_RESOURCES:
|
||||
iavf_init_get_resources(adapter);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
|
||||
msecs_to_jiffies(1));
|
||||
return;
|
||||
msec_delay = 1;
|
||||
goto watchdog_done;
|
||||
case __IAVF_INIT_EXTENDED_CAPS:
|
||||
iavf_init_process_extended_caps(adapter);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
|
||||
msecs_to_jiffies(1));
|
||||
return;
|
||||
msec_delay = 1;
|
||||
goto watchdog_done;
|
||||
case __IAVF_INIT_CONFIG_ADAPTER:
|
||||
iavf_init_config_adapter(adapter);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
|
||||
msecs_to_jiffies(1));
|
||||
return;
|
||||
msec_delay = 1;
|
||||
goto watchdog_done;
|
||||
case __IAVF_INIT_FAILED:
|
||||
if (test_bit(__IAVF_IN_REMOVE_TASK,
|
||||
&adapter->crit_section)) {
|
||||
@@ -2980,27 +2968,21 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
* watchdog task, iavf_remove should handle this state
|
||||
* as it can loop forever
|
||||
*/
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
return;
|
||||
msec_delay = IAVF_NO_RESCHED;
|
||||
goto watchdog_done;
|
||||
}
|
||||
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);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq,
|
||||
&adapter->watchdog_task, (5 * HZ));
|
||||
return;
|
||||
msec_delay = 5000;
|
||||
goto watchdog_done;
|
||||
}
|
||||
/* Try again from failed step*/
|
||||
iavf_change_state(adapter, adapter->last_state);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task, HZ);
|
||||
return;
|
||||
msec_delay = 1000;
|
||||
goto watchdog_done;
|
||||
case __IAVF_COMM_FAILED:
|
||||
if (test_bit(__IAVF_IN_REMOVE_TASK,
|
||||
&adapter->crit_section)) {
|
||||
@@ -3010,9 +2992,8 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
*/
|
||||
iavf_change_state(adapter, __IAVF_INIT_FAILED);
|
||||
adapter->flags &= ~IAVF_FLAG_PF_COMMS_FAILED;
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
return;
|
||||
msec_delay = IAVF_NO_RESCHED;
|
||||
goto watchdog_done;
|
||||
}
|
||||
reg_val = rd32(hw, IAVF_VFGEN_RSTAT) &
|
||||
IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
|
||||
@@ -3030,18 +3011,11 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
}
|
||||
adapter->aq_required = 0;
|
||||
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq,
|
||||
&adapter->watchdog_task,
|
||||
msecs_to_jiffies(10));
|
||||
return;
|
||||
msec_delay = 10;
|
||||
goto watchdog_done;
|
||||
case __IAVF_RESETTING:
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
|
||||
HZ * 2);
|
||||
return;
|
||||
msec_delay = 2000;
|
||||
goto watchdog_done;
|
||||
case __IAVF_DOWN:
|
||||
case __IAVF_DOWN_PENDING:
|
||||
case __IAVF_TESTING:
|
||||
@@ -3068,9 +3042,8 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
break;
|
||||
case __IAVF_REMOVE:
|
||||
default:
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
return;
|
||||
msec_delay = IAVF_NO_RESCHED;
|
||||
goto watchdog_done;
|
||||
}
|
||||
|
||||
/* check for hw reset */
|
||||
@@ -3080,24 +3053,30 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
|
||||
dev_err(&adapter->pdev->dev, "Hardware reset detected\n");
|
||||
iavf_schedule_reset(adapter, IAVF_FLAG_RESET_PENDING);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
queue_delayed_work(adapter->wq,
|
||||
&adapter->watchdog_task, HZ * 2);
|
||||
return;
|
||||
msec_delay = 2000;
|
||||
goto watchdog_done;
|
||||
}
|
||||
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
restart_watchdog:
|
||||
netdev_unlock(netdev);
|
||||
|
||||
/* note that we schedule a different task */
|
||||
if (adapter->state >= __IAVF_DOWN)
|
||||
queue_work(adapter->wq, &adapter->adminq_task);
|
||||
if (adapter->aq_required)
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
|
||||
msecs_to_jiffies(20));
|
||||
msec_delay = 20;
|
||||
else
|
||||
msec_delay = 2000;
|
||||
goto skip_unlock;
|
||||
watchdog_done:
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
netdev_unlock(netdev);
|
||||
skip_unlock:
|
||||
|
||||
if (msec_delay != IAVF_NO_RESCHED)
|
||||
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
|
||||
HZ * 2);
|
||||
msecs_to_jiffies(msec_delay));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user