Skip to content

Commit

Permalink
sched: Fix race between task_group and sched_task_group
Browse files Browse the repository at this point in the history
  • Loading branch information
pavel-shirshov authored and lguohan committed Dec 25, 2016
1 parent 6a24394 commit a62f703
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
46 changes: 46 additions & 0 deletions patch/kernel-sched-core-fix-cgroup-fork-race.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
[PATCH] sched: Fix race between task_group and sched_task_group

From: Pavel Shirshov <pavelsh@microsoft.com>

Patch: http://marc.info/?l=linux-kernel&m=141440511931665

The race may happen when somebody is changing task_group of a forking task.
Child's cgroup is the same as parent's after dup_task_struct() (there just
memory copying). Also, cfs_rq and rt_rq are the same as parent's.

But if parent changes its task_group before it's called cgroup_post_fork(),
we do not reflect this situation on child. Child's cfs_rq and rt_rq remain
the same, while child's task_group changes in cgroup_post_fork().

To fix this we introduce fork() method, which calls sched_move_task() directly.
This function changes sched_task_group on appropriate (also its logic has
no problem with freshly created tasks, so we shouldn't introduce something
special; we are able just to use it).
---
kernel/sched/core.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 8cbf68e..8077b8e 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7793,6 +7793,11 @@ static void cpu_cgroup_css_offline(struct cgroup_subsys_state *css)
sched_offline_group(tg);
}

+static void cpu_cgroup_fork(struct task_struct *task)
+{
+ sched_move_task(task);
+}
+
static int cpu_cgroup_can_attach(struct cgroup_subsys_state *css,
struct cgroup_taskset *tset)
{
@@ -8159,6 +8164,7 @@ struct cgroup_subsys cpu_cgrp_subsys = {
.css_free = cpu_cgroup_css_free,
.css_online = cpu_cgroup_css_online,
.css_offline = cpu_cgroup_css_offline,
+ .fork = cpu_cgroup_fork,
.can_attach = cpu_cgroup_can_attach,
.attach = cpu_cgroup_attach,
.exit = cpu_cgroup_exit,
1 change: 1 addition & 0 deletions patch/series
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# This series applies on GIT commit 1451b36b2b0d62178e42f648d8a18131af18f7d8
kernel-sched-core-fix-cgroup-fork-race.patch
config-dell-s6000.patch
config-mlnx-sn2700.patch
driver-at24-fix-odd-length-two-byte-access.patch
Expand Down

0 comments on commit a62f703

Please sign in to comment.