wifi: mac80211: add ieee80211_iter_chan_contexts_mtx

Add a chanctx iterator that can be called from a wiphy-locked context.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250212082137.d85eef3024de.Icda0616416c5fd4b2cbf892bdab2476f26e644ec@changeid
[fix kernel-doc]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Miri Korenblit 2025-02-12 08:22:57 +02:00 committed by Johannes Berg
parent d00c0c4105
commit ebba23e077
2 changed files with 44 additions and 1 deletions

View File

@ -6671,6 +6671,31 @@ void ieee80211_iter_chan_contexts_atomic(
void *data),
void *iter_data);
/**
* ieee80211_iter_chan_contexts_mtx - iterate channel contexts
* @hw: pointer obtained from ieee80211_alloc_hw().
* @iter: iterator function
* @iter_data: data passed to iterator function
*
* Iterate all active channel contexts. This function can only be used while
* holding the wiphy mutex.
*
* The iterator will not find a context that's being added (during
* the driver callback to add it) but will find it while it's being
* removed.
*
* Note that during hardware restart, all contexts that existed
* before the restart are considered already present so will be
* found while iterating, whether they've been re-added already
* or not.
*/
void ieee80211_iter_chan_contexts_mtx(
struct ieee80211_hw *hw,
void (*iter)(struct ieee80211_hw *hw,
struct ieee80211_chanctx_conf *chanctx_conf,
void *data),
void *iter_data);
/**
* ieee80211_ap_probereq_get - retrieve a Probe Request template
* @hw: pointer obtained from ieee80211_alloc_hw().

View File

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* mac80211 - channel management
* Copyright 2020 - 2024 Intel Corporation
* Copyright 2020 - 2025 Intel Corporation
*/
#include <linux/nl80211.h>
@ -2178,3 +2178,21 @@ void ieee80211_iter_chan_contexts_atomic(
rcu_read_unlock();
}
EXPORT_SYMBOL_GPL(ieee80211_iter_chan_contexts_atomic);
void ieee80211_iter_chan_contexts_mtx(
struct ieee80211_hw *hw,
void (*iter)(struct ieee80211_hw *hw,
struct ieee80211_chanctx_conf *chanctx_conf,
void *data),
void *iter_data)
{
struct ieee80211_local *local = hw_to_local(hw);
struct ieee80211_chanctx *ctx;
lockdep_assert_wiphy(hw->wiphy);
list_for_each_entry(ctx, &local->chanctx_list, list)
if (ctx->driver_present)
iter(hw, &ctx->conf, iter_data);
}
EXPORT_SYMBOL_GPL(ieee80211_iter_chan_contexts_mtx);