|
@@ -3183,6 +3183,16 @@ static int cgroup_enable_threaded(struct cgroup *cgrp)
|
|
if (cgroup_is_threaded(cgrp))
|
|
if (cgroup_is_threaded(cgrp))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * If @cgroup is populated or has domain controllers enabled, it
|
|
|
|
+ * can't be switched. While the below cgroup_can_be_thread_root()
|
|
|
|
+ * test can catch the same conditions, that's only when @parent is
|
|
|
|
+ * not mixable, so let's check it explicitly.
|
|
|
|
+ */
|
|
|
|
+ if (cgroup_is_populated(cgrp) ||
|
|
|
|
+ cgrp->subtree_control & ~cgrp_dfl_threaded_ss_mask)
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+
|
|
/* we're joining the parent's domain, ensure its validity */
|
|
/* we're joining the parent's domain, ensure its validity */
|
|
if (!cgroup_is_valid_domain(dom_cgrp) ||
|
|
if (!cgroup_is_valid_domain(dom_cgrp) ||
|
|
!cgroup_can_be_thread_root(dom_cgrp))
|
|
!cgroup_can_be_thread_root(dom_cgrp))
|