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:
Родитель
04b7b2ff50
Коммит
5d8e4237d2
|
@ -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)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче