Messages in this thread Patch in this message | | | Date | Tue, 21 Oct 2003 15:25:48 +0200 | From | Manuel Estrada Sainz <> | Subject | [PATCH] Proposal to remove workqueue usage from request_firmware_async() |
| |
Michael Hunold also confirmed that it works for him, IMHO it should be safe at least for the -mm tree.
The only difference with the previous patch is:
-daemonize("%s/%s", "firmware", fw_work->name); +daemonize("firmware/%s", fw_work->name);
ChangeLog:
In it's current form request_firmware sleeps for too long on the system's common workqueue, and using a private workqueue as previously proposed is not optimal. This patch creates one kernel_thread for each request_firmware_async() invocation which dies once the job is done.
firmware_class.c | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-)
Index: drivers/base/firmware_class.c =================================================================== --- linux-2.5/drivers/base/firmware_class.c (revision 14117) +++ linux-2.5/drivers/base/firmware_class.c (working copy) @@ -415,18 +415,22 @@ void (*cont)(const struct firmware *fw, void *context); }; -static void +static int request_firmware_work_func(void *arg) { struct firmware_work *fw_work = arg; const struct firmware *fw; - if (!arg) - return; + if (!arg) { + WARN_ON(1); + return 0; + } + daemonize("firmware/%s", fw_work->name); request_firmware(&fw, fw_work->name, fw_work->device); fw_work->cont(fw, fw_work->context); release_firmware(fw); module_put(fw_work->module); kfree(fw_work); + return 0; } /** @@ -451,6 +455,8 @@ { struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work), GFP_ATOMIC); + int ret; + if (!fw_work) return -ENOMEM; if (!try_module_get(module)) { @@ -465,9 +471,14 @@ .context = context, .cont = cont, }; - INIT_WORK(&fw_work->work, request_firmware_work_func, fw_work); - schedule_work(&fw_work->work); + ret = kernel_thread(request_firmware_work_func, fw_work, + CLONE_FS | CLONE_FILES); + + if (ret < 0) { + fw_work->cont(NULL, fw_work->context); + return ret; + } return 0; } -- --- Manuel Estrada Sainz <ranty@debian.org> <ranty@bigfoot.com> <ranty@users.sourceforge.net> ------------------------ <manuel.estrada@hispalinux.es> ------------------- Let us have the serenity to accept the things we cannot change, courage to change the things we can, and wisdom to know the difference. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |