Skip to content

Commit 099418d

Browse files
pkitszelanguy11
authored andcommitted
iavf: centralize watchdog requeueing itself
Centralize the unlock(critlock); unlock(netdev); queue_delayed_work(watchog_task); pattern to one place. Reviewed-by: Jacob Keller <[email protected]> Signed-off-by: Przemek Kitszel <[email protected]> Tested-by: Rafal Romanowski <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent dba35a4 commit 099418d

File tree

1 file changed

+41
-62
lines changed

1 file changed

+41
-62
lines changed

drivers/net/ethernet/intel/iavf/iavf_main.c

Lines changed: 41 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2911,6 +2911,8 @@ static void iavf_init_config_adapter(struct iavf_adapter *adapter)
29112911
iavf_change_state(adapter, __IAVF_INIT_FAILED);
29122912
}
29132913

2914+
static const int IAVF_NO_RESCHED = -1;
2915+
29142916
/**
29152917
* iavf_watchdog_task - Periodic call-back task
29162918
* @work: pointer to work_struct
@@ -2922,6 +2924,7 @@ static void iavf_watchdog_task(struct work_struct *work)
29222924
watchdog_task.work);
29232925
struct net_device *netdev = adapter->netdev;
29242926
struct iavf_hw *hw = &adapter->hw;
2927+
int msec_delay;
29252928
u32 reg_val;
29262929

29272930
netdev_lock(netdev);
@@ -2940,67 +2943,46 @@ static void iavf_watchdog_task(struct work_struct *work)
29402943
switch (adapter->state) {
29412944
case __IAVF_STARTUP:
29422945
iavf_startup(adapter);
2943-
mutex_unlock(&adapter->crit_lock);
2944-
netdev_unlock(netdev);
2945-
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
2946-
msecs_to_jiffies(30));
2947-
return;
2946+
msec_delay = 30;
2947+
goto watchdog_done;
29482948
case __IAVF_INIT_VERSION_CHECK:
29492949
iavf_init_version_check(adapter);
2950-
mutex_unlock(&adapter->crit_lock);
2951-
netdev_unlock(netdev);
2952-
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
2953-
msecs_to_jiffies(30));
2954-
return;
2950+
msec_delay = 30;
2951+
goto watchdog_done;
29552952
case __IAVF_INIT_GET_RESOURCES:
29562953
iavf_init_get_resources(adapter);
2957-
mutex_unlock(&adapter->crit_lock);
2958-
netdev_unlock(netdev);
2959-
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
2960-
msecs_to_jiffies(1));
2961-
return;
2954+
msec_delay = 1;
2955+
goto watchdog_done;
29622956
case __IAVF_INIT_EXTENDED_CAPS:
29632957
iavf_init_process_extended_caps(adapter);
2964-
mutex_unlock(&adapter->crit_lock);
2965-
netdev_unlock(netdev);
2966-
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
2967-
msecs_to_jiffies(1));
2968-
return;
2958+
msec_delay = 1;
2959+
goto watchdog_done;
29692960
case __IAVF_INIT_CONFIG_ADAPTER:
29702961
iavf_init_config_adapter(adapter);
2971-
mutex_unlock(&adapter->crit_lock);
2972-
netdev_unlock(netdev);
2973-
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
2974-
msecs_to_jiffies(1));
2975-
return;
2962+
msec_delay = 1;
2963+
goto watchdog_done;
29762964
case __IAVF_INIT_FAILED:
29772965
if (test_bit(__IAVF_IN_REMOVE_TASK,
29782966
&adapter->crit_section)) {
29792967
/* Do not update the state and do not reschedule
29802968
* watchdog task, iavf_remove should handle this state
29812969
* as it can loop forever
29822970
*/
2983-
mutex_unlock(&adapter->crit_lock);
2984-
netdev_unlock(netdev);
2985-
return;
2971+
msec_delay = IAVF_NO_RESCHED;
2972+
goto watchdog_done;
29862973
}
29872974
if (++adapter->aq_wait_count > IAVF_AQ_MAX_ERR) {
29882975
dev_err(&adapter->pdev->dev,
29892976
"Failed to communicate with PF; waiting before retry\n");
29902977
adapter->flags |= IAVF_FLAG_PF_COMMS_FAILED;
29912978
iavf_shutdown_adminq(hw);
2992-
mutex_unlock(&adapter->crit_lock);
2993-
netdev_unlock(netdev);
2994-
queue_delayed_work(adapter->wq,
2995-
&adapter->watchdog_task, (5 * HZ));
2996-
return;
2979+
msec_delay = 5000;
2980+
goto watchdog_done;
29972981
}
29982982
/* Try again from failed step*/
29992983
iavf_change_state(adapter, adapter->last_state);
3000-
mutex_unlock(&adapter->crit_lock);
3001-
netdev_unlock(netdev);
3002-
queue_delayed_work(adapter->wq, &adapter->watchdog_task, HZ);
3003-
return;
2984+
msec_delay = 1000;
2985+
goto watchdog_done;
30042986
case __IAVF_COMM_FAILED:
30052987
if (test_bit(__IAVF_IN_REMOVE_TASK,
30062988
&adapter->crit_section)) {
@@ -3010,9 +2992,8 @@ static void iavf_watchdog_task(struct work_struct *work)
30102992
*/
30112993
iavf_change_state(adapter, __IAVF_INIT_FAILED);
30122994
adapter->flags &= ~IAVF_FLAG_PF_COMMS_FAILED;
3013-
mutex_unlock(&adapter->crit_lock);
3014-
netdev_unlock(netdev);
3015-
return;
2995+
msec_delay = IAVF_NO_RESCHED;
2996+
goto watchdog_done;
30162997
}
30172998
reg_val = rd32(hw, IAVF_VFGEN_RSTAT) &
30182999
IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
@@ -3030,18 +3011,11 @@ static void iavf_watchdog_task(struct work_struct *work)
30303011
}
30313012
adapter->aq_required = 0;
30323013
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
3033-
mutex_unlock(&adapter->crit_lock);
3034-
netdev_unlock(netdev);
3035-
queue_delayed_work(adapter->wq,
3036-
&adapter->watchdog_task,
3037-
msecs_to_jiffies(10));
3038-
return;
3014+
msec_delay = 10;
3015+
goto watchdog_done;
30393016
case __IAVF_RESETTING:
3040-
mutex_unlock(&adapter->crit_lock);
3041-
netdev_unlock(netdev);
3042-
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
3043-
HZ * 2);
3044-
return;
3017+
msec_delay = 2000;
3018+
goto watchdog_done;
30453019
case __IAVF_DOWN:
30463020
case __IAVF_DOWN_PENDING:
30473021
case __IAVF_TESTING:
@@ -3068,9 +3042,8 @@ static void iavf_watchdog_task(struct work_struct *work)
30683042
break;
30693043
case __IAVF_REMOVE:
30703044
default:
3071-
mutex_unlock(&adapter->crit_lock);
3072-
netdev_unlock(netdev);
3073-
return;
3045+
msec_delay = IAVF_NO_RESCHED;
3046+
goto watchdog_done;
30743047
}
30753048

