From: Saravana Kannan <skannan@codeaurora.org>
To: Kay Sievers <kay.sievers@vrfy.org>
Cc: Greg KH <gregkh@linuxfoundation.org>,
Christian Lamparter <chunkeey@googlemail.com>,
linux-kernel@vger.kernel.org,
"Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>,
alan@lxorguk.ukuu.org.uk, "Rafael J. Wysocki" <rjw@sisk.pl>,
Linus Torvalds <torvalds@linux-foundation.org>,
Linux PM mailing list <linux-pm@vger.kernel.org>,
Stephen Boyd <sboyd@codeaurora.org>,
Saravana Kannan <skannan@codeaurora.org>
Subject: Re: Re: [PATCH] firmware loader: don't cancel _nowait requests when helper is not yet available
Date: Tue, 13 Mar 2012 02:37:27 -0700 [thread overview]
Message-ID: <4F5F1557.8000100@codeaurora.org> (raw)
In-Reply-To: <CAPXgP10oHRnPo7Es1RX8GM68dH13E0rzcFhXzOYFPcmKs=yh1A@mail.gmail.com>
On 01/-10/37 11:59, Kay Sievers wrote:
> On Sat, Mar 10, 2012 at 00:36, Greg KH<gregkh@linuxfoundation.org> wrote:
>> On Fri, Mar 09, 2012 at 11:30:24PM +0100, Christian Lamparter wrote:
>>> This patch fixes a regression which was introduced by:
>>> "PM: Print a warning if firmware is requested when tasks are frozen"
>>>
>>> request_firmware_nowait does not stall in any system resume paths.
>>> Therefore, I think it is perfectly save to use request_firmware_nowait
>>> from at least the ->complete() callback.
>>
>> Is there code somewhere in the kernel that wants to do this? Has commit
>> a144c6a broken it somehow that this fix would resolve it?
>>
>>>
>>> Signed-off-by: Christian Lamparter<chunkeey@googlemail.com>
>>> ---
>>> drivers/base/firmware_class.c | 2 +-
>>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
>>> index 6c9387d..017e020 100644
>>> --- a/drivers/base/firmware_class.c
>>> +++ b/drivers/base/firmware_class.c
>>> @@ -535,7 +535,7 @@ static int _request_firmware(const struct firmware **firmware_p,
>>>
>>> read_lock_usermodehelper();
>>>
>>> - if (WARN_ON(usermodehelper_is_disabled())) {
>>> + if (WARN_ON(usermodehelper_is_disabled()&& !(nowait&& uevent))) {
>>
>> What does uevent have to do with things here?
>
> I don't think that the firmware loader should care about the
> usermodehelper at all, and that stuff fiddling should just be removed
> from the firmware class.
>
> Forking /sbin/hotplug is disabled by default, it is a broken concept,
> and it cannot work reliably on today's systems.
>
> Firmware is not loaded by /sbin/hotplug since many years, but by udev
> or whatever service handles uevents, like ueventd on android.
We (mach-msm) just happened to be looking at similar issues with
request_firmware. The recent changes to request_firmware to check for
usermodehelper_is_disabled() was preventing us from using
request_firmware() in what I think is a valid use case. I will get to
that later.
To first suggest a solution specific the problem this patch is trying to
address, I think it would be better to do something like below. It's
just a quick RFC to show what I mean -- haven't even compiled it. If
there is an agreement on this suggestion, I can send out a cleaner patch.
firmware class: Check for usermode helper availability only
when enabled.
Signed-off-by: Saravana Kannan <skannan@codeaurora.org>
---
drivers/base/firmware_class.c | 15 ++++++++-------
kernel/kmod.c | 2 +-
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index 06ed6b4..2a45bf7 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -534,12 +534,6 @@ static int _request_firmware(const struct firmware
**firmware_p,
return 0;
}
- if (WARN_ON(usermodehelper_is_disabled())) {
- dev_err(device, "firmware: %s will not be loaded\n", name);
- retval = -EBUSY;
- goto out;
- }
-
if (uevent)
dev_dbg(device, "firmware: requesting %s\n", name);
@@ -555,12 +549,19 @@ static int _request_firmware(const struct firmware
**firmware_p,
round_jiffies_up(jiffies +
loading_timeout * HZ));
- kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);
+ retval = kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);
+ if (retval) {
+ dev_err(device, "firmware: %s will not be
loaded\n", name);
+ set_bit(FW_STATUS_ABORT, &fw_priv->status);
+ goto abort;
+ }
}
wait_for_completion(&fw_priv->completion);
set_bit(FW_STATUS_DONE, &fw_priv->status);
+
+abort:
del_timer_sync(&fw_priv->timeout);
mutex_lock(&fw_lock);
diff --git a/kernel/kmod.c b/kernel/kmod.c
index 47613df..e733afe3 100644
--- a/kernel/kmod.c
+++ b/kernel/kmod.c
@@ -422,7 +422,7 @@ int call_usermodehelper_exec(struct subprocess_info
*sub_info,
if (sub_info->path[0] == '\0')
goto out;
- if (!khelper_wq || usermodehelper_disabled) {
+ if (!khelper_wq || (uevent_helper[0] && usermodehelper_disabled)) {
retval = -EBUSY;
goto out;
}
--
Now, getting to the issue we are facing -- the recent checks for
usermode helper in request_firmare() is failing request_firmware() in a
kthread that also activates a wake up source (or if you are familiar
with Android terms -- grabs a wake lock). By activating a wakeup source,
the kthread is properly indicating that a suspend shouldn't happen. So,
I think it's a valid use case for request_firmware().
With the current checks, that doesn't seem to be sufficient since a
kthread can coincidentally be running in parallel to the suspend
sequence. The suspend sequence sets "usermodehelper_disabled" for the
purpose of causing request_firmware() to fail immediately when called
from the suspend ops. But that doesn't take into account that the
kthread could also be running at the same time. If this check wasn't
there, the suspend would be aborted (since the kthread has activated the
wakeup source) and the request_firmware() would have succeeded.
I think the usermodehelper check in the request_firmware() flow is
denying a wider swath of scenarios than it needs to. I think the real
check should be to only disallow request_firmware() in all of the
callbacks that are called from suspend_enter().
I was joking to my colleague (Stephen Boyd) about just walking up the
stack to see if suspend_enter() is in the stack, but he seems to have
ideas that would have a similar effect on the functionality without
being insane code. I will leave it to him to present his ideas.
But while we are trying to figure out ways to immediately error out
request_firmware() from suspend callbacks, I think we should remove the
usermodehelper check in request_firmware() since it's actually
preventing legitimate use cases.
Thanks,
Saravana
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
next prev parent reply other threads:[~2012-03-13 9:37 UTC|newest]
Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-03 20:22 [RFC] firmware loader: retry _nowait requests when userhelper is not yet available 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 [this message]
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
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=4F5F1557.8000100@codeaurora.org \
--to=skannan@codeaurora.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=chunkeey@googlemail.com \
--cc=gregkh@linuxfoundation.org \
--cc=kay.sievers@vrfy.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@sisk.pl \
--cc=sboyd@codeaurora.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;
as well as URLs for NNTP newsgroup(s).