Merge tag 'sound-fix-3.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[deliverable/linux.git] / kernel / power / process.c
CommitLineData
1da177e4
LT
1/*
2 * drivers/power/process.c - Functions for starting/stopping processes on
3 * suspend transitions.
4 *
5 * Originally from swsusp.
6 */
7
8
9#undef DEBUG
10
1da177e4 11#include <linux/interrupt.h>
1a8670a2 12#include <linux/oom.h>
1da177e4
LT
13#include <linux/suspend.h>
14#include <linux/module.h>
02aaeb9b 15#include <linux/syscalls.h>
7dfb7103 16#include <linux/freezer.h>
be404f02 17#include <linux/delay.h>
a0a1a5fd 18#include <linux/workqueue.h>
1e73203c 19#include <linux/kmod.h>
bb3632c6 20#include <trace/events/power.h>
1da177e4
LT
21
22/*
23 * Timeout for stopping processes
24 */
957d1282 25unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;
1da177e4 26
839e3407 27static int try_to_freeze_tasks(bool user_only)
1da177e4 28{
1da177e4 29 struct task_struct *g, *p;
11b2ce2b
RW
30 unsigned long end_time;
31 unsigned int todo;
a0a1a5fd 32 bool wq_busy = false;
438e2ce6 33 struct timeval start, end;
18ad0c62
CC
34 u64 elapsed_msecs64;
35 unsigned int elapsed_msecs;
dbeeec5f 36 bool wakeup = false;
18ad0c62 37 int sleep_usecs = USEC_PER_MSEC;
438e2ce6
RW
38
39 do_gettimeofday(&start);
3e1d1d28 40
957d1282 41 end_time = jiffies + msecs_to_jiffies(freeze_timeout_msecs);
a0a1a5fd 42
839e3407 43 if (!user_only)
a0a1a5fd
TH
44 freeze_workqueues_begin();
45
be404f02 46 while (true) {
11b2ce2b 47 todo = 0;
1da177e4
LT
48 read_lock(&tasklist_lock);
49 do_each_thread(g, p) {
839e3407 50 if (p == current || !freeze_task(p))
d5d8c597
RW
51 continue;
52
5d8f72b5 53 if (!freezer_should_skip(p))
ba96a0c8 54 todo++;
1da177e4
LT
55 } while_each_thread(g, p);
56 read_unlock(&tasklist_lock);
a0a1a5fd 57
839e3407 58 if (!user_only) {
a0a1a5fd
TH
59 wq_busy = freeze_workqueues_busy();
60 todo += wq_busy;
61 }
62
be404f02 63 if (!todo || time_after(jiffies, end_time))
6161b2ce 64 break;
be404f02 65
a2867e08 66 if (pm_wakeup_pending()) {
dbeeec5f
RW
67 wakeup = true;
68 break;
69 }
70
be404f02
TH
71 /*
72 * We need to retry, but first give the freezing tasks some
18ad0c62
CC
73 * time to enter the refrigerator. Start with an initial
74 * 1 ms sleep followed by exponential backoff until 8 ms.
be404f02 75 */
18ad0c62
CC
76 usleep_range(sleep_usecs / 2, sleep_usecs);
77 if (sleep_usecs < 8 * USEC_PER_MSEC)
78 sleep_usecs *= 2;
be404f02 79 }
3e1d1d28 80
438e2ce6 81 do_gettimeofday(&end);
18ad0c62
CC
82 elapsed_msecs64 = timeval_to_ns(&end) - timeval_to_ns(&start);
83 do_div(elapsed_msecs64, NSEC_PER_MSEC);
84 elapsed_msecs = elapsed_msecs64;
438e2ce6 85
6161b2ce 86 if (todo) {
14b5b7cf 87 printk("\n");
18ad0c62 88 printk(KERN_ERR "Freezing of tasks %s after %d.%03d seconds "
a0a1a5fd 89 "(%d tasks refusing to freeze, wq_busy=%d):\n",
dbeeec5f 90 wakeup ? "aborted" : "failed",
18ad0c62 91 elapsed_msecs / 1000, elapsed_msecs % 1000,
a0a1a5fd
TH
92 todo - wq_busy, wq_busy);
93
6c83b481
RW
94 if (!wakeup) {
95 read_lock(&tasklist_lock);
96 do_each_thread(g, p) {
97 if (p != current && !freezer_should_skip(p)
98 && freezing(p) && !frozen(p))
99 sched_show_task(p);
100 } while_each_thread(g, p);
101 read_unlock(&tasklist_lock);
102 }
438e2ce6 103 } else {
18ad0c62
CC
104 printk("(elapsed %d.%03d seconds) ", elapsed_msecs / 1000,
105 elapsed_msecs % 1000);
6161b2ce
PM
106 }
107
e7cd8a72 108 return todo ? -EBUSY : 0;
11b2ce2b
RW
109}
110
111/**
2aede851 112 * freeze_processes - Signal user space processes to enter the refrigerator.
2b44c4db
CC
113 * The current thread will not be frozen. The same process that calls
114 * freeze_processes must later call thaw_processes.
03afed8b
TH
115 *
116 * On success, returns 0. On failure, -errno and system is fully thawed.
11b2ce2b
RW
117 */
118int freeze_processes(void)
119{
e7cd8a72 120 int error;
11b2ce2b 121
247bc037 122 error = __usermodehelper_disable(UMH_FREEZING);
1e73203c
RW
123 if (error)
124 return error;
125
2b44c4db
CC
126 /* Make sure this task doesn't get frozen */
127 current->flags |= PF_SUSPEND_TASK;
128
a3201227
TH
129 if (!pm_freezing)
130 atomic_inc(&system_freezing_cnt);
131
068765ba 132 pm_wakeup_clear();
b842ee57 133 printk("Freezing user space processes ... ");
a3201227 134 pm_freezing = true;
ebb12db5 135 error = try_to_freeze_tasks(true);
2aede851
RW
136 if (!error) {
137 printk("done.");
247bc037 138 __usermodehelper_set_disable_depth(UMH_DISABLED);
2aede851
RW
139 oom_killer_disable();
140 }
141 printk("\n");
142 BUG_ON(in_atomic());
143
03afed8b
TH
144 if (error)
145 thaw_processes();
2aede851
RW
146 return error;
147}
148
149/**
150 * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator.
03afed8b 151 *
379e0be8
SB
152 * On success, returns 0. On failure, -errno and only the kernel threads are
153 * thawed, so as to give a chance to the caller to do additional cleanups
154 * (if any) before thawing the userspace tasks. So, it is the responsibility
155 * of the caller to thaw the userspace tasks, when the time is right.
2aede851
RW
156 */
157int freeze_kernel_threads(void)
158{
159 int error;
11b2ce2b 160
b842ee57 161 printk("Freezing remaining freezable tasks ... ");
a3201227 162 pm_nosig_freezing = true;
ebb12db5 163 error = try_to_freeze_tasks(false);
2aede851
RW
164 if (!error)
165 printk("done.");
7f33d49a 166
b842ee57 167 printk("\n");
2aede851 168 BUG_ON(in_atomic());
7f33d49a 169
03afed8b 170 if (error)
379e0be8 171 thaw_kernel_threads();
b842ee57 172 return error;
1da177e4
LT
173}
174
6cd8dedc 175void thaw_processes(void)
1da177e4
LT
176{
177 struct task_struct *g, *p;
2b44c4db 178 struct task_struct *curr = current;
1da177e4 179
bb3632c6 180 trace_suspend_resume(TPS("thaw_processes"), 0, true);
a3201227
TH
181 if (pm_freezing)
182 atomic_dec(&system_freezing_cnt);
183 pm_freezing = false;
184 pm_nosig_freezing = false;
185
6cd8dedc
TH
186 oom_killer_enable();
187
188 printk("Restarting tasks ... ");
189
4320f6b1 190 __usermodehelper_set_disable_depth(UMH_FREEZING);
6cd8dedc
TH
191 thaw_workqueues();
192
1da177e4 193 read_lock(&tasklist_lock);
a9b6f562 194 do_each_thread(g, p) {
2b44c4db
CC
195 /* No other threads should have PF_SUSPEND_TASK set */
196 WARN_ON((p != curr) && (p->flags & PF_SUSPEND_TASK));
a5be2d0d 197 __thaw_task(p);
a9b6f562 198 } while_each_thread(g, p);
1da177e4 199 read_unlock(&tasklist_lock);
7f33d49a 200
2b44c4db
CC
201 WARN_ON(!(curr->flags & PF_SUSPEND_TASK));
202 curr->flags &= ~PF_SUSPEND_TASK;
203
1e73203c
RW
204 usermodehelper_enable();
205
1da177e4 206 schedule();
14b5b7cf 207 printk("done.\n");
bb3632c6 208 trace_suspend_resume(TPS("thaw_processes"), 0, false);
1da177e4
LT
209}
210
181e9bde
RW
211void thaw_kernel_threads(void)
212{
213 struct task_struct *g, *p;
214
215 pm_nosig_freezing = false;
216 printk("Restarting kernel threads ... ");
217
218 thaw_workqueues();
219
220 read_lock(&tasklist_lock);
221 do_each_thread(g, p) {
222 if (p->flags & (PF_KTHREAD | PF_WQ_WORKER))
223 __thaw_task(p);
224 } while_each_thread(g, p);
225 read_unlock(&tasklist_lock);
226
227 schedule();
228 printk("done.\n");
229}
This page took 0.818651 seconds and 5 git commands to generate.