wifi: mac80211: move key tailroom work to wiphy work

This way we hold the wiphy mutex there, as a step towards
removing some of the additional locks we have.

Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2023-08-28 13:59:47 +02:00
parent 777b26002b
commit e3208fb739
6 changed files with 17 additions and 11 deletions

View file

@ -1041,7 +1041,7 @@ struct ieee80211_sub_if_data {
/* count for keys needing tailroom space allocation */
int crypto_tx_tailroom_needed_cnt;
int crypto_tx_tailroom_pending_dec;
struct delayed_work dec_tailroom_needed_wk;
struct wiphy_delayed_work dec_tailroom_needed_wk;
struct net_device *dev;
struct ieee80211_local *local;

View file

@ -2149,8 +2149,8 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
INIT_LIST_HEAD(&sdata->key_list);
INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk,
ieee80211_delayed_tailroom_dec);
wiphy_delayed_work_init(&sdata->dec_tailroom_needed_wk,
ieee80211_delayed_tailroom_dec);
for (i = 0; i < NUM_NL80211_BANDS; i++) {
struct ieee80211_supported_band *sband;

View file

@ -775,8 +775,9 @@ static void __ieee80211_key_destroy(struct ieee80211_key *key,
if (delay_tailroom) {
/* see ieee80211_delayed_tailroom_dec */
sdata->crypto_tx_tailroom_pending_dec++;
schedule_delayed_work(&sdata->dec_tailroom_needed_wk,
HZ/2);
wiphy_delayed_work_queue(sdata->local->hw.wiphy,
&sdata->dec_tailroom_needed_wk,
HZ / 2);
} else {
decrease_tailroom_need_count(sdata, 1);
}
@ -1122,7 +1123,8 @@ void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata,
struct ieee80211_key *key, *tmp;
LIST_HEAD(keys);
cancel_delayed_work_sync(&sdata->dec_tailroom_needed_wk);
wiphy_delayed_work_cancel(local->hw.wiphy,
&sdata->dec_tailroom_needed_wk);
mutex_lock(&local->key_mtx);
@ -1193,7 +1195,8 @@ void ieee80211_free_sta_keys(struct ieee80211_local *local,
mutex_unlock(&local->key_mtx);
}
void ieee80211_delayed_tailroom_dec(struct work_struct *wk)
void ieee80211_delayed_tailroom_dec(struct wiphy *wiphy,
struct wiphy_work *wk)
{
struct ieee80211_sub_if_data *sdata;

View file

@ -2,7 +2,7 @@
/*
* Copyright 2002-2004, Instant802 Networks, Inc.
* Copyright 2005, Devicescape Software, Inc.
* Copyright (C) 2019, 2022 Intel Corporation
* Copyright (C) 2019, 2022-2023 Intel Corporation
*/
#ifndef IEEE80211_KEY_H
@ -174,6 +174,7 @@ int ieee80211_key_switch_links(struct ieee80211_sub_if_data *sdata,
#define rcu_dereference_check_key_mtx(local, ref) \
rcu_dereference_check(ref, lockdep_is_held(&((local)->key_mtx)))
void ieee80211_delayed_tailroom_dec(struct work_struct *wk);
void ieee80211_delayed_tailroom_dec(struct wiphy *wiphy,
struct wiphy_work *wk);
#endif /* IEEE80211_KEY_H */

View file

@ -372,7 +372,8 @@ static void ieee80211_restart_work(struct work_struct *work)
sdata_unlock(sdata);
}
}
flush_delayed_work(&sdata->dec_tailroom_needed_wk);
wiphy_delayed_work_flush(local->hw.wiphy,
&sdata->dec_tailroom_needed_wk);
}
ieee80211_scan_cancel(local);

View file

@ -161,7 +161,8 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
break;
}
flush_delayed_work(&sdata->dec_tailroom_needed_wk);
wiphy_delayed_work_flush(local->hw.wiphy,
&sdata->dec_tailroom_needed_wk);
drv_remove_interface(local, sdata);
}