Blame view
include/linux/freezer.h
5.69 KB
7dfb71030 [PATCH] Add inclu... |
1 |
/* Freezer declarations */ |
831441862 Freezer: make ker... |
2 3 |
#ifndef FREEZER_H_INCLUDED #define FREEZER_H_INCLUDED |
5c543eff6 [PATCH] freezer.h... |
4 |
#include <linux/sched.h> |
e42837bcd freezer: introduc... |
5 |
#include <linux/wait.h> |
a3201227f freezer: make fre... |
6 |
#include <linux/atomic.h> |
5c543eff6 [PATCH] freezer.h... |
7 |
|
8174f1503 container freezer... |
8 |
#ifdef CONFIG_FREEZER |
a3201227f freezer: make fre... |
9 10 11 |
extern atomic_t system_freezing_cnt; /* nr of freezing conds in effect */ extern bool pm_freezing; /* PM freezing in effect */ extern bool pm_nosig_freezing; /* PM nosig freezing in effect */ |
7dfb71030 [PATCH] Add inclu... |
12 13 14 |
/* * Check if a process has been frozen */ |
948246f70 freezer: remove s... |
15 |
static inline bool frozen(struct task_struct *p) |
7dfb71030 [PATCH] Add inclu... |
16 17 18 |
{ return p->flags & PF_FROZEN; } |
a3201227f freezer: make fre... |
19 |
extern bool freezing_slow_path(struct task_struct *p); |
7dfb71030 [PATCH] Add inclu... |
20 21 |
/* |
a3201227f freezer: make fre... |
22 |
* Check if there is a request to freeze a process |
7dfb71030 [PATCH] Add inclu... |
23 |
*/ |
a3201227f freezer: make fre... |
24 |
static inline bool freezing(struct task_struct *p) |
7dfb71030 [PATCH] Add inclu... |
25 |
{ |
a3201227f freezer: make fre... |
26 27 28 |
if (likely(!atomic_read(&system_freezing_cnt))) return false; return freezing_slow_path(p); |
7dfb71030 [PATCH] Add inclu... |
29 |
} |
dc52ddc0e container freezer... |
30 |
/* Takes and releases task alloc lock using task_lock() */ |
a5be2d0d1 freezer: rename t... |
31 |
extern void __thaw_task(struct task_struct *t); |
7dfb71030 [PATCH] Add inclu... |
32 |
|
8a32c441c freezer: implemen... |
33 |
extern bool __refrigerator(bool check_kthr_stop); |
7dfb71030 [PATCH] Add inclu... |
34 |
extern int freeze_processes(void); |
2aede851d PM / Hibernate: F... |
35 |
extern int freeze_kernel_threads(void); |
a9b6f562f [PATCH] swsusp: U... |
36 |
extern void thaw_processes(void); |
7dfb71030 [PATCH] Add inclu... |
37 |
|
a0acae0e8 freezer: unexport... |
38 |
static inline bool try_to_freeze(void) |
7dfb71030 [PATCH] Add inclu... |
39 |
{ |
a0acae0e8 freezer: unexport... |
40 41 42 |
might_sleep(); if (likely(!freezing(current))) return false; |
8a32c441c freezer: implemen... |
43 |
return __refrigerator(false); |
7dfb71030 [PATCH] Add inclu... |
44 |
} |
ff39593ad [PATCH] swsusp: t... |
45 |
|
839e3407d freezer: remove u... |
46 |
extern bool freeze_task(struct task_struct *p); |
34b087e48 freezer: kill unu... |
47 |
extern bool set_freezable(void); |
8174f1503 container freezer... |
48 |
|
dc52ddc0e container freezer... |
49 |
#ifdef CONFIG_CGROUP_FREEZER |
22b4e111f cgroup_freezer: p... |
50 |
extern bool cgroup_freezing(struct task_struct *task); |
dc52ddc0e container freezer... |
51 |
#else /* !CONFIG_CGROUP_FREEZER */ |
22b4e111f cgroup_freezer: p... |
52 |
static inline bool cgroup_freezing(struct task_struct *task) |
5a7aadfe2 Freezer: Fix bugg... |
53 |
{ |
22b4e111f cgroup_freezer: p... |
54 |
return false; |
5a7aadfe2 Freezer: Fix bugg... |
55 |
} |
dc52ddc0e container freezer... |
56 |
#endif /* !CONFIG_CGROUP_FREEZER */ |
ba96a0c88 freezer: fix vfor... |
57 58 59 60 61 62 63 |
/* * The PF_FREEZER_SKIP flag should be set by a vfork parent right before it * calls wait_for_completion(&vfork) and reset right after it returns from this * function. Next, the parent should call try_to_freeze() to freeze itself * appropriately in case the child has exited before the freezing of tasks is * complete. However, we don't want kernel threads to be frozen in unexpected * places, so we allow them to block freeze_processes() instead or to set |
467de1fc6 PM / Freezer: Rem... |
64 65 66 67 |
* PF_NOFREEZE if needed. Fortunately, in the ____call_usermodehelper() case the * parent won't really block freeze_processes(), since ____call_usermodehelper() * (the child) does a little before exec/exit and it can't be frozen before * waking up the parent. |
ba96a0c88 freezer: fix vfor... |
68 |
*/ |
467de1fc6 PM / Freezer: Rem... |
69 70 |
/* Tell the freezer not to count the current task as freezable. */ |
ba96a0c88 freezer: fix vfor... |
71 72 |
static inline void freezer_do_not_count(void) { |
467de1fc6 PM / Freezer: Rem... |
73 |
current->flags |= PF_FREEZER_SKIP; |
ba96a0c88 freezer: fix vfor... |
74 75 76 |
} /* |
467de1fc6 PM / Freezer: Rem... |
77 78 |
* Tell the freezer to count the current task as freezable again and try to * freeze it. |
ba96a0c88 freezer: fix vfor... |
79 80 81 |
*/ static inline void freezer_count(void) { |
467de1fc6 PM / Freezer: Rem... |
82 83 |
current->flags &= ~PF_FREEZER_SKIP; try_to_freeze(); |
ba96a0c88 freezer: fix vfor... |
84 85 86 |
} /* |
58a69cb47 workqueue, freeze... |
87 |
* Check if the task should be counted as freezable by the freezer |
ba96a0c88 freezer: fix vfor... |
88 89 90 91 92 |
*/ static inline int freezer_should_skip(struct task_struct *p) { return !!(p->flags & PF_FREEZER_SKIP); } |
ff39593ad [PATCH] swsusp: t... |
93 |
|
831441862 Freezer: make ker... |
94 |
/* |
d310310cb Freezer / sunrpc ... |
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
* These macros are intended to be used whenever you want allow a task that's * sleeping in TASK_UNINTERRUPTIBLE or TASK_KILLABLE state to be frozen. Note * that neither return any clear indication of whether a freeze event happened * while in this function. */ /* Like schedule(), but should not block the freezer. */ #define freezable_schedule() \ ({ \ freezer_do_not_count(); \ schedule(); \ freezer_count(); \ }) /* Like schedule_timeout_killable(), but should not block the freezer. */ #define freezable_schedule_timeout_killable(timeout) \ ({ \ |
b3b73ec0d PM / Freezer: fix... |
112 |
long __retval; \ |
d310310cb Freezer / sunrpc ... |
113 |
freezer_do_not_count(); \ |
b3b73ec0d PM / Freezer: fix... |
114 |
__retval = schedule_timeout_killable(timeout); \ |
d310310cb Freezer / sunrpc ... |
115 |
freezer_count(); \ |
b3b73ec0d PM / Freezer: fix... |
116 |
__retval; \ |
d310310cb Freezer / sunrpc ... |
117 118 119 |
}) /* |
f06ac72e9 cifs, freezer: ad... |
120 121 122 |
* Freezer-friendly wrappers around wait_event_interruptible(), * wait_event_killable() and wait_event_interruptible_timeout(), originally * defined in <linux/wait.h> |
e42837bcd freezer: introduc... |
123 |
*/ |
f06ac72e9 cifs, freezer: ad... |
124 125 126 |
#define wait_event_freezekillable(wq, condition) \ ({ \ int __retval; \ |
6f35c4abd PM / Freezer: Rei... |
127 128 129 |
freezer_do_not_count(); \ __retval = wait_event_killable(wq, (condition)); \ freezer_count(); \ |
f06ac72e9 cifs, freezer: ad... |
130 131 |
__retval; \ }) |
e42837bcd freezer: introduc... |
132 133 134 |
#define wait_event_freezable(wq, condition) \ ({ \ int __retval; \ |
24b7ead3f freezer: fix wait... |
135 |
for (;;) { \ |
e42837bcd freezer: introduc... |
136 137 |
__retval = wait_event_interruptible(wq, \ (condition) || freezing(current)); \ |
24b7ead3f freezer: fix wait... |
138 |
if (__retval || (condition)) \ |
e42837bcd freezer: introduc... |
139 |
break; \ |
24b7ead3f freezer: fix wait... |
140 141 |
try_to_freeze(); \ } \ |
e42837bcd freezer: introduc... |
142 143 |
__retval; \ }) |
e42837bcd freezer: introduc... |
144 145 146 |
#define wait_event_freezable_timeout(wq, condition, timeout) \ ({ \ long __retval = timeout; \ |
24b7ead3f freezer: fix wait... |
147 |
for (;;) { \ |
e42837bcd freezer: introduc... |
148 149 150 |
__retval = wait_event_interruptible_timeout(wq, \ (condition) || freezing(current), \ __retval); \ |
24b7ead3f freezer: fix wait... |
151 152 153 154 |
if (__retval <= 0 || (condition)) \ break; \ try_to_freeze(); \ } \ |
e42837bcd freezer: introduc... |
155 156 |
__retval; \ }) |
24b7ead3f freezer: fix wait... |
157 |
|
8174f1503 container freezer... |
158 |
#else /* !CONFIG_FREEZER */ |
948246f70 freezer: remove s... |
159 |
static inline bool frozen(struct task_struct *p) { return false; } |
a3201227f freezer: make fre... |
160 |
static inline bool freezing(struct task_struct *p) { return false; } |
62c9ea6b1 Freezer: fix more... |
161 |
static inline void __thaw_task(struct task_struct *t) {} |
7dfb71030 [PATCH] Add inclu... |
162 |
|
8a32c441c freezer: implemen... |
163 |
static inline bool __refrigerator(bool check_kthr_stop) { return false; } |
2aede851d PM / Hibernate: F... |
164 165 |
static inline int freeze_processes(void) { return -ENOSYS; } static inline int freeze_kernel_threads(void) { return -ENOSYS; } |
7dfb71030 [PATCH] Add inclu... |
166 |
static inline void thaw_processes(void) {} |
a0acae0e8 freezer: unexport... |
167 |
static inline bool try_to_freeze(void) { return false; } |
7dfb71030 [PATCH] Add inclu... |
168 |
|
ba96a0c88 freezer: fix vfor... |
169 170 171 |
static inline void freezer_do_not_count(void) {} static inline void freezer_count(void) {} static inline int freezer_should_skip(struct task_struct *p) { return 0; } |
831441862 Freezer: make ker... |
172 |
static inline void set_freezable(void) {} |
e42837bcd freezer: introduc... |
173 |
|
d310310cb Freezer / sunrpc ... |
174 175 176 177 |
#define freezable_schedule() schedule() #define freezable_schedule_timeout_killable(timeout) \ schedule_timeout_killable(timeout) |
e42837bcd freezer: introduc... |
178 179 180 181 182 |
#define wait_event_freezable(wq, condition) \ wait_event_interruptible(wq, condition) #define wait_event_freezable_timeout(wq, condition, timeout) \ wait_event_interruptible_timeout(wq, condition, timeout) |
e0c8ea1a6 Fix build break w... |
183 184 |
#define wait_event_freezekillable(wq, condition) \ wait_event_killable(wq, condition) |
8174f1503 container freezer... |
185 |
#endif /* !CONFIG_FREEZER */ |
831441862 Freezer: make ker... |
186 187 |
#endif /* FREEZER_H_INCLUDED */ |