From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Christian Lamparter <chunkeey@googlemail.com>
Cc: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>,
linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org,
alan@lxorguk.ukuu.org.uk,
Linus Torvalds <torvalds@linux-foundation.org>,
Linux PM mailing list <linux-pm@vger.kernel.org>
Subject: Re: [RFC] firmware loader: retry _nowait requests when userhelper is not yet available
Date: Fri, 16 Mar 2012 23:57:10 +0100 [thread overview]
Message-ID: <201203162357.10770.rjw@sisk.pl> (raw)
In-Reply-To: <201203162325.56303.chunkeey@googlemail.com>
On Friday, March 16, 2012, Christian Lamparter wrote:
> On Friday 16 March 2012 23:19:53 Rafael J. Wysocki wrote:
> > > On 03/04/2012 01:52 AM, Christian Lamparter wrote:
> > >
> > > > During resume, the userhelper might not be available. However for
> > > > drivers which use the request_firmware_nowait interface, this will
> > > > only lead to a pointless WARNING and a device which no longer works
> > > > after the resume [since it couldn't get the firmware, because the
> > > > userhelper was not available to take the request].
> > > >
> > > > In order to solve this "chicken or egg" dilemma, the code now
> > > > retries _nowait requests at one second intervals until the
> > > > "loading_timeout" time is up.
> > > >
> > > > ---
> > > > I'm aware about the previous "request_firmware* in probe" discussions.
> > > > Unfortunately, the hardware needs firmware so there is no other way
> > > > around it. So please, I just wanted to know what the general opinion
> > > > about the idea behind this patch is.
> >
> > BTW, I wonder what comments on this patch were posted?
> Only Alan Cox was kind enough to drop me a few words.
>
> Why? Do you think it is actually sane from a specific POV?
> [Don't tell me you do :D !]
I don't think it's really wrong.
I agree that the WARN_ON() isn't really useful in the request_firmware_nowait()
case, because the user of that doesn't really know when exactly the firmware is
going to be requested, so it can't really do anything about the warning.
Moreover, failures of request_firmware_nowait() just because it happens to
race with system suspend (or something of that kind), just because of "bad"
timing, aren't really useful either.
So, I think it makes sense for it to wait until the firmware can be loaded.
I'd do that a bit differently, though, for example like in the appended patch
(untested).
Thanks,
Rafael
---
drivers/base/firmware_class.c | 31 +++++++++++++++++++++++++++----
1 file changed, 27 insertions(+), 4 deletions(-)
Index: linux/drivers/base/firmware_class.c
===================================================================
--- linux.orig/drivers/base/firmware_class.c
+++ linux/drivers/base/firmware_class.c
@@ -20,6 +20,7 @@
#include <linux/highmem.h>
#include <linux/firmware.h>
#include <linux/slab.h>
+#include <linux/delay.h>
#define to_dev(obj) container_of(obj, struct device, kobj)
@@ -535,10 +536,31 @@ static int _request_firmware(const struc
read_lock_usermodehelper();
- if (WARN_ON(usermodehelper_is_disabled())) {
+ if (nowait) {
+ int limit = loading_timeout * MSEC_PER_SEC;
+ int timeout = 10; /* in msec */
+
+ while (usermodehelper_is_disabled()) {
+ read_unlock_usermodehelper();
+
+ msleep(timeout);
+ if (loading_timeout > 0) {
+ limit -= timeout;
+ if (limit <= 0) {
+ retval = -EBUSY;
+ goto out;
+ }
+ }
+ timeout += timeout;
+ if (loading_timeout > 0 && timeout > limit)
+ timeout = limit;
+
+ read_lock_usermodehelper();
+ }
+ } else if (WARN_ON(usermodehelper_is_disabled())) {
dev_err(device, "firmware: %s will not be loaded\n", name);
retval = -EBUSY;
- goto out;
+ goto unlock;
}
if (uevent)
@@ -547,7 +569,7 @@ static int _request_firmware(const struc
fw_priv = fw_create_instance(firmware, name, device, uevent, nowait);
if (IS_ERR(fw_priv)) {
retval = PTR_ERR(fw_priv);
- goto out;
+ goto unlock;
}
if (uevent) {
@@ -572,9 +594,10 @@ static int _request_firmware(const struc
fw_destroy_instance(fw_priv);
-out:
+unlock:
read_unlock_usermodehelper();
+out:
if (retval) {
release_firmware(firmware);
*firmware_p = NULL;
next prev parent reply other threads:[~2012-03-16 22:53 UTC|newest]
Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-03 20:22 Christian Lamparter
2012-03-03 23:57 ` Alan Cox
2012-03-04 1:50 ` Christian Lamparter
2012-03-05 20:12 ` Srivatsa S. Bhat
2012-03-09 22:30 ` [PATCH] firmware loader: don't cancel _nowait requests when helper " Christian Lamparter
2012-03-09 23:36 ` Greg KH
2012-03-10 0:52 ` Christian Lamparter
2012-03-11 11:56 ` Kay Sievers
2012-03-13 9:37 ` Saravana Kannan
2012-03-13 9:43 ` Saravana Kannan
2012-03-13 20:14 ` Rafael J. Wysocki
2012-03-14 19:21 ` Stephen Boyd
2012-03-14 23:04 ` Rafael J. Wysocki
2012-03-14 23:13 ` Rafael J. Wysocki
2012-03-14 23:17 ` Stephen Boyd
2012-03-14 23:34 ` Rafael J. Wysocki
2012-03-14 23:38 ` Stephen Boyd
2012-03-15 0:11 ` Rafael J. Wysocki
2012-03-15 19:50 ` [PATCH] firmware_class: Move request_firmware_nowait() to workqueues Stephen Boyd
2012-03-15 20:07 ` Christian Lamparter
2012-03-15 20:12 ` Stephen Boyd
2012-03-15 22:31 ` Rafael J. Wysocki
2012-03-16 1:39 ` Stephen Boyd
2012-03-16 20:19 ` Rafael J. Wysocki
2012-03-16 20:26 ` Stephen Boyd
2012-03-16 21:45 ` Rafael J. Wysocki
2012-03-16 22:18 ` Christian Lamparter
2012-03-16 22:35 ` Rafael J. Wysocki
2012-03-17 2:47 ` [PATCH] firmware loader: don't cancel _nowait requests when helper is not yet available Stephen Boyd
2012-03-17 5:51 ` Linus Torvalds
2012-03-17 20:06 ` Rafael J. Wysocki
2012-03-18 8:26 ` Stephen Boyd
2012-03-18 12:01 ` Rafael J. Wysocki
2012-03-19 6:32 ` Stephen Boyd
2012-03-19 11:24 ` Rafael J. Wysocki
2012-03-19 23:00 ` Rafael J. Wysocki
2012-03-25 22:00 ` [PATCH 0/6] firmware_class: Fix problems with usermodehelper test Rafael J. Wysocki
2012-03-25 22:01 ` [PATCH 1/6] firmware_class: Rework usermodehelper check Rafael J. Wysocki
2012-03-25 22:01 ` [PATCH 2/6] firmware_class: Split _request_firmware() into three functions Rafael J. Wysocki
2012-03-26 18:15 ` Stephen Boyd
2012-03-26 18:21 ` Stephen Boyd
2012-03-26 20:12 ` Rafael J. Wysocki
2012-03-26 20:31 ` Stephen Boyd
2012-03-26 20:36 ` Rafael J. Wysocki
2012-03-27 21:35 ` Stephen Boyd
2012-03-27 21:51 ` Rafael J. Wysocki
2012-03-25 22:02 ` [PATCH 3/6] firmware_class: Do not warn that system is not ready from async loads Rafael J. Wysocki
2012-03-25 22:03 ` [PATCH 4/6] PM / Hibernate: Disable usermode helpers right before freezing tasks Rafael J. Wysocki
2012-03-25 22:03 ` [PATCH 5/6] PM / Sleep: Move disabling of usermode helpers to the freezer Rafael J. Wysocki
2012-03-25 22:04 ` [PATCH 6/6] PM / Sleep: Mitigate race between the freezer and request_firmware() Rafael J. Wysocki
2012-03-26 18:16 ` Stephen Boyd
2012-03-26 20:06 ` Rafael J. Wysocki
2012-03-27 21:25 ` Stephen Boyd
2012-03-27 21:37 ` Rafael J. Wysocki
2012-03-26 18:42 ` [PATCH 0/6] firmware_class: Fix problems with usermodehelper test Greg KH
2012-03-26 20:37 ` Rafael J. Wysocki
2012-03-27 21:28 ` [PATCH 1/2] firmware_class: Reorganize fw_create_instance() Stephen Boyd
2012-03-27 21:47 ` Rafael J. Wysocki
2012-03-27 21:49 ` Greg KH
2012-03-27 21:56 ` Rafael J. Wysocki
2012-03-27 21:28 ` [PATCH 2/2] firmware_class: Move request_firmware_nowait() to workqueues Stephen Boyd
2012-03-27 21:49 ` Rafael J. Wysocki
2012-03-27 22:01 ` Tejun Heo
2012-03-27 22:21 ` Rafael J. Wysocki
2012-03-27 22:48 ` Tejun Heo
2012-03-27 22:55 ` Rafael J. Wysocki
2012-03-27 23:02 ` Stephen Boyd
2012-03-27 23:05 ` Stephen Boyd
2012-03-28 21:19 ` [PATCH v2 0/8] firmware_class: Fix problems with usermodehelper test Rafael J. Wysocki
2012-03-28 21:20 ` [PATCH v2 1/8] firmware_class: Rework usermodehelper check Rafael J. Wysocki
2012-03-28 21:21 ` [PATCH v2 2/8] firmware_class: Split _request_firmware() into three functions, v2 Rafael J. Wysocki
2012-03-28 21:22 ` [PATCH v3 3/8] firmware_class: Do not warn that system is not ready from async loads Rafael J. Wysocki
2012-03-28 21:23 ` [PATCH v2 4/8] PM / Hibernate: Disable usermode helpers right before freezing tasks Rafael J. Wysocki
2012-03-28 21:23 ` [PATCH v2 5/8] PM / Sleep: Move disabling of usermode helpers to the freezer Rafael J. Wysocki
2012-03-28 21:24 ` [PATCH v2 6/8] PM / Sleep: Mitigate race between the freezer and request_firmware() Rafael J. Wysocki
2012-03-28 21:25 ` [PATCH v2 7/8] firmware_class: Reorganize fw_create_instance() Rafael J. Wysocki
2012-03-28 21:26 ` [PATCH v2 8/8] firmware_class: Move request_firmware_nowait() to workqueues Rafael J. Wysocki
2012-03-14 23:19 ` [PATCH] firmware loader: don't cancel _nowait requests when helper is not yet available Rafael J. Wysocki
2012-03-13 19:42 ` Rafael J. Wysocki
2012-03-13 23:25 ` Kay Sievers
2012-03-14 0:10 ` Rafael J. Wysocki
2012-03-14 0:14 ` Kay Sievers
2012-03-14 0:54 ` Linus Torvalds
2012-03-14 1:43 ` Kay Sievers
2012-03-14 1:51 ` Linus Torvalds
2012-03-14 1:55 ` Kay Sievers
2012-03-14 2:00 ` Kay Sievers
2012-03-14 2:21 ` Linus Torvalds
2012-03-14 15:07 ` Srivatsa S. Bhat
2012-03-14 22:54 ` Rafael J. Wysocki
2012-03-16 7:14 ` Srivatsa S. Bhat
2012-03-16 20:23 ` Rafael J. Wysocki
2012-03-16 21:14 ` Christian Lamparter
2012-03-16 21:19 ` Linus Torvalds
2012-03-19 7:06 ` Srivatsa S. Bhat
2012-03-16 22:19 ` [RFC] firmware loader: retry _nowait requests when userhelper " Rafael J. Wysocki
2012-03-16 22:25 ` Christian Lamparter
2012-03-16 22:57 ` Rafael J. Wysocki [this message]
2012-03-16 23:35 ` Christian Lamparter
2012-03-16 23:37 ` Linus Torvalds
2012-03-17 0:23 ` Rafael J. Wysocki
2012-03-17 0:33 ` Linus Torvalds
2012-03-18 0:29 ` Rafael J. Wysocki
2012-03-18 2:21 ` Linus Torvalds
2012-03-18 12:21 ` Rafael J. Wysocki
2012-03-18 12:43 ` Christian Lamparter
2012-03-18 23:15 ` [PATCH 0/3] firmware_class: Fix problem with async requests (was: Re: [RFC] firmware loader: retry ...) Rafael J. Wysocki
2012-03-18 23:17 ` [PATCH 1/3] firmware_class: Rework usermodehelper check Rafael J. Wysocki
2012-03-18 23:18 ` [PATCH 2/3] firmware_class: Split _request_firmware() into three functions Rafael J. Wysocki
2012-03-18 23:21 ` [PATCH 3/3] firmware_class: Do not warn that system is not ready for async loads Rafael J. Wysocki
2012-03-19 12:41 ` [RFC] firmware loader: retry _nowait requests when userhelper is not yet available James Courtier-Dutton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201203162357.10770.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=chunkeey@googlemail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=srivatsa.bhat@linux.vnet.ibm.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®