lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 087/775] ath11k: fix a locking bug in ath11k_mac_op_start()
    Date
    From: Dan Carpenter <dan.carpenter@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.carpenter@oracle.com>
    [kvalo@codeaurora.org: move also rcu_assign_pointer() call]
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/YBk4GoeE+yc0wlJH@mwanda
    Signed-off-by: Sasha Levin <sashal@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 c1608f64ea95d..7d799fe6fbd89 100644
    --- a/drivers/net/wireless/ath/ath11k/mac.c
    +++ b/drivers/net/wireless/ath/ath11k/mac.c
    @@ -4248,11 +4248,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,
    @@ -4262,6 +4257,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


    \
     
     \ /
      Last update: 2021-03-02 04:10    [W:4.038 / U:0.240 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site