aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2013-05-06 19:50:12 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-05-12 08:16:22 -0400
commitb01235861b84c0f6107d3f9da189c9898fc3caaf (patch)
tree2924e7cd5b9f0e5762fd789e8a7abda4e3c0d232
parent613f5d13b569859171f0896fbc73ee0bfa811fda (diff)
freezer: convert freezable helpers to freezer_do_not_count()
Freezing tasks will wake up almost every userspace task from where it is blocking and force it to run until it hits a call to try_to_sleep(), generally on the exit path from the syscall it is blocking in. On resume each task will run again, usually restarting the syscall and running until it hits the same blocking call as it was originally blocked in. Convert the existing wait_event_freezable* wrappers to use freezer_do_not_count(). Combined with a previous patch, these tasks will not run during suspend or resume unless they wake up for another reason, in which case they will run until they hit the try_to_freeze() in freezer_count(), and then continue processing the wakeup after tasks are thawed. This results in a small change in behavior, previously a race between freezing and a normal wakeup would be won by the wakeup, now the task will freeze and then handle the wakeup after thawing. 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--include/linux/freezer.h22
1 files changed, 7 insertions, 15 deletions
diff --git a/include/linux/freezer.h b/include/linux/freezer.h
index bcf9e651cc85..c71337af9bbd 100644
--- a/include/linux/freezer.h
+++ b/include/linux/freezer.h
@@ -228,27 +228,19 @@ static inline bool freezer_should_skip(struct task_struct *p)
228#define wait_event_freezable(wq, condition) \ 228#define wait_event_freezable(wq, condition) \
229({ \ 229({ \
230 int __retval; \ 230 int __retval; \
231 for (;;) { \ 231 freezer_do_not_count(); \
232 __retval = wait_event_interruptible(wq, \ 232 __retval = wait_event_interruptible(wq, (condition)); \
233 (condition) || freezing(current)); \ 233 freezer_count(); \
234 if (__retval || (condition)) \
235 break; \
236 try_to_freeze(); \
237 } \
238 __retval; \ 234 __retval; \
239}) 235})
240 236
241#define wait_event_freezable_timeout(wq, condition, timeout) \ 237#define wait_event_freezable_timeout(wq, condition, timeout) \
242({ \ 238({ \
243 long __retval = timeout; \ 239 long __retval = timeout; \
244 for (;;) { \ 240 freezer_do_not_count(); \
245 __retval = wait_event_interruptible_timeout(wq, \ 241 __retval = wait_event_interruptible_timeout(wq, (condition), \
246 (condition) || freezing(current), \ 242 __retval); \
247 __retval); \ 243 freezer_count(); \
248 if (__retval <= 0 || (condition)) \
249 break; \
250 try_to_freeze(); \
251 } \
252 __retval; \ 244 __retval; \
253}) 245})
254 246