Skip to content

Commit 328efda

Browse files
ajaykathatKalle Valo
authored andcommitted
wifi: wilc1000: do not realloc workqueue everytime an interface is added
Commit 09ed8bf ("wilc1000: Rename workqueue from "WILC_wq" to "NETDEV-wq"") moved workqueue creation in wilc_netdev_ifc_init in order to set the interface name in the workqueue name. However, while the driver needs only one workqueue, the wilc_netdev_ifc_init is called each time we add an interface over a phy, which in turns overwrite the workqueue with a new one. This can be observed with the following commands: for i in $(seq 0 10) do iw phy phy0 interface add wlan1 type managed iw dev wlan1 del done ps -eo pid,comm|grep wlan 39 kworker/R-wlan0 98 kworker/R-wlan1 102 kworker/R-wlan1 105 kworker/R-wlan1 108 kworker/R-wlan1 111 kworker/R-wlan1 114 kworker/R-wlan1 117 kworker/R-wlan1 120 kworker/R-wlan1 123 kworker/R-wlan1 126 kworker/R-wlan1 129 kworker/R-wlan1 Fix this leakage by putting back hif_workqueue allocation in wilc_cfg80211_init. Regarding the workqueue name, it is indeed relevant to set it lowercase, however it is not attached to a specific netdev, so enforcing netdev name in the name is not so relevant. Still, enrich the name with the wiphy name to make it clear which phy is using the workqueue. Fixes: 09ed8bf ("wilc1000: Rename workqueue from "WILC_wq" to "NETDEV-wq"") Signed-off-by: Ajay Singh <[email protected]> Co-developed-by: Alexis Lothoré <[email protected]> Signed-off-by: Alexis Lothoré <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://msgid.link/[email protected]
1 parent 5228495 commit 328efda

File tree

2 files changed

+11
-10
lines changed

2 files changed

+11
-10
lines changed

drivers/net/wireless/microchip/wilc1000/cfg80211.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1804,15 +1804,24 @@ int wilc_cfg80211_init(struct wilc **wilc, struct device *dev, int io_type,
18041804
INIT_LIST_HEAD(&wl->rxq_head.list);
18051805
INIT_LIST_HEAD(&wl->vif_list);
18061806

1807+
wl->hif_workqueue = alloc_ordered_workqueue("%s", WQ_MEM_RECLAIM,
1808+
wiphy_name(wl->wiphy));
1809+
if (!wl->hif_workqueue) {
1810+
ret = -ENOMEM;
1811+
goto free_cfg;
1812+
}
18071813
vif = wilc_netdev_ifc_init(wl, "wlan%d", WILC_STATION_MODE,
18081814
NL80211_IFTYPE_STATION, false);
18091815
if (IS_ERR(vif)) {
18101816
ret = PTR_ERR(vif);
1811-
goto free_cfg;
1817+
goto free_hq;
18121818
}
18131819

18141820
return 0;
18151821

1822+
free_hq:
1823+
destroy_workqueue(wl->hif_workqueue);
1824+
18161825
free_cfg:
18171826
wilc_wlan_cfg_deinit(wl);
18181827

drivers/net/wireless/microchip/wilc1000/netdev.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -989,13 +989,6 @@ struct wilc_vif *wilc_netdev_ifc_init(struct wilc *wl, const char *name,
989989
goto error;
990990
}
991991

992-
wl->hif_workqueue = alloc_ordered_workqueue("%s-wq", WQ_MEM_RECLAIM,
993-
ndev->name);
994-
if (!wl->hif_workqueue) {
995-
ret = -ENOMEM;
996-
goto unregister_netdev;
997-
}
998-
999992
ndev->needs_free_netdev = true;
1000993
vif->iftype = vif_type;
1001994
vif->idx = wilc_get_available_idx(wl);
@@ -1008,12 +1001,11 @@ struct wilc_vif *wilc_netdev_ifc_init(struct wilc *wl, const char *name,
10081001

10091002
return vif;
10101003

1011-
unregister_netdev:
1004+
error:
10121005
if (rtnl_locked)
10131006
cfg80211_unregister_netdevice(ndev);
10141007
else
10151008
unregister_netdev(ndev);
1016-
error:
10171009
free_netdev(ndev);
10181010
return ERR_PTR(ret);
10191011
}

0 commit comments

Comments
 (0)