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