|
|
@@ -520,7 +520,6 @@ struct mac80211_hwsim_data {
|
|
|
int channels, idx;
|
|
|
bool use_chanctx;
|
|
|
bool destroy_on_close;
|
|
|
- struct work_struct destroy_work;
|
|
|
u32 portid;
|
|
|
char alpha2[2];
|
|
|
const struct ieee80211_regdomain *regd;
|
|
|
@@ -2935,8 +2934,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
|
|
hwsim_radios_generation++;
|
|
|
spin_unlock_bh(&hwsim_radio_lock);
|
|
|
|
|
|
- if (idx > 0)
|
|
|
- hwsim_mcast_new_radio(idx, info, param);
|
|
|
+ hwsim_mcast_new_radio(idx, info, param);
|
|
|
|
|
|
return idx;
|
|
|
|
|
|
@@ -3565,30 +3563,27 @@ static struct genl_family hwsim_genl_family __ro_after_init = {
|
|
|
.n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
|
|
|
};
|
|
|
|
|
|
-static void destroy_radio(struct work_struct *work)
|
|
|
-{
|
|
|
- struct mac80211_hwsim_data *data =
|
|
|
- container_of(work, struct mac80211_hwsim_data, destroy_work);
|
|
|
-
|
|
|
- hwsim_radios_generation++;
|
|
|
- mac80211_hwsim_del_radio(data, wiphy_name(data->hw->wiphy), NULL);
|
|
|
-}
|
|
|
-
|
|
|
static void remove_user_radios(u32 portid)
|
|
|
{
|
|
|
struct mac80211_hwsim_data *entry, *tmp;
|
|
|
+ LIST_HEAD(list);
|
|
|
|
|
|
spin_lock_bh(&hwsim_radio_lock);
|
|
|
list_for_each_entry_safe(entry, tmp, &hwsim_radios, list) {
|
|
|
if (entry->destroy_on_close && entry->portid == portid) {
|
|
|
- list_del(&entry->list);
|
|
|
+ list_move(&entry->list, &list);
|
|
|
rhashtable_remove_fast(&hwsim_radios_rht, &entry->rht,
|
|
|
hwsim_rht_params);
|
|
|
- INIT_WORK(&entry->destroy_work, destroy_radio);
|
|
|
- queue_work(hwsim_wq, &entry->destroy_work);
|
|
|
+ hwsim_radios_generation++;
|
|
|
}
|
|
|
}
|
|
|
spin_unlock_bh(&hwsim_radio_lock);
|
|
|
+
|
|
|
+ list_for_each_entry_safe(entry, tmp, &list, list) {
|
|
|
+ list_del(&entry->list);
|
|
|
+ mac80211_hwsim_del_radio(entry, wiphy_name(entry->hw->wiphy),
|
|
|
+ NULL);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static int mac80211_hwsim_netlink_notify(struct notifier_block *nb,
|
|
|
@@ -3646,6 +3641,7 @@ static __net_init int hwsim_init_net(struct net *net)
|
|
|
static void __net_exit hwsim_exit_net(struct net *net)
|
|
|
{
|
|
|
struct mac80211_hwsim_data *data, *tmp;
|
|
|
+ LIST_HEAD(list);
|
|
|
|
|
|
spin_lock_bh(&hwsim_radio_lock);
|
|
|
list_for_each_entry_safe(data, tmp, &hwsim_radios, list) {
|
|
|
@@ -3656,17 +3652,19 @@ static void __net_exit hwsim_exit_net(struct net *net)
|
|
|
if (data->netgroup == hwsim_net_get_netgroup(&init_net))
|
|
|
continue;
|
|
|
|
|
|
- list_del(&data->list);
|
|
|
+ list_move(&data->list, &list);
|
|
|
rhashtable_remove_fast(&hwsim_radios_rht, &data->rht,
|
|
|
hwsim_rht_params);
|
|
|
hwsim_radios_generation++;
|
|
|
- spin_unlock_bh(&hwsim_radio_lock);
|
|
|
+ }
|
|
|
+ spin_unlock_bh(&hwsim_radio_lock);
|
|
|
+
|
|
|
+ list_for_each_entry_safe(data, tmp, &list, list) {
|
|
|
+ list_del(&data->list);
|
|
|
mac80211_hwsim_del_radio(data,
|
|
|
wiphy_name(data->hw->wiphy),
|
|
|
NULL);
|
|
|
- spin_lock_bh(&hwsim_radio_lock);
|
|
|
}
|
|
|
- spin_unlock_bh(&hwsim_radio_lock);
|
|
|
|
|
|
ida_simple_remove(&hwsim_netgroup_ida, hwsim_net_get_netgroup(net));
|
|
|
}
|