diff options
Diffstat (limited to 'releases/2.6.32.58/pm-print-a-warning-if-firmware-is-requested-when-tasks.patch')
-rw-r--r-- | releases/2.6.32.58/pm-print-a-warning-if-firmware-is-requested-when-tasks.patch | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/releases/2.6.32.58/pm-print-a-warning-if-firmware-is-requested-when-tasks.patch b/releases/2.6.32.58/pm-print-a-warning-if-firmware-is-requested-when-tasks.patch new file mode 100644 index 0000000..d72e292 --- /dev/null +++ b/releases/2.6.32.58/pm-print-a-warning-if-firmware-is-requested-when-tasks.patch @@ -0,0 +1,82 @@ +From srivatsa.bhat@linux.vnet.ibm.com Thu Mar 1 13:30:46 2012 +From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com> +Date: Wed, 29 Feb 2012 12:22:41 +0530 +Subject: PM: Print a warning if firmware is requested when tasks are frozen +To: gregkh@linuxfoundation.org +Cc: stable@vger.kernel.org, rjw@sisk.pl, valdis.kletnieks@vt.edu, cloos@hjcloos.com, riesebie@lxtec.de, torvalds@linux-foundation.org, penguin-kernel@i-love.sakura.ne.jp, srivatsa.bhat@linux.vnet.ibm.com +Message-ID: <20120229065115.4761.59767.stgit@srivatsabhat.in.ibm.com> + + +From: Rafael J. Wysocki <rjw@sisk.pl> + +[ Upstream commit a144c6a6c924aa1da04dd77fb84b89927354fdff ] + +Some drivers erroneously use request_firmware() from their ->resume() +(or ->thaw(), or ->restore()) callbacks, which is not going to work +unless the firmware has been built in. This causes system resume to +stall until the firmware-loading timeout expires, which makes users +think that the resume has failed and reboot their machines +unnecessarily. For this reason, make _request_firmware() print a +warning and return immediately with error code if it has been called +when tasks are frozen and it's impossible to start any new usermode +helpers. + +Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> +Acked-by: Greg Kroah-Hartman <gregkh@suse.de> +Reviewed-by: Valdis Kletnieks <valdis.kletnieks@vt.edu> +Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + + drivers/base/firmware_class.c | 5 +++++ + include/linux/kmod.h | 5 +++++ + kernel/kmod.c | 9 +++++++++ + 3 files changed, 19 insertions(+) + +--- a/drivers/base/firmware_class.c ++++ b/drivers/base/firmware_class.c +@@ -489,6 +489,11 @@ _request_firmware(const struct firmware + if (!firmware_p) + return -EINVAL; + ++ if (WARN_ON(usermodehelper_is_disabled())) { ++ dev_err(device, "firmware: %s will not be loaded\n", name); ++ return -EBUSY; ++ } ++ + *firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL); + if (!firmware) { + dev_err(device, "%s: kmalloc(struct firmware) failed\n", +--- a/include/linux/kmod.h ++++ b/include/linux/kmod.h +@@ -104,7 +104,12 @@ struct file; + extern int call_usermodehelper_pipe(char *path, char *argv[], char *envp[], + struct file **filp); + ++#ifdef CONFIG_PM_SLEEP + extern int usermodehelper_disable(void); + extern void usermodehelper_enable(void); ++extern bool usermodehelper_is_disabled(void); ++#else ++static inline bool usermodehelper_is_disabled(void) { return false; } ++#endif + + #endif /* __LINUX_KMOD_H__ */ +--- a/kernel/kmod.c ++++ b/kernel/kmod.c +@@ -337,6 +337,15 @@ void usermodehelper_enable(void) + usermodehelper_disabled = 0; + } + ++/** ++ * usermodehelper_is_disabled - check if new helpers are allowed to be started ++ */ ++bool usermodehelper_is_disabled(void) ++{ ++ return usermodehelper_disabled; ++} ++EXPORT_SYMBOL_GPL(usermodehelper_is_disabled); ++ + static void helper_lock(void) + { + atomic_inc(&running_helpers); |