On 02/20/2012 02:44 PM, Arend van Spriel wrote:
As indicated in [1] on netdev mailing list drivers should not block
on the init_module() syscall. This patch defers the actual driver
registration to a workqueue so the init_module() syscall can complete
without delay.
[1] http://article.gmane.org/gmane.linux.network/217729/
Cc: Kay Sievers<kay.sievers@xxxxxxxx>
Cc: Larry Finger<Larry.Finger@xxxxxxxxxxxx>
Signed-off-by: Arend van Spriel<arend@xxxxxxxxxxxx>
---
Here is the patch I came up with to avoid udev blocking on init_module().
It is pretty straightforward, but maybe I am overlooking things here. So
feel free to comment.
Gr. AvS
Arend,
Despite the simplicity, this patch looks right to me. As a side benefit, I
learned about the DECLARE_WORK macro. Handy for this purpose.
Larry
---
.../net/wireless/brcm80211/brcmsmac/mac80211_if.c | 17 ++++++++++-------
1 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
index fec0f10..fe73451 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
@@ -1173,21 +1173,24 @@ static struct bcma_driver brcms_bcma_driver = {
* and if so, performs a brcms_attach() on it.
*
*/
-static int __init brcms_module_init(void)
+static void brcms_driver_init(struct work_struct *work)
{
int error = -ENODEV;
+ error = bcma_driver_register(&brcms_bcma_driver);
+ pr_err("%s: register returned %d\n", __func__, error);
+}
+
+DECLARE_WORK(brcms_driver_work, brcms_driver_init);
+
+static int __init brcms_module_init(void)
+{
#ifdef DEBUG
if (msglevel != 0xdeadbeef)
brcm_msg_level = msglevel;
#endif /* DEBUG */
- error = bcma_driver_register(&brcms_bcma_driver);
- pr_err("%s: register returned %d\n", __func__, error);
- if (!error)
- return 0;
-
- return error;
+ return schedule_work(&brcms_driver_work);
}
/**
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html