In function cgroup_migrate_add_src(), if dst_cgrp equals to src_cgroup which the tasks link, dont go on migrating tasks to another css_set. This can save the cost of unnecessary migration. Signed-off-by: shisiyuan <shisiyuan@xxxxxxxxxx> --- kernel/cgroup/cgroup.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index 6139460..97d7f68 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -2634,6 +2634,9 @@ void cgroup_migrate_add_src(struct css_set *src_cset, src_cgrp = cset_cgroup_from_root(src_cset, dst_cgrp->root); + if (src_cgrp == dst_cgrp) + return; + if (!list_empty(&src_cset->mg_preload_node)) return; @@ -2780,6 +2783,9 @@ int cgroup_attach_task(struct cgroup *dst_cgrp, struct task_struct *leader, rcu_read_unlock(); spin_unlock_irq(&css_set_lock); + if (list_empty(&mgctx.preloaded_src_csets)) + return ret; + /* prepare dst csets and commit */ ret = cgroup_migrate_prepare_dst(&mgctx); if (!ret) @@ -2927,7 +2933,7 @@ static int cgroup_update_dfl_csses(struct cgroup *cgrp) struct cgroup_subsys_state *d_css; struct cgroup *dsct; struct css_set *src_cset; - int ret; + int ret = 0; lockdep_assert_held(&cgroup_mutex); @@ -2943,6 +2949,9 @@ static int cgroup_update_dfl_csses(struct cgroup *cgrp) } spin_unlock_irq(&css_set_lock); + if (list_empty(&mgctx.preloaded_src_csets)) + goto out_finish; + /* NULL dst indicates self on default hierarchy */ ret = cgroup_migrate_prepare_dst(&mgctx); if (ret) -- 2.7.4