projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
freezer: set PF_SUSPEND_TASK flag on tasks that call freeze_processes
[firefly-linux-kernel-4.4.55.git]
/
kernel
/
power
/
process.c
diff --git
a/kernel/power/process.c
b/kernel/power/process.c
index fc0df84864495f8c44261961cb6909e66d24a21e..06ec8869dbf1629f2c7cabc63f2edc96426ea87d 100644
(file)
--- a/
kernel/power/process.c
+++ b/
kernel/power/process.c
@@
-109,6
+109,8
@@
static int try_to_freeze_tasks(bool user_only)
/**
* freeze_processes - Signal user space processes to enter the refrigerator.
/**
* freeze_processes - Signal user space processes to enter the refrigerator.
+ * The current thread will not be frozen. The same process that calls
+ * freeze_processes must later call thaw_processes.
*
* On success, returns 0. On failure, -errno and system is fully thawed.
*/
*
* On success, returns 0. On failure, -errno and system is fully thawed.
*/
@@
-120,6
+122,9
@@
int freeze_processes(void)
if (error)
return error;
if (error)
return error;
+ /* Make sure this task doesn't get frozen */
+ current->flags |= PF_SUSPEND_TASK;
+
if (!pm_freezing)
atomic_inc(&system_freezing_cnt);
if (!pm_freezing)
atomic_inc(&system_freezing_cnt);
@@
-168,6
+173,7
@@
int freeze_kernel_threads(void)
void thaw_processes(void)
{
struct task_struct *g, *p;
void thaw_processes(void)
{
struct task_struct *g, *p;
+ struct task_struct *curr = current;
if (pm_freezing)
atomic_dec(&system_freezing_cnt);
if (pm_freezing)
atomic_dec(&system_freezing_cnt);
@@
-182,10
+188,15
@@
void thaw_processes(void)
read_lock(&tasklist_lock);
do_each_thread(g, p) {
read_lock(&tasklist_lock);
do_each_thread(g, p) {
+ /* No other threads should have PF_SUSPEND_TASK set */
+ WARN_ON((p != curr) && (p->flags & PF_SUSPEND_TASK));
__thaw_task(p);
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
__thaw_task(p);
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
+ WARN_ON(!(curr->flags & PF_SUSPEND_TASK));
+ curr->flags &= ~PF_SUSPEND_TASK;
+
usermodehelper_enable();
schedule();
usermodehelper_enable();
schedule();