]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iwlwifi: mvm: don't lock mutex in RCU critical section
authorJohannes Berg <johannes.berg@intel.com>
Sun, 11 Apr 2021 09:46:25 +0000 (12:46 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 14 Apr 2021 09:07:19 +0000 (12:07 +0300)
We cannot lock a mutex while we're in an RCU critical section. At
the same time, we're accessing data structures that are protected
by the mvm->mutex anyway, so just move the entire locking here to
use only that.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210411124417.4d27bd36e10e.I1fd8e8fe442c41a5deaa560452b598ed7a60ada5@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c

index 34ddef97b0990bc32709c30fd05b026f3cba841c..63d65018d0989240dbc72662c0b4238e2570ef2a 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2012-2014, 2018-2020 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2021 Intel Corporation
  * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
  * Copyright (C) 2016-2017 Intel Deutschland GmbH
  */
@@ -1210,10 +1210,10 @@ static int _iwl_dbgfs_inject_beacon_ie(struct iwl_mvm *mvm, char *bin, int len)
                        IWL_UCODE_TLV_API_NEW_BEACON_TEMPLATE))
                return -EINVAL;
 
-       rcu_read_lock();
+       mutex_lock(&mvm->mutex);
 
        for (i = 0; i < NUM_MAC_INDEX_DRIVER; i++) {
-               vif = iwl_mvm_rcu_dereference_vif_id(mvm, i, true);
+               vif = iwl_mvm_rcu_dereference_vif_id(mvm, i, false);
                if (!vif)
                        continue;
 
@@ -1253,18 +1253,16 @@ static int _iwl_dbgfs_inject_beacon_ie(struct iwl_mvm *mvm, char *bin, int len)
                                 &beacon_cmd.tim_size,
                                 beacon->data, beacon->len);
 
-       mutex_lock(&mvm->mutex);
        iwl_mvm_mac_ctxt_send_beacon_cmd(mvm, beacon, &beacon_cmd,
                                         sizeof(beacon_cmd));
        mutex_unlock(&mvm->mutex);
 
        dev_kfree_skb(beacon);
 
-       rcu_read_unlock();
        return 0;
 
 out_err:
-       rcu_read_unlock();
+       mutex_unlock(&mvm->mutex);
        return -EINVAL;
 }