mac80211: change locking around ieee80211_recalc_smps

Make the function acquire the necessary mutex itself
to simplify the callers.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2012-09-11 10:17:11 +02:00
Родитель 04b7b2ff50
Коммит 5d8e4237d2
4 изменённых файлов: 5 добавлений и 8 удалений

Просмотреть файл

@ -2070,9 +2070,7 @@ int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
*/ */
if (!sdata->u.mgd.associated || if (!sdata->u.mgd.associated ||
sdata->vif.bss_conf.channel_type == NL80211_CHAN_NO_HT) { sdata->vif.bss_conf.channel_type == NL80211_CHAN_NO_HT) {
mutex_lock(&sdata->local->iflist_mtx);
ieee80211_recalc_smps(sdata->local); ieee80211_recalc_smps(sdata->local);
mutex_unlock(&sdata->local->iflist_mtx);
return 0; return 0;
} }

Просмотреть файл

@ -364,9 +364,7 @@ static void ieee80211_recalc_smps_work(struct work_struct *work)
struct ieee80211_local *local = struct ieee80211_local *local =
container_of(work, struct ieee80211_local, recalc_smps); container_of(work, struct ieee80211_local, recalc_smps);
mutex_lock(&local->iflist_mtx);
ieee80211_recalc_smps(local); ieee80211_recalc_smps(local);
mutex_unlock(&local->iflist_mtx);
} }
#ifdef CONFIG_INET #ifdef CONFIG_INET

Просмотреть файл

@ -1348,9 +1348,9 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
mutex_lock(&local->iflist_mtx); mutex_lock(&local->iflist_mtx);
ieee80211_recalc_ps(local, -1); ieee80211_recalc_ps(local, -1);
ieee80211_recalc_smps(local);
mutex_unlock(&local->iflist_mtx); mutex_unlock(&local->iflist_mtx);
ieee80211_recalc_smps(local);
ieee80211_recalc_ps_vif(sdata); ieee80211_recalc_ps_vif(sdata);
netif_tx_start_all_queues(sdata->dev); netif_tx_start_all_queues(sdata->dev);

Просмотреть файл

@ -1606,14 +1606,13 @@ static int check_mgd_smps(struct ieee80211_if_managed *ifmgd,
return 0; return 0;
} }
/* must hold iflist_mtx */
void ieee80211_recalc_smps(struct ieee80211_local *local) void ieee80211_recalc_smps(struct ieee80211_local *local)
{ {
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
enum ieee80211_smps_mode smps_mode = IEEE80211_SMPS_OFF; enum ieee80211_smps_mode smps_mode = IEEE80211_SMPS_OFF;
int count = 0; int count = 0;
lockdep_assert_held(&local->iflist_mtx); mutex_lock(&local->iflist_mtx);
/* /*
* This function could be improved to handle multiple * This function could be improved to handle multiple
@ -1642,12 +1641,14 @@ void ieee80211_recalc_smps(struct ieee80211_local *local)
} }
if (smps_mode == local->smps_mode) if (smps_mode == local->smps_mode)
return; goto unlock;
set: set:
local->smps_mode = smps_mode; local->smps_mode = smps_mode;
/* changed flag is auto-detected for this */ /* changed flag is auto-detected for this */
ieee80211_hw_config(local, 0); ieee80211_hw_config(local, 0);
unlock:
mutex_unlock(&local->iflist_mtx);
} }
static bool ieee80211_id_in_list(const u8 *ids, int n_ids, u8 id) static bool ieee80211_id_in_list(const u8 *ids, int n_ids, u8 id)