diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/freezer.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 5e75e26d478..db5423eae24 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -37,14 +37,24 @@ static inline void do_not_freeze(struct task_struct *p) /* * Wake up a frozen process + * + * task_lock() is taken to prevent the race with refrigerator() which may + * occur if the freezing of tasks fails. Namely, without the lock, if the + * freezing of tasks failed, thaw_tasks() might have run before a task in + * refrigerator() could call frozen_process(), in which case the task would be + * frozen and no one would thaw it. */ static inline int thaw_process(struct task_struct *p) { + task_lock(p); if (frozen(p)) { p->flags &= ~PF_FROZEN; + task_unlock(p); wake_up_process(p); return 1; } + clear_tsk_thread_flag(p, TIF_FREEZE); + task_unlock(p); return 0; } |