iavf: centralize watchdog requeueing itself
authorPrzemek Kitszel <przemyslaw.kitszel@intel.com>
Fri, 4 Apr 2025 10:23:17 +0000 (12:23 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 3 Jun 2025 16:48:03 +0000 (09:48 -0700)
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>
drivers/net/ethernet/intel/iavf/iavf_main.c

index a77c726435281d0f88a1a3bb4b51ece93b580a24..2c6e033c73419b8f782d81ac66639d89f9563859 100644 (file)
@@ -2911,6 +2911,8 @@ err:
        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));
 }
 
 /**