| From d8f3d391ef39a0fd57c67ecd770d3c7ac48294a1 Mon Sep 17 00:00:00 2001 |
| From: Alan Stern <stern@rowland.harvard.edu> |
| Date: Mon, 26 Mar 2012 22:46:52 +0200 |
| Subject: PM / Runtime: don't forget to wake up waitqueue on failure |
| |
| This patch (as1535) fixes a bug in the runtime PM core. When a |
| runtime suspend attempt completes, whether successfully or not, the |
| device's power.wait_queue is supposed to be signalled. But this |
| doesn't happen in the failure pathway of rpm_suspend() when another |
| autosuspend attempt is rescheduled. As a result, a task can get stuck |
| indefinitely on the wait queue (I have seen this happen in testing). |
| |
| The patch fixes the problem by moving the wake_up_all() call up near |
| the start of the failure code. |
| |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| CC: <stable@vger.kernel.org> |
| Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> |
| (cherry picked from commit f2791d733a2f06997b573d1a3cfde21e6f529826) |
| |
| Signed-off-by: Simon Horman <horms@verge.net.au> |
| --- |
| drivers/base/power/runtime.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c |
| index 541f821..bd0f394 100644 |
| --- a/drivers/base/power/runtime.c |
| +++ b/drivers/base/power/runtime.c |
| @@ -532,6 +532,8 @@ static int rpm_suspend(struct device *dev, int rpmflags) |
| dev->power.suspend_time = ktime_set(0, 0); |
| dev->power.max_time_suspended_ns = -1; |
| dev->power.deferred_resume = false; |
| + wake_up_all(&dev->power.wait_queue); |
| + |
| if (retval == -EAGAIN || retval == -EBUSY) { |
| dev->power.runtime_error = 0; |
| |
| @@ -547,7 +549,6 @@ static int rpm_suspend(struct device *dev, int rpmflags) |
| } else { |
| pm_runtime_cancel_pending(dev); |
| } |
| - wake_up_all(&dev->power.wait_queue); |
| goto out; |
| } |
| |
| -- |
| 1.7.10.1.362.g242cab3 |
| |