From: Dan Carpenter <dan.carpen...@oracle.com>

[ Upstream commit c202e2ebe1dc454ad54fd0018c023ec553d47284 ]

This error path leads to a Smatch warning:

        drivers/net/wireless/ath/ath11k/mac.c:4269 ath11k_mac_op_start()
        error: double unlocked '&ar->conf_mutex' (orig line 4251)

We're not holding the lock when we do the "goto err;" so it leads to a
double unlock.  The fix is to hold the lock for a little longer.

Fixes: c83c500b55b6 ("ath11k: enable idle power save mode")
Signed-off-by: Dan Carpenter <dan.carpen...@oracle.com>
[kv...@codeaurora.org: move also rcu_assign_pointer() call]
Signed-off-by: Kalle Valo <kv...@codeaurora.org>
Link: https://lore.kernel.org/r/YBk4GoeE+yc0wlJH@mwanda
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/net/wireless/ath/ath11k/mac.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/ath/ath11k/mac.c 
b/drivers/net/wireless/ath/ath11k/mac.c
index af427d9051a07..b5bd9b06da89e 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -4213,11 +4213,6 @@ static int ath11k_mac_op_start(struct ieee80211_hw *hw)
        /* Configure the hash seed for hash based reo dest ring selection */
        ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
 
-       mutex_unlock(&ar->conf_mutex);
-
-       rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
-                          &ab->pdevs[ar->pdev_idx]);
-
        /* allow device to enter IMPS */
        if (ab->hw_params.idle_ps) {
                ret = ath11k_wmi_pdev_set_param(ar, 
WMI_PDEV_PARAM_IDLE_PS_CONFIG,
@@ -4227,6 +4222,12 @@ static int ath11k_mac_op_start(struct ieee80211_hw *hw)
                        goto err;
                }
        }
+
+       mutex_unlock(&ar->conf_mutex);
+
+       rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
+                          &ab->pdevs[ar->pdev_idx]);
+
        return 0;
 
 err:
-- 
2.27.0



Reply via email to