freezer.c (76f969e8948d82e78e1bc4beb6b9465908e74873) | freezer.c (4c476d8cff48853645abc822154aaad208faebcc) |
---|---|
1//SPDX-License-Identifier: GPL-2.0 2#include <linux/cgroup.h> 3#include <linux/sched.h> 4#include <linux/sched/task.h> 5#include <linux/sched/signal.h> 6 7#include "cgroup-internal.h" 8 | 1//SPDX-License-Identifier: GPL-2.0 2#include <linux/cgroup.h> 3#include <linux/sched.h> 4#include <linux/sched/task.h> 5#include <linux/sched/signal.h> 6 7#include "cgroup-internal.h" 8 |
9#include <trace/events/cgroup.h> 10 |
|
9/* 10 * Propagate the cgroup frozen state upwards by the cgroup tree. 11 */ 12static void cgroup_propagate_frozen(struct cgroup *cgrp, bool frozen) 13{ 14 int desc = 1; 15 16 /* --- 6 unchanged lines hidden (view full) --- 23 if (frozen) { 24 cgrp->freezer.nr_frozen_descendants += desc; 25 if (!test_bit(CGRP_FROZEN, &cgrp->flags) && 26 test_bit(CGRP_FREEZE, &cgrp->flags) && 27 cgrp->freezer.nr_frozen_descendants == 28 cgrp->nr_descendants) { 29 set_bit(CGRP_FROZEN, &cgrp->flags); 30 cgroup_file_notify(&cgrp->events_file); | 11/* 12 * Propagate the cgroup frozen state upwards by the cgroup tree. 13 */ 14static void cgroup_propagate_frozen(struct cgroup *cgrp, bool frozen) 15{ 16 int desc = 1; 17 18 /* --- 6 unchanged lines hidden (view full) --- 25 if (frozen) { 26 cgrp->freezer.nr_frozen_descendants += desc; 27 if (!test_bit(CGRP_FROZEN, &cgrp->flags) && 28 test_bit(CGRP_FREEZE, &cgrp->flags) && 29 cgrp->freezer.nr_frozen_descendants == 30 cgrp->nr_descendants) { 31 set_bit(CGRP_FROZEN, &cgrp->flags); 32 cgroup_file_notify(&cgrp->events_file); |
33 TRACE_CGROUP_PATH(notify_frozen, cgrp, 1); |
|
31 desc++; 32 } 33 } else { 34 cgrp->freezer.nr_frozen_descendants -= desc; 35 if (test_bit(CGRP_FROZEN, &cgrp->flags)) { 36 clear_bit(CGRP_FROZEN, &cgrp->flags); 37 cgroup_file_notify(&cgrp->events_file); | 34 desc++; 35 } 36 } else { 37 cgrp->freezer.nr_frozen_descendants -= desc; 38 if (test_bit(CGRP_FROZEN, &cgrp->flags)) { 39 clear_bit(CGRP_FROZEN, &cgrp->flags); 40 cgroup_file_notify(&cgrp->events_file); |
41 TRACE_CGROUP_PATH(notify_frozen, cgrp, 0); |
|
38 desc++; 39 } 40 } 41 } 42} 43 44/* 45 * Revisit the cgroup frozen state. --- 22 unchanged lines hidden (view full) --- 68 } else { 69 /* Already there? */ 70 if (!test_bit(CGRP_FROZEN, &cgrp->flags)) 71 return; 72 73 clear_bit(CGRP_FROZEN, &cgrp->flags); 74 } 75 cgroup_file_notify(&cgrp->events_file); | 42 desc++; 43 } 44 } 45 } 46} 47 48/* 49 * Revisit the cgroup frozen state. --- 22 unchanged lines hidden (view full) --- 72 } else { 73 /* Already there? */ 74 if (!test_bit(CGRP_FROZEN, &cgrp->flags)) 75 return; 76 77 clear_bit(CGRP_FROZEN, &cgrp->flags); 78 } 79 cgroup_file_notify(&cgrp->events_file); |
80 TRACE_CGROUP_PATH(notify_frozen, cgrp, frozen); |
|
76 77 /* Update the state of ancestor cgroups. */ 78 cgroup_propagate_frozen(cgrp, frozen); 79} 80 81/* 82 * Increment cgroup's nr_frozen_tasks. 83 */ --- 100 unchanged lines hidden (view full) --- 184 185 spin_lock_irq(&css_set_lock); 186 if (freeze) 187 set_bit(CGRP_FREEZE, &cgrp->flags); 188 else 189 clear_bit(CGRP_FREEZE, &cgrp->flags); 190 spin_unlock_irq(&css_set_lock); 191 | 81 82 /* Update the state of ancestor cgroups. */ 83 cgroup_propagate_frozen(cgrp, frozen); 84} 85 86/* 87 * Increment cgroup's nr_frozen_tasks. 88 */ --- 100 unchanged lines hidden (view full) --- 189 190 spin_lock_irq(&css_set_lock); 191 if (freeze) 192 set_bit(CGRP_FREEZE, &cgrp->flags); 193 else 194 clear_bit(CGRP_FREEZE, &cgrp->flags); 195 spin_unlock_irq(&css_set_lock); 196 |
197 if (freeze) 198 TRACE_CGROUP_PATH(freeze, cgrp); 199 else 200 TRACE_CGROUP_PATH(unfreeze, cgrp); 201 |
|
192 css_task_iter_start(&cgrp->self, 0, &it); 193 while ((task = css_task_iter_next(&it))) { 194 /* 195 * Ignore kernel threads here. Freezing cgroups containing 196 * kthreads isn't supported. 197 */ 198 if (task->flags & PF_KTHREAD) 199 continue; --- 107 unchanged lines hidden (view full) --- 307 /* 308 * Even if the actual state hasn't changed, let's notify a user. 309 * The state can be enforced by an ancestor cgroup: the cgroup 310 * can already be in the desired state or it can be locked in the 311 * opposite state, so that the transition will never happen. 312 * In both cases it's better to notify a user, that there is 313 * nothing to wait for. 314 */ | 202 css_task_iter_start(&cgrp->self, 0, &it); 203 while ((task = css_task_iter_next(&it))) { 204 /* 205 * Ignore kernel threads here. Freezing cgroups containing 206 * kthreads isn't supported. 207 */ 208 if (task->flags & PF_KTHREAD) 209 continue; --- 107 unchanged lines hidden (view full) --- 317 /* 318 * Even if the actual state hasn't changed, let's notify a user. 319 * The state can be enforced by an ancestor cgroup: the cgroup 320 * can already be in the desired state or it can be locked in the 321 * opposite state, so that the transition will never happen. 322 * In both cases it's better to notify a user, that there is 323 * nothing to wait for. 324 */ |
315 if (!applied) | 325 if (!applied) { 326 TRACE_CGROUP_PATH(notify_frozen, cgrp, 327 test_bit(CGRP_FROZEN, &cgrp->flags)); |
316 cgroup_file_notify(&cgrp->events_file); | 328 cgroup_file_notify(&cgrp->events_file); |
329 } |
|
317} | 330} |