diff options
author | Tejun Heo <tj@kernel.org> | 2017-01-15 19:03:41 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2017-01-15 19:03:41 -0500 |
commit | bfc2cf6f61fceac42235345081eb713329baa2a2 (patch) | |
tree | 90a4aa59cd98d338cf98cd38a94f4bf1b3abec60 /kernel/cgroup/cgroup-v1.c | |
parent | e595cd706982bff0211e6fafe5a108421e747fbc (diff) | |
download | linux-stable-bfc2cf6f61fceac42235345081eb713329baa2a2.tar.gz linux-stable-bfc2cf6f61fceac42235345081eb713329baa2a2.tar.bz2 linux-stable-bfc2cf6f61fceac42235345081eb713329baa2a2.zip |
cgroup: call subsys->*attach() only for subsystems which are actually affected by migration
Currently, subsys->*attach() callbacks are called for all subsystems
which are attached to the hierarchy on which the migration is taking
place.
With cgroup_migrate_prepare_dst() filtering out identity migrations,
v1 hierarchies can avoid spurious ->*attach() callback invocations
where the source and destination csses are identical; however, this
isn't enough on v2 as only a subset of the attached controllers can be
affected on controller enable/disable.
While spurious ->*attach() invocations aren't critically broken,
they're unnecessary overhead and can lead to temporary overcharges on
certain controllers. Fix it by tracking which subsystems are affected
by a migration and invoking ->*attach() callbacks only on those
subsystems.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Zefan Li <lizefan@huawei.com>
Diffstat (limited to 'kernel/cgroup/cgroup-v1.c')
-rw-r--r-- | kernel/cgroup/cgroup-v1.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c index 7a965f460faf..fc34bcf2329f 100644 --- a/kernel/cgroup/cgroup-v1.c +++ b/kernel/cgroup/cgroup-v1.c @@ -125,7 +125,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) css_task_iter_end(&it); if (task) { - ret = cgroup_migrate(task, false, &mgctx, to->root); + ret = cgroup_migrate(task, false, &mgctx); if (!ret) trace_cgroup_transfer_tasks(to, task, false); put_task_struct(task); |