Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : /* 3 : : * drivers/power/process.c - Functions for starting/stopping processes on 4 : : * suspend transitions. 5 : : * 6 : : * Originally from swsusp. 7 : : */ 8 : : 9 : : 10 : : #undef DEBUG 11 : : 12 : : #include <linux/interrupt.h> 13 : : #include <linux/oom.h> 14 : : #include <linux/suspend.h> 15 : : #include <linux/module.h> 16 : : #include <linux/sched/debug.h> 17 : : #include <linux/sched/task.h> 18 : : #include <linux/syscalls.h> 19 : : #include <linux/freezer.h> 20 : : #include <linux/delay.h> 21 : : #include <linux/workqueue.h> 22 : : #include <linux/kmod.h> 23 : : #include <trace/events/power.h> 24 : : #include <linux/cpuset.h> 25 : : 26 : : /* 27 : : * Timeout for stopping processes 28 : : */ 29 : : unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC; 30 : : 31 : 0 : static int try_to_freeze_tasks(bool user_only) 32 : : { 33 : : struct task_struct *g, *p; 34 : : unsigned long end_time; 35 : : unsigned int todo; 36 : : bool wq_busy = false; 37 : : ktime_t start, end, elapsed; 38 : : unsigned int elapsed_msecs; 39 : : bool wakeup = false; 40 : : int sleep_usecs = USEC_PER_MSEC; 41 : : 42 : : start = ktime_get_boottime(); 43 : : 44 : 0 : end_time = jiffies + msecs_to_jiffies(freeze_timeout_msecs); 45 : : 46 [ # # ]: 0 : if (!user_only) 47 : 0 : freeze_workqueues_begin(); 48 : : 49 : : while (true) { 50 : : todo = 0; 51 : 0 : read_lock(&tasklist_lock); 52 [ # # # # ]: 0 : for_each_process_thread(g, p) { 53 [ # # # # ]: 0 : if (p == current || !freeze_task(p)) 54 : 0 : continue; 55 : : 56 [ # # ]: 0 : if (!freezer_should_skip(p)) 57 : 0 : todo++; 58 : : } 59 : : read_unlock(&tasklist_lock); 60 : : 61 [ # # ]: 0 : if (!user_only) { 62 : 0 : wq_busy = freeze_workqueues_busy(); 63 : 0 : todo += wq_busy; 64 : : } 65 : : 66 [ # # # # ]: 0 : if (!todo || time_after(jiffies, end_time)) 67 : : break; 68 : : 69 : : if (pm_wakeup_pending()) { 70 : : wakeup = true; 71 : : break; 72 : : } 73 : : 74 : : /* 75 : : * We need to retry, but first give the freezing tasks some 76 : : * time to enter the refrigerator. Start with an initial 77 : : * 1 ms sleep followed by exponential backoff until 8 ms. 78 : : */ 79 : 0 : usleep_range(sleep_usecs / 2, sleep_usecs); 80 [ # # ]: 0 : if (sleep_usecs < 8 * USEC_PER_MSEC) 81 : 0 : sleep_usecs *= 2; 82 : : } 83 : : 84 : : end = ktime_get_boottime(); 85 : 0 : elapsed = ktime_sub(end, start); 86 : 0 : elapsed_msecs = ktime_to_ms(elapsed); 87 : : 88 [ # # ]: 0 : if (todo) { 89 : 0 : pr_cont("\n"); 90 : 0 : pr_err("Freezing of tasks %s after %d.%03d seconds " 91 : : "(%d tasks refusing to freeze, wq_busy=%d):\n", 92 : : wakeup ? "aborted" : "failed", 93 : : elapsed_msecs / 1000, elapsed_msecs % 1000, 94 : : todo - wq_busy, wq_busy); 95 : : 96 [ # # ]: 0 : if (wq_busy) 97 : 0 : show_workqueue_state(); 98 : : 99 : : if (!wakeup || pm_debug_messages_on) { 100 : 0 : read_lock(&tasklist_lock); 101 [ # # # # ]: 0 : for_each_process_thread(g, p) { 102 [ # # # # ]: 0 : if (p != current && !freezer_should_skip(p) 103 [ # # # # ]: 0 : && freezing(p) && !frozen(p)) 104 : 0 : sched_show_task(p); 105 : : } 106 : : read_unlock(&tasklist_lock); 107 : : } 108 : : } else { 109 : 0 : pr_cont("(elapsed %d.%03d seconds) ", elapsed_msecs / 1000, 110 : : elapsed_msecs % 1000); 111 : : } 112 : : 113 [ # # ]: 0 : return todo ? -EBUSY : 0; 114 : : } 115 : : 116 : : /** 117 : : * freeze_processes - Signal user space processes to enter the refrigerator. 118 : : * The current thread will not be frozen. The same process that calls 119 : : * freeze_processes must later call thaw_processes. 120 : : * 121 : : * On success, returns 0. On failure, -errno and system is fully thawed. 122 : : */ 123 : 0 : int freeze_processes(void) 124 : : { 125 : : int error; 126 : : 127 : 0 : error = __usermodehelper_disable(UMH_FREEZING); 128 [ # # ]: 0 : if (error) 129 : : return error; 130 : : 131 : : /* Make sure this task doesn't get frozen */ 132 : 0 : current->flags |= PF_SUSPEND_TASK; 133 : : 134 [ # # ]: 0 : if (!pm_freezing) 135 : : atomic_inc(&system_freezing_cnt); 136 : : 137 : : pm_wakeup_clear(true); 138 : 0 : pr_info("Freezing user space processes ... "); 139 : 0 : pm_freezing = true; 140 : 0 : error = try_to_freeze_tasks(true); 141 [ # # ]: 0 : if (!error) { 142 : 0 : __usermodehelper_set_disable_depth(UMH_DISABLED); 143 : 0 : pr_cont("done."); 144 : : } 145 : 0 : pr_cont("\n"); 146 [ # # ]: 0 : BUG_ON(in_atomic()); 147 : : 148 : : /* 149 : : * Now that the whole userspace is frozen we need to disbale 150 : : * the OOM killer to disallow any further interference with 151 : : * killable tasks. There is no guarantee oom victims will 152 : : * ever reach a point they go away we have to wait with a timeout. 153 : : */ 154 [ # # # # ]: 0 : if (!error && !oom_killer_disable(msecs_to_jiffies(freeze_timeout_msecs))) 155 : : error = -EBUSY; 156 : : 157 [ # # ]: 0 : if (error) 158 : 0 : thaw_processes(); 159 : 0 : return error; 160 : : } 161 : : 162 : : /** 163 : : * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator. 164 : : * 165 : : * On success, returns 0. On failure, -errno and only the kernel threads are 166 : : * thawed, so as to give a chance to the caller to do additional cleanups 167 : : * (if any) before thawing the userspace tasks. So, it is the responsibility 168 : : * of the caller to thaw the userspace tasks, when the time is right. 169 : : */ 170 : 0 : int freeze_kernel_threads(void) 171 : : { 172 : : int error; 173 : : 174 : 0 : pr_info("Freezing remaining freezable tasks ... "); 175 : : 176 : 0 : pm_nosig_freezing = true; 177 : 0 : error = try_to_freeze_tasks(false); 178 [ # # ]: 0 : if (!error) 179 : 0 : pr_cont("done."); 180 : : 181 : 0 : pr_cont("\n"); 182 [ # # ]: 0 : BUG_ON(in_atomic()); 183 : : 184 [ # # ]: 0 : if (error) 185 : 0 : thaw_kernel_threads(); 186 : 0 : return error; 187 : : } 188 : : 189 : 0 : void thaw_processes(void) 190 : : { 191 : : struct task_struct *g, *p; 192 : 0 : struct task_struct *curr = current; 193 : : 194 : 0 : trace_suspend_resume(TPS("thaw_processes"), 0, true); 195 [ # # ]: 0 : if (pm_freezing) 196 : : atomic_dec(&system_freezing_cnt); 197 : 0 : pm_freezing = false; 198 : 0 : pm_nosig_freezing = false; 199 : : 200 : 0 : oom_killer_enable(); 201 : : 202 : 0 : pr_info("Restarting tasks ... "); 203 : : 204 : 0 : __usermodehelper_set_disable_depth(UMH_FREEZING); 205 : 0 : thaw_workqueues(); 206 : : 207 : 0 : cpuset_wait_for_hotplug(); 208 : : 209 : 0 : read_lock(&tasklist_lock); 210 [ # # # # ]: 0 : for_each_process_thread(g, p) { 211 : : /* No other threads should have PF_SUSPEND_TASK set */ 212 [ # # # # : 0 : WARN_ON((p != curr) && (p->flags & PF_SUSPEND_TASK)); # # ] 213 : 0 : __thaw_task(p); 214 : : } 215 : : read_unlock(&tasklist_lock); 216 : : 217 [ # # ]: 0 : WARN_ON(!(curr->flags & PF_SUSPEND_TASK)); 218 : 0 : curr->flags &= ~PF_SUSPEND_TASK; 219 : : 220 : : usermodehelper_enable(); 221 : : 222 : 0 : schedule(); 223 : 0 : pr_cont("done.\n"); 224 : 0 : trace_suspend_resume(TPS("thaw_processes"), 0, false); 225 : 0 : } 226 : : 227 : 0 : void thaw_kernel_threads(void) 228 : : { 229 : : struct task_struct *g, *p; 230 : : 231 : 0 : pm_nosig_freezing = false; 232 : 0 : pr_info("Restarting kernel threads ... "); 233 : : 234 : 0 : thaw_workqueues(); 235 : : 236 : 0 : read_lock(&tasklist_lock); 237 [ # # # # ]: 0 : for_each_process_thread(g, p) { 238 [ # # ]: 0 : if (p->flags & (PF_KTHREAD | PF_WQ_WORKER)) 239 : 0 : __thaw_task(p); 240 : : } 241 : : read_unlock(&tasklist_lock); 242 : : 243 : 0 : schedule(); 244 : 0 : pr_cont("done.\n"); 245 : 0 : }