wifi: wilc1000: split deeply nested RCU list traversal in dedicated helper
authorAlexis Lothoré <alexis.lothore@bootlin.com>
Thu, 15 Feb 2024 15:36:18 +0000 (16:36 +0100)
committerKalle Valo <kvalo@kernel.org>
Mon, 19 Feb 2024 16:21:35 +0000 (18:21 +0200)
Move netif_wake_queue and its surrounding RCU operations in a dedicated
function to clarify wilc_txq_task and ease refactoring

Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240215-wilc_fix_rcu_usage-v1-1-f610e46c6f82@bootlin.com
drivers/net/wireless/microchip/wilc1000/netdev.c

index 22f461f477f1942cc296efbf4673555d53af1e9a..62414ab8846e3fda31554b61b9443de6dd0d561f 100644 (file)
@@ -140,6 +140,19 @@ int wilc_wlan_get_num_conn_ifcs(struct wilc *wilc)
        return ret_val;
 }
 
+static void wilc_wake_tx_queues(struct wilc *wl)
+{
+       int srcu_idx;
+       struct wilc_vif *ifc;
+
+       srcu_idx = srcu_read_lock(&wl->srcu);
+       list_for_each_entry_rcu(ifc, &wl->vif_list, list) {
+               if (ifc->mac_opened && netif_queue_stopped(ifc->ndev))
+                       netif_wake_queue(ifc->ndev);
+       }
+       srcu_read_unlock(&wl->srcu, srcu_idx);
+}
+
 static int wilc_txq_task(void *vp)
 {
        int ret;
@@ -160,17 +173,7 @@ static int wilc_txq_task(void *vp)
                do {
                        ret = wilc_wlan_handle_txq(wl, &txq_count);
                        if (txq_count < FLOW_CONTROL_LOWER_THRESHOLD) {
-                               int srcu_idx;
-                               struct wilc_vif *ifc;
-
-                               srcu_idx = srcu_read_lock(&wl->srcu);
-                               list_for_each_entry_rcu(ifc, &wl->vif_list,
-                                                       list) {
-                                       if (ifc->mac_opened &&
-                                           netif_queue_stopped(ifc->ndev))
-                                               netif_wake_queue(ifc->ndev);
-                               }
-                               srcu_read_unlock(&wl->srcu, srcu_idx);
+                               wilc_wake_tx_queues(wl);
                        }
                        if (ret != WILC_VMM_ENTRY_FULL_RETRY)
                                break;