hc
2024-05-10 748e4f3d702def1a4bff191e0cf93b6a05340f01
kernel/kernel/cgroup/cgroup.c
....@@ -56,6 +56,7 @@
5656 #include <linux/file.h>
5757 #include <linux/fs_parser.h>
5858 #include <linux/sched/cputime.h>
59
+#include <linux/sched/deadline.h>
5960 #include <linux/psi.h>
6061 #include <net/sock.h>
6162
....@@ -1736,7 +1737,7 @@
17361737 {
17371738 struct cgroup *dcgrp = &dst_root->cgrp;
17381739 struct cgroup_subsys *ss;
1739
- int ssid, i, ret;
1740
+ int ssid, ret;
17401741 u16 dfl_disable_ss_mask = 0;
17411742
17421743 lockdep_assert_held(&cgroup_mutex);
....@@ -1780,7 +1781,8 @@
17801781 struct cgroup_root *src_root = ss->root;
17811782 struct cgroup *scgrp = &src_root->cgrp;
17821783 struct cgroup_subsys_state *css = cgroup_css(scgrp, ss);
1783
- struct css_set *cset;
1784
+ struct css_set *cset, *cset_pos;
1785
+ struct css_task_iter *it;
17841786
17851787 WARN_ON(!css || cgroup_css(dcgrp, ss));
17861788
....@@ -1798,9 +1800,22 @@
17981800 css->cgroup = dcgrp;
17991801
18001802 spin_lock_irq(&css_set_lock);
1801
- hash_for_each(css_set_table, i, cset, hlist)
1803
+ WARN_ON(!list_empty(&dcgrp->e_csets[ss->id]));
1804
+ list_for_each_entry_safe(cset, cset_pos, &scgrp->e_csets[ss->id],
1805
+ e_cset_node[ss->id]) {
18021806 list_move_tail(&cset->e_cset_node[ss->id],
18031807 &dcgrp->e_csets[ss->id]);
1808
+ /*
1809
+ * all css_sets of scgrp together in same order to dcgrp,
1810
+ * patch in-flight iterators to preserve correct iteration.
1811
+ * since the iterator is always advanced right away and
1812
+ * finished when it->cset_pos meets it->cset_head, so only
1813
+ * update it->cset_head is enough here.
1814
+ */
1815
+ list_for_each_entry(it, &cset->task_iters, iters_node)
1816
+ if (it->cset_head == &scgrp->e_csets[ss->id])
1817
+ it->cset_head = &dcgrp->e_csets[ss->id];
1818
+ }
18041819 spin_unlock_irq(&css_set_lock);
18051820
18061821 /* default hierarchy doesn't enable controllers by default */
....@@ -4219,6 +4234,7 @@
42194234 cft->flags |= __CFTYPE_ONLY_ON_DFL;
42204235 return cgroup_add_cftypes(ss, cfts);
42214236 }
4237
+EXPORT_SYMBOL_GPL(cgroup_add_dfl_cftypes);
42224238
42234239 /**
42244240 * cgroup_add_legacy_cftypes - add an array of cftypes for legacy hierarchies
....@@ -6197,19 +6213,18 @@
61976213 static void cgroup_css_set_put_fork(struct kernel_clone_args *kargs)
61986214 __releases(&cgroup_threadgroup_rwsem) __releases(&cgroup_mutex)
61996215 {
6216
+ struct cgroup *cgrp = kargs->cgrp;
6217
+ struct css_set *cset = kargs->cset;
6218
+
62006219 cgroup_threadgroup_change_end(current);
62016220
6221
+ if (cset) {
6222
+ put_css_set(cset);
6223
+ kargs->cset = NULL;
6224
+ }
6225
+
62026226 if (kargs->flags & CLONE_INTO_CGROUP) {
6203
- struct cgroup *cgrp = kargs->cgrp;
6204
- struct css_set *cset = kargs->cset;
6205
-
62066227 mutex_unlock(&cgroup_mutex);
6207
-
6208
- if (cset) {
6209
- put_css_set(cset);
6210
- kargs->cset = NULL;
6211
- }
6212
-
62136228 if (cgrp) {
62146229 cgroup_put(cgrp);
62156230 kargs->cgrp = NULL;
....@@ -6372,6 +6387,9 @@
63726387 list_add_tail(&tsk->cg_list, &cset->dying_tasks);
63736388 cset->nr_tasks--;
63746389
6390
+ if (dl_task(tsk))
6391
+ dec_dl_tasks_cs(tsk);
6392
+
63756393 WARN_ON_ONCE(cgroup_task_frozen(tsk));
63766394 if (unlikely(cgroup_task_freeze(tsk)))
63776395 cgroup_update_frozen(task_dfl_cgroup(tsk));