| From f8d5b9e9e5372f0deb7bc1ab1088a9b60b0a793d Mon Sep 17 00:00:00 2001 |
| From: Sebastian Capella <sebastian.capella@linaro.org> |
| Date: Tue, 18 Feb 2014 17:52:08 -0800 |
| Subject: PM / hibernate: Fix restore hang in freeze_processes() |
| |
| From: Sebastian Capella <sebastian.capella@linaro.org> |
| |
| commit f8d5b9e9e5372f0deb7bc1ab1088a9b60b0a793d upstream. |
| |
| During restore, pm_notifier chain are called with |
| PM_RESTORE_PREPARE. The firmware_class driver handler |
| fw_pm_notify does not have a handler for this. As a result, |
| it keeps a reader on the kmod.c umhelper_sem. During |
| freeze_processes, the call to __usermodehelper_disable tries to |
| take a write lock on this semaphore and hangs waiting. |
| |
| Signed-off-by: Sebastian Capella <sebastian.capella@linaro.org> |
| Acked-by: Ming Lei <ming.lei@canonical.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/base/firmware_class.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/drivers/base/firmware_class.c |
| +++ b/drivers/base/firmware_class.c |
| @@ -1541,6 +1541,7 @@ static int fw_pm_notify(struct notifier_ |
| switch (mode) { |
| case PM_HIBERNATION_PREPARE: |
| case PM_SUSPEND_PREPARE: |
| + case PM_RESTORE_PREPARE: |
| kill_requests_without_uevent(); |
| device_cache_fw_images(); |
| break; |