@@ -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 );
30913061restart_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