Skip to content

Commit 16e8300

Browse files
Chen Ridonghtejun
authored andcommitted
cgroup/freezer: Add cgroup CGRP_FROZEN flag update helper
Add help to update cgroup CGRP_FROZEN flag. Both cgroup_propagate_frozen and cgroup_update_frozen functions update CGRP_FROZEN flag, this makes code concise. Reviewed-by: Michal Koutný <mkoutny@suse.com> Signed-off-by: Chen Ridong <chenridong@huawei.com> Signed-off-by: Tejun Heo <tj@kernel.org>
1 parent ee1251f commit 16e8300

1 file changed

Lines changed: 32 additions & 35 deletions

File tree

kernel/cgroup/freezer.c

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,28 @@
88

99
#include <trace/events/cgroup.h>
1010

11+
/*
12+
* Update CGRP_FROZEN of cgroup.flag
13+
* Return true if flags is updated; false if flags has no change
14+
*/
15+
static bool cgroup_update_frozen_flag(struct cgroup *cgrp, bool frozen)
16+
{
17+
lockdep_assert_held(&css_set_lock);
18+
19+
/* Already there? */
20+
if (test_bit(CGRP_FROZEN, &cgrp->flags) == frozen)
21+
return false;
22+
23+
if (frozen)
24+
set_bit(CGRP_FROZEN, &cgrp->flags);
25+
else
26+
clear_bit(CGRP_FROZEN, &cgrp->flags);
27+
28+
cgroup_file_notify(&cgrp->events_file);
29+
TRACE_CGROUP_PATH(notify_frozen, cgrp, frozen);
30+
return true;
31+
}
32+
1133
/*
1234
* Propagate the cgroup frozen state upwards by the cgroup tree.
1335
*/
@@ -24,24 +46,16 @@ static void cgroup_propagate_frozen(struct cgroup *cgrp, bool frozen)
2446
while ((cgrp = cgroup_parent(cgrp))) {
2547
if (frozen) {
2648
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);
34-
desc++;
35-
}
49+
if (!test_bit(CGRP_FREEZE, &cgrp->flags) ||
50+
(cgrp->freezer.nr_frozen_descendants !=
51+
cgrp->nr_descendants))
52+
continue;
3653
} else {
3754
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);
42-
desc++;
43-
}
4455
}
56+
57+
if (cgroup_update_frozen_flag(cgrp, frozen))
58+
desc++;
4559
}
4660
}
4761

@@ -53,8 +67,6 @@ void cgroup_update_frozen(struct cgroup *cgrp)
5367
{
5468
bool frozen;
5569

56-
lockdep_assert_held(&css_set_lock);
57-
5870
/*
5971
* If the cgroup has to be frozen (CGRP_FREEZE bit set),
6072
* and all tasks are frozen and/or stopped, let's consider
@@ -63,24 +75,9 @@ void cgroup_update_frozen(struct cgroup *cgrp)
6375
frozen = test_bit(CGRP_FREEZE, &cgrp->flags) &&
6476
cgrp->freezer.nr_frozen_tasks == __cgroup_task_count(cgrp);
6577

66-
if (frozen) {
67-
/* Already there? */
68-
if (test_bit(CGRP_FROZEN, &cgrp->flags))
69-
return;
70-
71-
set_bit(CGRP_FROZEN, &cgrp->flags);
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);
81-
82-
/* Update the state of ancestor cgroups. */
83-
cgroup_propagate_frozen(cgrp, frozen);
78+
/* If flags is updated, update the state of ancestor cgroups. */
79+
if (cgroup_update_frozen_flag(cgrp, frozen))
80+
cgroup_propagate_frozen(cgrp, frozen);
8481
}
8582

8683
/*

0 commit comments

Comments
 (0)