]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
cpusets, cgroups: disallow attaching kthreadd
authorMike Galbraith <efault@gmx.de>
Thu, 8 Dec 2011 04:42:34 +0000 (15:42 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 13 Dec 2011 06:43:26 +0000 (17:43 +1100)
Allowing kthreadd to be moved to a non-root group makes no sense, it being
a global resource, and needlessly leads unsuspecting users toward trouble.

1. An RT workqueue worker thread spawned in a task group with no
   rt_runtime allocated is not schedulable.  Simple user error, but
   harmful to the box.

2. A worker thread which acquires PF_THREAD_BOUND can never leave a
   cpuset, rendering the cpuset immortal.

Save the user some unexpected trouble, just say no.

Signed-off-by: Mike Galbraith <efault@gmx.de>
Acked-by: David Rientjes <rientjes@google.com>
Acked-by: Paul Menage <paul@paulmenage.org>
Cc: Tejun Heo <htejun@gmail.com>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/cpuset.c
kernel/sched/core.c

index fb147b2caa09a721baaafdda15ce3a2eab92a030..793eca605d5c65df5fbd50709b8af81ad6f307c0 100644 (file)
@@ -59,6 +59,7 @@
 #include <linux/mutex.h>
 #include <linux/workqueue.h>
 #include <linux/cgroup.h>
+#include <linux/kthread.h>
 
 /*
  * Workqueue for cpuset related tasks.
@@ -1394,9 +1395,10 @@ static int cpuset_can_attach(struct cgroup_subsys *ss, struct cgroup *cont,
         * set of allowed nodes is unnecessary.  Thus, cpusets are not
         * applicable for such threads.  This prevents checking for success of
         * set_cpus_allowed_ptr() on all attached tasks before cpus_allowed may
-        * be changed.
+        * be changed.  We also disallow attaching kthreadd, to prevent its
+        * child from becoming trapped should it then acquire PF_THREAD_BOUND.
         */
-       if (tsk->flags & PF_THREAD_BOUND)
+       if (tsk->flags & PF_THREAD_BOUND || tsk == kthreadd_task)
                return -EINVAL;
 
        return 0;
index 918a21c8ebe7bd3e4839dde739e9dc29c533a2cf..e1aa1f994bdff2faf073925549f11730f04261e0 100644 (file)
@@ -71,6 +71,7 @@
 #include <linux/ftrace.h>
 #include <linux/slab.h>
 #include <linux/init_task.h>
+#include <linux/kthread.h>
 
 #include <asm/tlb.h>
 #include <asm/irq_regs.h>
@@ -7532,6 +7533,15 @@ cpu_cgroup_destroy(struct cgroup_subsys *ss, struct cgroup *cgrp)
 static int
 cpu_cgroup_can_attach_task(struct cgroup *cgrp, struct task_struct *tsk)
 {
+       /*
+        * kthreadd can fork workers for an RT workqueue in a cgroup
+        * which may or may not have rt_runtime allocated.  Just say no,
+        * as attaching a global resource to a non-root group  doesn't
+        * make any sense anyway.
+        */
+       if (tsk == kthreadd_task)
+               return -EINVAL;
+
 #ifdef CONFIG_RT_GROUP_SCHED
        if (!sched_rt_can_attach(cgroup_tg(cgrp), tsk))
                return -EINVAL;