[PATCH 3/8] PM: suspend_block: Abort task freezing if a suspend_blocker is active.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?=
Date: Tuesday, April 27, 2010 - 9:31 pm

If a suspend_blocker is active, suspend will fail anyway. Since
try_to_freeze_tasks can take up to 20 seconds to complete or fail, aborting
as soon as someone blocks suspend (e.g. from an interrupt handler) improves
the worst case wakeup latency.

On an older kernel where task freezing could fail for processes attached
to a debugger, this fixed a problem where the device sometimes hung for
20 seconds before the screen turned on.

Signed-off-by: Arve Hjønnevåg <arve@android.com>
---
 kernel/power/process.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/kernel/power/process.c b/kernel/power/process.c
index 71ae290..d8ebd50 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -15,6 +15,7 @@
 #include <linux/syscalls.h>
 #include <linux/freezer.h>
 #include <linux/delay.h>
+#include <linux/suspend_blocker.h>
 
 /* 
  * Timeout for stopping processes
@@ -38,6 +39,7 @@ static int try_to_freeze_tasks(bool sig_only)
 	struct timeval start, end;
 	u64 elapsed_csecs64;
 	unsigned int elapsed_csecs;
+	bool wakeup = false;
 
 	do_gettimeofday(&start);
 
@@ -63,6 +65,10 @@ static int try_to_freeze_tasks(bool sig_only)
 				todo++;
 		} while_each_thread(g, p);
 		read_unlock(&tasklist_lock);
+		if (todo && suspend_is_blocked()) {
+			wakeup = true;
+			break;
+		}
 		if (!todo || time_after(jiffies, end_time))
 			break;
 
@@ -85,13 +91,15 @@ static int try_to_freeze_tasks(bool sig_only)
 		 * but it cleans up leftover PF_FREEZE requests.
 		 */
 		printk("\n");
-		printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
+		printk(KERN_ERR "Freezing of tasks %s after %d.%02d seconds "
 				"(%d tasks refusing to freeze):\n",
+				wakeup ? "aborted" : "failed",
 				elapsed_csecs / 100, elapsed_csecs % 100, todo);
 		read_lock(&tasklist_lock);
 		do_each_thread(g, p) {
 			task_lock(p);
-			if (freezing(p) && !freezer_should_skip(p))
+			if (freezing(p) && !freezer_should_skip(p)
+					&& elapsed_csecs > 100)
 				sched_show_task(p);
 			cancel_freezing(p);
 			task_unlock(p);
-- 
1.6.5.1

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/9] Suspend block api (version 5), =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 1/8] PM: Add suspend block api., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 2/8] PM: suspend_block: Add driver to access suspen ..., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 3/8] PM: suspend_block: Abort task freezing if a su ..., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 4/8] PM: suspend_block: Add debugfs file, =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 5/8] PM: suspend_block: Add suspend_blocker stats, =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 6/8] PM: Add suspend blocking work., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 7/8] Input: Block suspend while event queue is not ..., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 8/8] power_supply: Block suspend while power supply ..., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Pavel Machek, (Tue Apr 27, 11:06 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Pavel Machek, (Tue Apr 27, 11:07 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Tejun Heo, (Tue Apr 27, 11:44 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Arve Hjønnevåg, (Wed Apr 28, 12:02 am)
Re: [PATCH 6/8] PM: Add suspend blocking work., Tejun Heo, (Wed Apr 28, 12:18 am)
Re: [PATCH 6/8] PM: Add suspend blocking work., Oleg Nesterov, (Wed Apr 28, 12:40 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Tejun Heo, (Wed Apr 28, 1:22 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Rafael J. Wysocki, (Wed Apr 28, 1:50 pm)
Re: [PATCH 2/8] PM: suspend_block: Add driver to access su ..., Rafael J. Wysocki, (Wed Apr 28, 1:58 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Wed Apr 28, 2:08 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Wed Apr 28, 2:09 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Arve Hjønnevåg, (Wed Apr 28, 3:09 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Wed Apr 28, 3:19 pm)
Re: [PATCH 2/8] PM: suspend_block: Add driver to access su ..., Rafael J. Wysocki, (Wed Apr 28, 4:05 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Arve Hjønnevåg, (Wed Apr 28, 8:37 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Arve Hjønnevåg, (Wed Apr 28, 8:47 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Oleg Nesterov, (Thu Apr 29, 11:58 am)
[PATCH 2/2] workqueues: export keventd_wq, Oleg Nesterov, (Thu Apr 29, 12:45 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Thu Apr 29, 2:08 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Thu Apr 29, 2:09 pm)
Re: [PATCH 2/8] PM: suspend_block: Add driver to access su ..., Rafael J. Wysocki, (Thu Apr 29, 2:11 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Rafael J. Wysocki, (Thu Apr 29, 2:16 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Tejun Heo, (Thu Apr 29, 9:24 pm)
Re: [PATCH 2/2] workqueues: export keventd_wq, Tejun Heo, (Thu Apr 29, 10:16 pm)
Re: [PATCH 2/2] workqueues: export keventd_wq, Arve Hjønnevåg, (Thu Apr 29, 10:39 pm)
Re: [PATCH 2/2] workqueues: export keventd_wq, Tejun Heo, (Thu Apr 29, 10:52 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Oleg Nesterov, (Fri Apr 30, 10:26 am)
Re: [PATCH 2/2] workqueues: export keventd_wq, Oleg Nesterov, (Fri Apr 30, 11:05 am)
Re: [PATCH 2/2] workqueues: export keventd_wq, Tejun Heo, (Fri Apr 30, 11:11 am)
Re: [PATCH 1/8] PM: Add suspend block api., Tejun Heo, (Thu May 20, 1:30 am)
Re: [PATCH 1/8] PM: Add suspend block api., Rafael J. Wysocki, (Thu May 20, 3:27 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Tejun Heo, (Thu May 20, 11:35 pm)