diff options
author | Colin Cross <ccross@android.com> | 2013-05-06 19:50:10 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-05-12 08:16:22 -0400 |
commit | 18ad0c6297df1d671ecea83b608cd9e432642a05 (patch) | |
tree | 58970dae7d585d0a6ba9d0a596fa757affea0567 | |
parent | 0f9548ca10916dec166eaf74c816bded7d8e611d (diff) |
freezer: shorten freezer sleep time using exponential backoff
All tasks can easily be frozen in under 10 ms, switch to using
an initial 1 ms sleep followed by exponential backoff until
8 ms. Also convert the printed time to ms instead of centiseconds.
Acked-by: Pavel Machek <pavel@ucw.cz>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Colin Cross <ccross@android.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | kernel/power/process.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/kernel/power/process.c b/kernel/power/process.c index 98088e0e71e8..fc0df8486449 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -30,9 +30,10 @@ static int try_to_freeze_tasks(bool user_only) | |||
30 | unsigned int todo; | 30 | unsigned int todo; |
31 | bool wq_busy = false; | 31 | bool wq_busy = false; |
32 | struct timeval start, end; | 32 | struct timeval start, end; |
33 | u64 elapsed_csecs64; | 33 | u64 elapsed_msecs64; |
34 | unsigned int elapsed_csecs; | 34 | unsigned int elapsed_msecs; |
35 | bool wakeup = false; | 35 | bool wakeup = false; |
36 | int sleep_usecs = USEC_PER_MSEC; | ||
36 | 37 | ||
37 | do_gettimeofday(&start); | 38 | do_gettimeofday(&start); |
38 | 39 | ||
@@ -68,22 +69,25 @@ static int try_to_freeze_tasks(bool user_only) | |||
68 | 69 | ||
69 | /* | 70 | /* |
70 | * We need to retry, but first give the freezing tasks some | 71 | * We need to retry, but first give the freezing tasks some |
71 | * time to enter the refrigerator. | 72 | * time to enter the refrigerator. Start with an initial |
73 | * 1 ms sleep followed by exponential backoff until 8 ms. | ||
72 | */ | 74 | */ |
73 | msleep(10); | 75 | usleep_range(sleep_usecs / 2, sleep_usecs); |
76 | if (sleep_usecs < 8 * USEC_PER_MSEC) | ||
77 | sleep_usecs *= 2; | ||
74 | } | 78 | } |
75 | 79 | ||
76 | do_gettimeofday(&end); | 80 | do_gettimeofday(&end); |
77 | elapsed_csecs64 = timeval_to_ns(&end) - timeval_to_ns(&start); | 81 | elapsed_msecs64 = timeval_to_ns(&end) - timeval_to_ns(&start); |
78 | do_div(elapsed_csecs64, NSEC_PER_SEC / 100); | 82 | do_div(elapsed_msecs64, NSEC_PER_MSEC); |
79 | elapsed_csecs = elapsed_csecs64; | 83 | elapsed_msecs = elapsed_msecs64; |
80 | 84 | ||
81 | if (todo) { | 85 | if (todo) { |
82 | printk("\n"); | 86 | printk("\n"); |
83 | printk(KERN_ERR "Freezing of tasks %s after %d.%02d seconds " | 87 | printk(KERN_ERR "Freezing of tasks %s after %d.%03d seconds " |
84 | "(%d tasks refusing to freeze, wq_busy=%d):\n", | 88 | "(%d tasks refusing to freeze, wq_busy=%d):\n", |
85 | wakeup ? "aborted" : "failed", | 89 | wakeup ? "aborted" : "failed", |
86 | elapsed_csecs / 100, elapsed_csecs % 100, | 90 | elapsed_msecs / 1000, elapsed_msecs % 1000, |
87 | todo - wq_busy, wq_busy); | 91 | todo - wq_busy, wq_busy); |
88 | 92 | ||
89 | if (!wakeup) { | 93 | if (!wakeup) { |
@@ -96,8 +100,8 @@ static int try_to_freeze_tasks(bool user_only) | |||
96 | read_unlock(&tasklist_lock); | 100 | read_unlock(&tasklist_lock); |
97 | } | 101 | } |
98 | } else { | 102 | } else { |
99 | printk("(elapsed %d.%02d seconds) ", elapsed_csecs / 100, | 103 | printk("(elapsed %d.%03d seconds) ", elapsed_msecs / 1000, |
100 | elapsed_csecs % 100); | 104 | elapsed_msecs % 1000); |
101 | } | 105 | } |
102 | 106 | ||
103 | return todo ? -EBUSY : 0; | 107 | return todo ? -EBUSY : 0; |