cgroups: disallow attaching kthreadd or PF_THREAD_BOUND threads
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 <mgalbraith@suse.de> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Acked-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Li Zefan <lizefan@huawei.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
86f82d5618
commit
c4c27fbdda
|
@ -60,6 +60,7 @@
|
|||
#include <linux/eventfd.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/flex_array.h> /* used in cgroup_attach_proc */
|
||||
#include <linux/kthread.h>
|
||||
|
||||
#include <linux/atomic.h>
|
||||
|
||||
|
@ -2225,6 +2226,18 @@ retry_find_task:
|
|||
|
||||
if (threadgroup)
|
||||
tsk = tsk->group_leader;
|
||||
|
||||
/*
|
||||
* Workqueue threads may acquire PF_THREAD_BOUND and become
|
||||
* trapped in a cpuset, or RT worker may be born in a cgroup
|
||||
* with no rt_runtime allocated. Just say no.
|
||||
*/
|
||||
if (tsk == kthreadd_task || (tsk->flags & PF_THREAD_BOUND)) {
|
||||
ret = -EINVAL;
|
||||
rcu_read_unlock();
|
||||
goto out_unlock_cgroup;
|
||||
}
|
||||
|
||||
get_task_struct(tsk);
|
||||
rcu_read_unlock();
|
||||
|
||||
|
|
Loading…
Reference in New Issue