mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 19:13:47 +02:00
wifi: mac80211: Add non-atomic station iterator
Drivers may at times want to iterate their stations with a function which requires some non-atomic operations. ieee80211_iterate_stations_mtx() introduces an API to iterate stations while holding that wiphy's mutex. This allows the iterating function to do non-atomic operations safely. Signed-off-by: Rory Little <rory@candelatech.com> Link: https://patch.msgid.link/20240806004024.2014080-2-rory@candelatech.com [unify internal list iteration functions] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
6a1a6f2dba
commit
7c3b69eade
|
|
@ -6243,6 +6243,24 @@ void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
|
|||
void (*iterator)(void *data,
|
||||
struct ieee80211_sta *sta),
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* ieee80211_iterate_stations_mtx - iterate stations
|
||||
*
|
||||
* This function iterates over all stations associated with a given
|
||||
* hardware that are currently uploaded to the driver and calls the callback
|
||||
* function for them. This version can only be used while holding the wiphy
|
||||
* mutex.
|
||||
*
|
||||
* @hw: the hardware struct of which the interfaces should be iterated over
|
||||
* @iterator: the iterator function to call
|
||||
* @data: first argument of the iterator function
|
||||
*/
|
||||
void ieee80211_iterate_stations_mtx(struct ieee80211_hw *hw,
|
||||
void (*iterator)(void *data,
|
||||
struct ieee80211_sta *sta),
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* ieee80211_queue_work - add work onto the mac80211 workqueue
|
||||
*
|
||||
|
|
|
|||
|
|
@ -833,7 +833,8 @@ static void __iterate_stations(struct ieee80211_local *local,
|
|||
{
|
||||
struct sta_info *sta;
|
||||
|
||||
list_for_each_entry_rcu(sta, &local->sta_list, list) {
|
||||
list_for_each_entry_rcu(sta, &local->sta_list, list,
|
||||
lockdep_is_held(&local->hw.wiphy->mtx)) {
|
||||
if (!sta->uploaded)
|
||||
continue;
|
||||
|
||||
|
|
@ -854,6 +855,19 @@ void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_atomic);
|
||||
|
||||
void ieee80211_iterate_stations_mtx(struct ieee80211_hw *hw,
|
||||
void (*iterator)(void *data,
|
||||
struct ieee80211_sta *sta),
|
||||
void *data)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
|
||||
lockdep_assert_wiphy(local->hw.wiphy);
|
||||
|
||||
__iterate_stations(local, iterator, data);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_mtx);
|
||||
|
||||
struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user