.. | .. |
---|
56 | 56 | #include <linux/file.h> |
---|
57 | 57 | #include <linux/fs_parser.h> |
---|
58 | 58 | #include <linux/sched/cputime.h> |
---|
| 59 | +#include <linux/sched/deadline.h> |
---|
59 | 60 | #include <linux/psi.h> |
---|
60 | 61 | #include <net/sock.h> |
---|
61 | 62 | |
---|
.. | .. |
---|
1736 | 1737 | { |
---|
1737 | 1738 | struct cgroup *dcgrp = &dst_root->cgrp; |
---|
1738 | 1739 | struct cgroup_subsys *ss; |
---|
1739 | | - int ssid, i, ret; |
---|
| 1740 | + int ssid, ret; |
---|
1740 | 1741 | u16 dfl_disable_ss_mask = 0; |
---|
1741 | 1742 | |
---|
1742 | 1743 | lockdep_assert_held(&cgroup_mutex); |
---|
.. | .. |
---|
1780 | 1781 | struct cgroup_root *src_root = ss->root; |
---|
1781 | 1782 | struct cgroup *scgrp = &src_root->cgrp; |
---|
1782 | 1783 | 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; |
---|
1784 | 1786 | |
---|
1785 | 1787 | WARN_ON(!css || cgroup_css(dcgrp, ss)); |
---|
1786 | 1788 | |
---|
.. | .. |
---|
1798 | 1800 | css->cgroup = dcgrp; |
---|
1799 | 1801 | |
---|
1800 | 1802 | 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]) { |
---|
1802 | 1806 | list_move_tail(&cset->e_cset_node[ss->id], |
---|
1803 | 1807 | &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 | + } |
---|
1804 | 1819 | spin_unlock_irq(&css_set_lock); |
---|
1805 | 1820 | |
---|
1806 | 1821 | /* default hierarchy doesn't enable controllers by default */ |
---|
.. | .. |
---|
4219 | 4234 | cft->flags |= __CFTYPE_ONLY_ON_DFL; |
---|
4220 | 4235 | return cgroup_add_cftypes(ss, cfts); |
---|
4221 | 4236 | } |
---|
| 4237 | +EXPORT_SYMBOL_GPL(cgroup_add_dfl_cftypes); |
---|
4222 | 4238 | |
---|
4223 | 4239 | /** |
---|
4224 | 4240 | * cgroup_add_legacy_cftypes - add an array of cftypes for legacy hierarchies |
---|
.. | .. |
---|
6197 | 6213 | static void cgroup_css_set_put_fork(struct kernel_clone_args *kargs) |
---|
6198 | 6214 | __releases(&cgroup_threadgroup_rwsem) __releases(&cgroup_mutex) |
---|
6199 | 6215 | { |
---|
| 6216 | + struct cgroup *cgrp = kargs->cgrp; |
---|
| 6217 | + struct css_set *cset = kargs->cset; |
---|
| 6218 | + |
---|
6200 | 6219 | cgroup_threadgroup_change_end(current); |
---|
6201 | 6220 | |
---|
| 6221 | + if (cset) { |
---|
| 6222 | + put_css_set(cset); |
---|
| 6223 | + kargs->cset = NULL; |
---|
| 6224 | + } |
---|
| 6225 | + |
---|
6202 | 6226 | if (kargs->flags & CLONE_INTO_CGROUP) { |
---|
6203 | | - struct cgroup *cgrp = kargs->cgrp; |
---|
6204 | | - struct css_set *cset = kargs->cset; |
---|
6205 | | - |
---|
6206 | 6227 | mutex_unlock(&cgroup_mutex); |
---|
6207 | | - |
---|
6208 | | - if (cset) { |
---|
6209 | | - put_css_set(cset); |
---|
6210 | | - kargs->cset = NULL; |
---|
6211 | | - } |
---|
6212 | | - |
---|
6213 | 6228 | if (cgrp) { |
---|
6214 | 6229 | cgroup_put(cgrp); |
---|
6215 | 6230 | kargs->cgrp = NULL; |
---|
.. | .. |
---|
6372 | 6387 | list_add_tail(&tsk->cg_list, &cset->dying_tasks); |
---|
6373 | 6388 | cset->nr_tasks--; |
---|
6374 | 6389 | |
---|
| 6390 | + if (dl_task(tsk)) |
---|
| 6391 | + dec_dl_tasks_cs(tsk); |
---|
| 6392 | + |
---|
6375 | 6393 | WARN_ON_ONCE(cgroup_task_frozen(tsk)); |
---|
6376 | 6394 | if (unlikely(cgroup_task_freeze(tsk))) |
---|
6377 | 6395 | cgroup_update_frozen(task_dfl_cgroup(tsk)); |
---|