From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Pavel Machek <pavel@ucw.cz>
Cc: Nigel Cunningham <nigel@nigel.suspend2.net>,
Andres Salomon <dilinger@debian.org>,
linux-pm@lists.linux-foundation.org, Chris Ball <cjb@laptop.org>,
David Woodhouse <dwmw2@infradead.org>,
Oleg Nesterov <oleg@tv-sign.ru>
Subject: [RFC][PATCH -mm 3/3] Freezer: Replace the timeout
Date: Wed, 1 Aug 2007 00:29:42 +0200 [thread overview]
Message-ID: <200708010029.43652.rjw@sisk.pl> (raw)
In-Reply-To: <200708010025.27018.rjw@sisk.pl>
From: Rafael J. Wysocki <rjw@sisk.pl>
Instead of using the global timeout, we can use a more fine grained method of
checking if the freezing of tasks should fail. Namely, we can measure the time
in which no tasks have entered the refrigerator by counting the number of calls
to wait_event_timeout() in try_to_freeze_tasks() that have returned 0 (in a
row).
After sending freeze requests to the tasks regarded as freezable
try_to_freeze_tasks() goes to sleep and waits until at least one task enters the
refrigerator. If the refrigerator is not entered by any tasks before WAIT_TIME
expires, try_to_freeze_tasks() increases the counter of expired timeouts and
sends freeze requests to the remaining tasks. If the number of expired timeouts
becomes greater than MAX_WAITS, the freezing of tasks fails (the counter of
expired timeouts is reset whenever a task enters the refrigerator).
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
kernel/power/process.c | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
Index: linux-2.6.23-rc1/kernel/power/process.c
===================================================================
--- linux-2.6.23-rc1.orig/kernel/power/process.c 2007-07-31 23:01:10.000000000 +0200
+++ linux-2.6.23-rc1/kernel/power/process.c 2007-07-31 23:12:34.000000000 +0200
@@ -14,17 +14,21 @@
#include <linux/syscalls.h>
#include <linux/freezer.h>
-/*
- * Timeout for stopping processes
- */
-#define TIMEOUT (20 * HZ)
-
/*
* Time to wait until one or more tasks enter the refrigerator after sending
* freeze requests to them.
*/
#define WAIT_TIME (HZ / 5)
+/*
+ * Each time after sending freeze requests to tasks the freezer will wait until
+ * some of them enter the refrigerater, but no longer than TIMEOUT. If TIMEOUT
+ * has been exceeded, the freezer increases the number of waits by one and
+ * repeats. If the number of waits becomes greater than MAX_WAITS, the
+ * freezing fails.
+ */
+#define MAX_WAITS 5
+
#define FREEZER_KERNEL_THREADS 0
#define FREEZER_USER_SPACE 1
@@ -188,16 +192,15 @@ static void cancel_freezing(struct task_
static int try_to_freeze_tasks(int freeze_user_space)
{
struct task_struct *g, *p;
- unsigned long end_time;
- unsigned int todo;
+ unsigned int todo, waits;
struct timeval start, end;
s64 elapsed_csecs64;
unsigned int elapsed_csecs;
do_gettimeofday(&start);
- end_time = jiffies + TIMEOUT;
refrigerator_called = 0;
+ waits = 0;
do {
todo = 0;
read_lock(&tasklist_lock);
@@ -223,12 +226,14 @@ static int try_to_freeze_tasks(int freez
ret = wait_event_timeout(refrigerator_waitq,
refrigerator_called, WAIT_TIME);
- if (ret)
+ if (ret) {
refrigerator_called = 0;
+ waits = 0;
+ } else {
+ if (++waits > MAX_WAITS)
+ break;
+ }
}
-
- if (time_after(jiffies, end_time))
- break;
} while (todo);
do_gettimeofday(&end);
next prev parent reply other threads:[~2007-07-31 22:29 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-25 12:01 [RFC][PATCH -mm 0/2] Freezer: Use wait queue instead of busy looping Rafael J. Wysocki
2007-07-25 12:03 ` [RFC][PATCH -mm 1/2] Freezer: Be more verbose Rafael J. Wysocki
2007-07-25 12:27 ` Pavel Machek
2007-07-25 12:09 ` [RFC][PATCH -mm 2/2] Freezer: Use wait queue instead of busy looping Rafael J. Wysocki
2007-07-25 12:28 ` Pavel Machek
2007-07-25 12:55 ` Rafael J. Wysocki
2007-07-25 13:29 ` Oleg Nesterov
2007-07-25 14:03 ` Rafael J. Wysocki
2007-07-25 14:24 ` Oleg Nesterov
2007-07-26 12:24 ` Rafael J. Wysocki
2007-07-26 12:43 ` Rafael J. Wysocki
2007-07-31 8:01 ` Pavel Machek
2007-07-31 9:39 ` Rafael J. Wysocki
2007-07-31 10:00 ` Pavel Machek
2007-07-31 10:17 ` Rafael J. Wysocki
2007-07-31 10:08 ` Rafael J. Wysocki
2007-07-31 10:02 ` Pavel Machek
2007-07-31 22:25 ` [RFC][PATCH -mm 0/3] Freezer: Use wait queue instead of busy looping (updated) Rafael J. Wysocki
2007-07-31 22:26 ` [RFC][PATCH -mm 1/3] Freezer: Use wait queue instead of busy looping Rafael J. Wysocki
2007-08-01 7:59 ` Pavel Machek
2007-07-31 22:28 ` [RFC][PATCH -mm 2/3] Freezer: Measure the time of freezing tasks Rafael J. Wysocki
2007-08-01 8:28 ` Pavel Machek
2007-07-31 22:29 ` Rafael J. Wysocki [this message]
2007-08-01 8:31 ` [RFC][PATCH -mm 3/3] Freezer: Replace the timeout Pavel Machek
2007-08-01 10:43 ` Rafael J. Wysocki
2007-08-05 21:37 ` Pavel Machek
2007-08-05 22:38 ` Rafael J. Wysocki
2007-08-05 22:53 ` Pavel Machek
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=200708010029.43652.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=cjb@laptop.org \
--cc=dilinger@debian.org \
--cc=dwmw2@infradead.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=nigel@nigel.suspend2.net \
--cc=oleg@tv-sign.ru \
--cc=pavel@ucw.cz \
/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