cgroup: cpuset: fix panic when offline a cpu
PATCH 1/1 cgroup: cpuset: fix panic when offline a cpu
From: Shu Wang <[email protected]>
cgroup_migrate assumes mgctx tset.csets is pointing to tset.src_csets at start, add tasks to tset.src_csets in func cgroup_migrate_add_task, change test.csets to tset.dst_csets in cgroup_migrate_execute.
For offline a cpu in cgroup_transfer_tasks, it will first migrate a task and cause tset.csets pointing to dst_csets. Get a NULL pointer in cgroup_taskset_first.
reproducer on my 2 cpus machine:
mkdir /sys/fs/cgroup/cpuset/test
cd /sys/fs/cgroup/cpuset/test
echo 1 > cpuset.cpus
echo 0 > cpuset.mems
sleep 100 & echo $! > tasks
sleep 100 & echo $! > tasks
echo 0 > /sys/bus/cpu/devices/cpu1/online
backtrace:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000cf8 IP: cpuset_can_attach+0x2f/0x140 Call Trace: ? cpuset_attach+0x30f/0x3d0 cgroup_migrate_execute+0x71/0x3c0 cgroup_migrate+0x75/0x80 cgroup_transfer_tasks+0x1b2/0x230 cpuset_hotplug_workfn+0xa7d/0xce0 ? finish_task_switch+0x79/0x240 process_one_work+0x149/0x360 worker_thread+0x4d/0x3c0
--- kernel/cgroup/cgroup-v1.c | 6 ++++++ 1 file changed, 6 insertions(+)
kernel/cgroup/cgroup-v1.c +6 -0
@@ -129,6 +129,12 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)css_task_iter_end (&it);if (task) { +/* +* Reset csets to src_cets, as cgroup_migrate assumes +* csets is pointing to src_csets. +*/ + mgctx.tset.csets = &mgctx.tset.src_csets; + ret =cgroup_migrate (task, false, &mgctx);if (!ret)trace_cgroup_transfer_tasks (to, task, false);
Signature · 1 line
2.13.5
Quoted 45 lines · On 09/22/2017 07:00 AM, [email protected] wrote:
From: Shu Wang <[email protected]>
cgroup_migrateassumes mgctx tset.csets is pointing to tset.src_csets at start, add tasks to tset.src_csets in funccgroup_migrate_add_task, change test.csets to tset.dst_csets incgroup_migrate_execute.For offline a cpu in
cgroup_transfer_tasks, it will first migrate a task and cause tset.csets pointing todst_csets. Get a NULL pointer incgroup_taskset_first.reproducer on my 2 cpus machine:
mkdir/sys/fs/cgroup/cpuset/test
cd/sys/fs/cgroup/cpuset/test
echo 1 > cpuset.cpus
echo 0 > cpuset.mems
sleep 100 & echo $! > tasks
sleep 100 & echo $! > tasks
echo 0 >/sys/bus/cpu/devices/cpu1/onlinebacktrace:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000cf8 IP: cpuset_can_attach+0x2f/0x140 Call Trace: ? cpuset_attach+0x30f/0x3d0 cgroup_migrate_execute+0x71/0x3c0 cgroup_migrate+0x75/0x80 cgroup_transfer_tasks+0x1b2/0x230 cpuset_hotplug_workfn+0xa7d/0xce0 ? finish_task_switch+0x79/0x240 process_one_work+0x149/0x360 worker_thread+0x4d/0x3c0Signed-off-by Shu Wang <[email protected]>--- kernel/cgroup/cgroup-v1.c | 6 ++++++ 1 file changed, 6 insertions(+)kernel/cgroup/cgroup-v1.c +0
-0@@ -129,6 +129,12 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)css_task_iter_end (&it);
kernel/cgroup/cgroup-v1.c int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) · line 140
Quoted 10 lines
kernel/cgroup/cgroup-v1.c +6
-0if (task) { +/* +* Reset csets to src_cets, as cgroup_migrate assumes +* csets is pointing to src_csets. +*/ + mgctx.tset.csets = &mgctx.tset.src_csets; + ret =cgroup_migrate (task, false, &mgctx);if (!ret)trace_cgroup_transfer_tasks (to, task, false);
I had actually sent a patch to fix the same bug yesterday. See
https://lkml.org/lkml/2017/9/21/333
Cheers,
Longman