Proposal to remove workqueue usage from request_firmware_async()
PATCH 1/1 Proposal to remove workqueue usage from request_firmware_async()
How does this look?
Interested parties please test and comment.
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(-)
drivers/base/firmware_class.c +16 -5
@@ -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 ("%s/%s" ,"firmware" , 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 ; }
Signature · 6 lines
--- Manuel Estrada Sainz <[email protected]> <[email protected]> <[email protected]> ------------------------ <[email protected]> ------------------- 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.
Quoted 2 lines · Manuel Estrada Sainz
How does this look?
OK I guess. I assume it works?
drivers/base/firmware_class.c line 427
Quoted 1 line
drivers/base/firmware_class.c +1
-0+daemonize ("%s/%s" ,"firmware" , fw_work->name);
daemonize("firmware/%s", "fw_work->name);Quoted 1 line · Andrew Morton
daemonize("firmware/%s", "fw_work->name);daemonize("firmware/%s", fw_work->name);
Quoted 7 lines
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Signature · 6 lines
"Dios es real, a no ser que sea declarado como entero" Jorge Bernal "Koke" http://sindominio.net/~koke/ Jabber-ID: [email protected] <[email protected]> || <[email protected]> .: www.augustux.org :: pulsar.gotdns.org :.
Quoted 5 lines · Andrew Morton
Quoted 2 lines · Manuel Estrada Sainz
How does this look?
OK I guess. I assume it works?
Yes, it works. Although I didn't do heavy testing and it is the first time I play with kernel threads durectly, so I may be doing something stupid.
Quoted 3 lines
drivers/base/firmware_class.c line 427
Quoted 1 line
drivers/base/firmware_class.c +1
-0+daemonize ("%s/%s" ,"firmware" , fw_work->name);daemonize("firmware/%s", "fw_work->name);
Dumb me, I'll resend with that.
Regards
Manuel
Signature · 6 lines
--- Manuel Estrada Sainz <[email protected]> <[email protected]> <[email protected]> ------------------------ <[email protected]> ------------------- 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.
Hello Manuel,
Quoted 2 lines
How does this look?
Interested parties please test and comment.
I updated my patch for the av7110 DVB driver from LinuxTV.org and I can confirm that it works very well.
Recent updates are in
http://linuxtv.org/cgi-bin/cvsweb.cgi/dvb-kernel/patches-2.6/
I usually set the timeout value to "60" and then manually load the firmware. Everything is ok, IMHO this patch can be submitted.
CU
Michael.