@@ -2911,6 +2911,8 @@ static void iavf_init_config_adapter(struct iavf_adapter *adapter)
2911
2911
iavf_change_state (adapter , __IAVF_INIT_FAILED );
2912
2912
}
2913
2913
2914
+ static const int IAVF_NO_RESCHED = -1 ;
2915
+
2914
2916
/**
2915
2917
* iavf_watchdog_task - Periodic call-back task
2916
2918
* @work: pointer to work_struct
@@ -2922,6 +2924,7 @@ static void iavf_watchdog_task(struct work_struct *work)
2922
2924
watchdog_task .work );
2923
2925
struct net_device * netdev = adapter -> netdev ;
2924
2926
struct iavf_hw * hw = & adapter -> hw ;
2927
+ int msec_delay ;
2925
2928
u32 reg_val ;
2926
2929
2927
2930
netdev_lock (netdev );
@@ -2940,67 +2943,46 @@ static void iavf_watchdog_task(struct work_struct *work)
2940
2943
switch (adapter -> state ) {
2941
2944
case __IAVF_STARTUP :
2942
2945
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 ;
2948
2948
case __IAVF_INIT_VERSION_CHECK :
2949
2949
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 ;
2955
2952
case __IAVF_INIT_GET_RESOURCES :
2956
2953
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 ;
2962
2956
case __IAVF_INIT_EXTENDED_CAPS :
2963
2957
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 ;
2969
2960
case __IAVF_INIT_CONFIG_ADAPTER :
2970
2961
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 ;
2976
2964
case __IAVF_INIT_FAILED :
2977
2965
if (test_bit (__IAVF_IN_REMOVE_TASK ,
2978
2966
& adapter -> crit_section )) {
2979
2967
/* Do not update the state and do not reschedule
2980
2968
* watchdog task, iavf_remove should handle this state
2981
2969
* as it can loop forever
2982
2970
*/
2983
- mutex_unlock (& adapter -> crit_lock );
2984
- netdev_unlock (netdev );
2985
- return ;
2971
+ msec_delay = IAVF_NO_RESCHED ;
2972
+ goto watchdog_done ;
2986
2973
}
2987
2974
if (++ adapter -> aq_wait_count > IAVF_AQ_MAX_ERR ) {
2988
2975
dev_err (& adapter -> pdev -> dev ,
2989
2976
"Failed to communicate with PF; waiting before retry\n" );
2990
2977
adapter -> flags |= IAVF_FLAG_PF_COMMS_FAILED ;
2991
2978
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 ;
2997
2981
}
2998
2982
/* Try again from failed step*/
2999
2983
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 ;
3004
2986
case __IAVF_COMM_FAILED :
3005
2987
if (test_bit (__IAVF_IN_REMOVE_TASK ,
3006
2988
& adapter -> crit_section )) {
@@ -3010,9 +2992,8 @@ static void iavf_watchdog_task(struct work_struct *work)
3010
2992
*/
3011
2993
iavf_change_state (adapter , __IAVF_INIT_FAILED );
3012
2994
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 ;
3016
2997
}
3017
2998
reg_val = rd32 (hw , IAVF_VFGEN_RSTAT ) &
3018
2999
IAVF_VFGEN_RSTAT_VFR_STATE_MASK ;
@@ -3030,18 +3011,11 @@ static void iavf_watchdog_task(struct work_struct *work)
3030
3011
}
3031
3012
adapter -> aq_required = 0 ;
3032
3013
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 ;
3039
3016
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 ;
3045
3019
case __IAVF_DOWN :
3046
3020
case __IAVF_DOWN_PENDING :
3047
3021
case __IAVF_TESTING :
@@ -3068,9 +3042,8 @@ static void iavf_watchdog_task(struct work_struct *work)
3068
3042
break ;
3069
3043
case __IAVF_REMOVE :
3070
3044
default :
3071
- mutex_unlock (& adapter -> crit_lock );
3072
- netdev_unlock (netdev );
3073
- return ;
3045
+ msec_delay = IAVF_NO_RESCHED ;
3046
+ goto watchdog_done ;
3074
3047
}
3075
3048
3076
3049
/* check for hw reset */
@@ -3080,24 +3053,30 @@ static void iavf_watchdog_task(struct work_struct *work)
3080
3053
adapter -> current_op = VIRTCHNL_OP_UNKNOWN ;
3081
3054
dev_err (& adapter -> pdev -> dev , "Hardware reset detected\n" );
3082
3055
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 ;
3088
3058
}
3089
3059
3090
3060
mutex_unlock (& adapter -> crit_lock );
3091
3061
restart_watchdog :
3092
3062
netdev_unlock (netdev );
3063
+
3064
+ /* note that we schedule a different task */
3093
3065
if (adapter -> state >= __IAVF_DOWN )
3094
3066
queue_work (adapter -> wq , & adapter -> adminq_task );
3095
3067
if (adapter -> aq_required )
3096
- queue_delayed_work (adapter -> wq , & adapter -> watchdog_task ,
3097
- msecs_to_jiffies (20 ));
3068
+ msec_delay = 20 ;
3098
3069
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 )
3099
3078
queue_delayed_work (adapter -> wq , & adapter -> watchdog_task ,
3100
- HZ * 2 );
3079
+ msecs_to_jiffies ( msec_delay ) );
3101
3080
}
3102
3081
3103
3082
/**
0 commit comments