30763049
/* check for hw reset */
@@ -3080,24 +3053,30 @@ static void iavf_watchdog_task(struct work_struct *work)
30803053
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
30813054
dev_err(&adapter->pdev->dev, "Hardware reset detected\n");
30823055
iavf_schedule_reset(adapter, IAVF_FLAG_RESET_PENDING);
3083-
mutex_unlock(&adapter->crit_lock);
3084-
netdev_unlock(netdev);
3085-
queue_delayed_work(adapter->wq,
3086-
&adapter->watchdog_task, HZ * 2);
3087-
return;
3056+
msec_delay = 2000;
3057+
goto watchdog_done;
30883058
}
30893059

30903060
mutex_unlock(&adapter->crit_lock);
30913061
restart_watchdog:
30923062
netdev_unlock(netdev);
3063+
3064+
/* note that we schedule a different task */
30933065
if (adapter->state >= __IAVF_DOWN)
30943066
queue_work(adapter->wq, &adapter->adminq_task);
30953067
if (adapter->aq_required)
3096-
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
3097-
msecs_to_jiffies(20));
3068+
msec_delay = 20;
30983069
else
3070+
msec_delay = 2000;
3071+
goto skip_unlock;
3072+
watchdog_done:
3073+
mutex_unlock(&adapter->crit_lock);
3074+
netdev_unlock(netdev);
3075+
skip_unlock:
3076+
3077+
if (msec_delay != IAVF_NO_RESCHED)
30993078
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
3100-
HZ * 2);
3079+
msecs_to_jiffies(msec_delay));
31013080
}
31023081

31033082
/**

0 commit comments

Comments
 (0)