Commit e3208fb7 authored by Johannes Berg's avatar Johannes Berg
Browse files

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: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 777b2600
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -2149,7 +2149,7 @@ 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,
	wiphy_delayed_work_init(&sdata->dec_tailroom_needed_wk,
				ieee80211_delayed_tailroom_dec);

	for (i = 0; i < NUM_NL80211_BANDS; i++) {
+7 −4
Original line number Diff line number Diff line
@@ -775,7 +775,8 @@ 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,
			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;

+3 −2
Original line number Diff line number Diff line
@@ -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 */
+2 −1
Original line number Diff line number Diff line
@@ -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);

Loading