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}