Patch "sched/cgroup: Move sched_online_group() back into css_online() to fix crash" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
sched/cgroup: Move sched_online_group() back into css_online() to fix crash
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
sched-cgroup-move-sched_online_group-back-into-css_online-to-fix-crash.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
96b777452d8881480fd5be50112f791c17db4b6bMon Sep 17 00:00:00 2001
From: Konstantin Khlebnikov <[email protected]>
Date: Wed, 8 Feb 2017 14:27:27 +0300
Subject: sched/cgroup: Move sched_online_group() back into css_online() to fix crash
From: Konstantin Khlebnikov <[email protected]>
commit 96b777452d8881480fd5be50112f791c17db4b6b upstream.
Commit:
2f5177f0fd7e ("sched/cgroup: Fix/cleanup cgroup teardown/init")
.. moved sched_online_group() from css_online() to css_alloc(). It exposes half-baked task group into global lists before initializing generic cgroup stuff.
LTP testcase (third in cgroup_regression_test) written for testing similar race in kernels 2.6.26-2.6.28 easily triggers this oops:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000008 IP: kernfs_path_from_node_locked+0x260/0x320 CPU: 1 PID: 30346 Comm: cat Not tainted 4.10.0-rc5-test #4 Call Trace: ? kernfs_path_from_node+0x4f/0x60 kernfs_path_from_node+0x3e/0x60 print_rt_rq+0x44/0x2b0 print_rt_stats+0x7a/0xd0 print_cpu+0x2fc/0xe80 ? __might_sleep+0x4a/0x80 sched_debug_show+0x17/0x30 seq_read+0xf2/0x3b0 proc_reg_read+0x42/0x70 __vfs_read+0x28/0x130 ? security_file_permission+0x9b/0xc0 ? rw_verify_area+0x4e/0xb0 vfs_read+0xa5/0x170 SyS_read+0x46/0xa0 entry_SYSCALL_64_fastpath+0x1e/0xad
Here the task group is already linked into the global RCU-protected 'task_groups' list, but the css->cgroup pointer is still NULL.
This patch reverts this chunk and moves online back to css_online().
--- kernel/sched/core.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
kernel/sched/core.c +12 -2
@@ -8253,11 +8253,20 @@ cpu_cgroup_css_alloc(struct cgroup_subsyif (IS_ERR (tg))return ERR_PTR (-ENOMEM ); -sched_online_group (tg, parent); -return &tg->css; } +/* Expose task group only after completing cgroup initialization */ +static int cpu_cgroup_css_online (struct cgroup_subsys_state *css) +{ +struct task_group *tg =css_tg (css); +struct task_group *parent =css_tg (css->parent); + +if (parent) +sched_online_group (tg, parent); +return 0 ; +} +static void cpu_cgroup_css_released (struct cgroup_subsys_state *css) {struct task_group *tg =css_tg (css);
@@ -8632,6 +8641,7 @@ static struct cftype cpu_files[] = {struct cgroup_subsys cpu_cgrp_subsys = { .css_alloc = cpu_cgroup_css_alloc, + .css_online = cpu_cgroup_css_online, .css_released = cpu_cgroup_css_released, .css_free = cpu_cgroup_css_free, .fork = cpu_cgroup_fork,
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/sched-cgroup-move-sched_online_group-back-into-css_online-to-fix-crash.patch