hc
2024-05-16 8d2a02b24d66aa359e83eebc1ed3c0f85367a1cb
kernel/kernel/cgroup/freezer.c
....@@ -6,6 +6,8 @@
66
77 #include "cgroup-internal.h"
88
9
+#include <trace/events/cgroup.h>
10
+
911 /*
1012 * Propagate the cgroup frozen state upwards by the cgroup tree.
1113 */
....@@ -28,6 +30,7 @@
2830 cgrp->nr_descendants) {
2931 set_bit(CGRP_FROZEN, &cgrp->flags);
3032 cgroup_file_notify(&cgrp->events_file);
33
+ TRACE_CGROUP_PATH(notify_frozen, cgrp, 1);
3134 desc++;
3235 }
3336 } else {
....@@ -35,6 +38,7 @@
3538 if (test_bit(CGRP_FROZEN, &cgrp->flags)) {
3639 clear_bit(CGRP_FROZEN, &cgrp->flags);
3740 cgroup_file_notify(&cgrp->events_file);
41
+ TRACE_CGROUP_PATH(notify_frozen, cgrp, 0);
3842 desc++;
3943 }
4044 }
....@@ -73,6 +77,7 @@
7377 clear_bit(CGRP_FROZEN, &cgrp->flags);
7478 }
7579 cgroup_file_notify(&cgrp->events_file);
80
+ TRACE_CGROUP_PATH(notify_frozen, cgrp, frozen);
7681
7782 /* Update the state of ancestor cgroups. */
7883 cgroup_propagate_frozen(cgrp, frozen);
....@@ -134,19 +139,13 @@
134139 cgroup_update_frozen(cgrp);
135140 WARN_ON_ONCE(!current->frozen);
136141 current->frozen = false;
142
+ } else if (!(current->jobctl & JOBCTL_TRAP_FREEZE)) {
143
+ spin_lock(&current->sighand->siglock);
144
+ current->jobctl |= JOBCTL_TRAP_FREEZE;
145
+ set_thread_flag(TIF_SIGPENDING);
146
+ spin_unlock(&current->sighand->siglock);
137147 }
138148 spin_unlock_irq(&css_set_lock);
139
-
140
- if (unlikely(current->frozen)) {
141
- /*
142
- * If the task remained in the frozen state,
143
- * make sure it won't reach userspace without
144
- * entering the signal handling loop.
145
- */
146
- spin_lock_irq(&current->sighand->siglock);
147
- recalc_sigpending();
148
- spin_unlock_irq(&current->sighand->siglock);
149
- }
150149 }
151150
152151 /*
....@@ -189,6 +188,11 @@
189188 clear_bit(CGRP_FREEZE, &cgrp->flags);
190189 spin_unlock_irq(&css_set_lock);
191190
191
+ if (freeze)
192
+ TRACE_CGROUP_PATH(freeze, cgrp);
193
+ else
194
+ TRACE_CGROUP_PATH(unfreeze, cgrp);
195
+
192196 css_task_iter_start(&cgrp->self, 0, &it);
193197 while ((task = css_task_iter_next(&it))) {
194198 /*
....@@ -227,6 +231,15 @@
227231 return;
228232
229233 /*
234
+ * It's not necessary to do changes if both of the src and dst cgroups
235
+ * are not freezing and task is not frozen.
236
+ */
237
+ if (!test_bit(CGRP_FREEZE, &src->flags) &&
238
+ !test_bit(CGRP_FREEZE, &dst->flags) &&
239
+ !task->frozen)
240
+ return;
241
+
242
+ /*
230243 * Adjust counters of freezing and frozen tasks.
231244 * Note, that if the task is frozen, but the destination cgroup is not
232245 * frozen, we bump both counters to keep them balanced.
....@@ -242,16 +255,6 @@
242255 * Force the task to the desired state.
243256 */
244257 cgroup_freeze_task(task, test_bit(CGRP_FREEZE, &dst->flags));
245
-}
246
-
247
-void cgroup_freezer_frozen_exit(struct task_struct *task)
248
-{
249
- struct cgroup *cgrp = task_dfl_cgroup(task);
250
-
251
- lockdep_assert_held(&css_set_lock);
252
-
253
- cgroup_dec_frozen_cnt(cgrp);
254
- cgroup_update_frozen(cgrp);
255258 }
256259
257260 void cgroup_freeze(struct cgroup *cgrp, bool freeze)
....@@ -312,6 +315,9 @@
312315 * In both cases it's better to notify a user, that there is
313316 * nothing to wait for.
314317 */
315
- if (!applied)
318
+ if (!applied) {
319
+ TRACE_CGROUP_PATH(notify_frozen, cgrp,
320
+ test_bit(CGRP_FROZEN, &cgrp->flags));
316321 cgroup_file_notify(&cgrp->events_file);
322
+ }
317323 }