From: David S. Miller Date: Mon, 22 Jan 2018 14:36:37 +0000 (-0500) Subject: Merge tag 'mac80211-next-for-davem-2018-01-22' of git://git.kernel.org/pub/scm/linux... X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=291040cd7e8368a38ae6624f457c39827c55c7f8;p=linux.git Merge tag 'mac80211-next-for-davem-2018-01-22' of git://git./linux/kernel/git/jberg/mac80211-next Johannes Berg says: ==================== Less than a handful of changes: * possible memory leak fix in hwsim * speed up hwsim * add hwsim userspace rate control API * code cleanups ==================== A conflict was resolved in mac80211_hwsim.c, mostly of the simple overlapping changes category. One adding a rhashtable and another adding a workqueue. Signed-off-by: David S. Miller --- 291040cd7e8368a38ae6624f457c39827c55c7f8 diff --cc drivers/net/wireless/mac80211_hwsim.c index e54255597facd,66c2ac0397dad..1cf22e62e3ddd --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c @@@ -489,7 -490,7 +490,8 @@@ static const struct ieee80211_iface_com static spinlock_t hwsim_radio_lock; static LIST_HEAD(hwsim_radios); +static struct workqueue_struct *hwsim_wq; + static struct rhashtable hwsim_radios_rht; static int hwsim_radio_idx; static struct platform_driver mac80211_hwsim_driver = { @@@ -3352,8 -3398,10 +3404,10 @@@ static void remove_user_radios(u32 port list_for_each_entry_safe(entry, tmp, &hwsim_radios, list) { if (entry->destroy_on_close && entry->portid == portid) { list_del(&entry->list); + rhashtable_remove_fast(&hwsim_radios_rht, &entry->rht, + hwsim_rht_params); INIT_WORK(&entry->destroy_work, destroy_radio); - schedule_work(&entry->destroy_work); + queue_work(hwsim_wq, &entry->destroy_work); } } spin_unlock_bh(&hwsim_radio_lock); @@@ -3427,8 -3475,10 +3481,10 @@@ static void __net_exit hwsim_exit_net(s continue; list_del(&data->list); + rhashtable_remove_fast(&hwsim_radios_rht, &data->rht, + hwsim_rht_params); INIT_WORK(&data->destroy_work, destroy_radio); - schedule_work(&data->destroy_work); + queue_work(hwsim_wq, &data->destroy_work); } spin_unlock_bh(&hwsim_radio_lock); } @@@ -3460,9 -3510,7 +3516,10 @@@ static int __init init_mac80211_hwsim(v spin_lock_init(&hwsim_radio_lock); + hwsim_wq = alloc_workqueue("hwsim_wq",WQ_MEM_RECLAIM,0); + if (!hwsim_wq) + return -ENOMEM; + rhashtable_init(&hwsim_radios_rht, &hwsim_rht_params); err = register_pernet_device(&hwsim_net_ops); if (err) @@@ -3602,8 -3650,7 +3659,9 @@@ static void __exit exit_mac80211_hwsim( hwsim_exit_netlink(); mac80211_hwsim_free(); + flush_workqueue(hwsim_wq); + + rhashtable_destroy(&hwsim_radios_rht); unregister_netdev(hwsim_mon); platform_driver_unregister(&mac80211_hwsim_driver); unregister_pernet_device(&hwsim_net_ops);