aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-04-14 23:15:26 -0400
committerTejun Heo <tj@kernel.org>2013-04-14 23:15:26 -0400
commit873fe09ea5df6ccf6bb34811d8c9992aacb67598 (patch)
treeef8d3afc31460ed9fdfd16e70e4c0916d42bcbd6 /include
parent25a7e6848db76e22677aff202d9c4ef3503be15b (diff)
cgroup: introduce sane_behavior mount option
It's a sad fact that at this point various cgroup controllers are carrying so many idiosyncrasies and pure insanities that it simply isn't possible to reach any sort of sane consistent behavior while maintaining staying fully compatible with what already has been exposed to userland. As we can't break exposed userland interface, transitioning to sane behaviors can only be done in steps while maintaining backwards compatibility. This patch introduces a new mount option - __DEVEL__sane_behavior - which disables crazy features and enforces consistent behaviors in cgroup core proper and various controllers. As exactly which behaviors it changes are still being determined, the mount option, at this point, is useful only for development of the new behaviors. As such, the mount option is prefixed with __DEVEL__ and generates a warning message when used. Eventually, once we get to the point where all controller's behaviors are consistent enough to implement unified hierarchy, the __DEVEL__ prefix will be dropped, and more importantly, unified-hierarchy will enforce sane_behavior by default. Maybe we'll able to completely drop the crazy stuff after a while, maybe not, but we at least have a strategy to move on to saner behaviors. This patch introduces the mount option and changes the following behaviors in cgroup core. * Mount options "noprefix" and "clone_children" are disallowed. Also, cgroupfs file cgroup.clone_children is not created. * When mounting an existing superblock, mount options should match. This is currently pretty crazy. If one mounts a cgroup, creates a subdirectory, unmounts it and then mount it again with different option, it looks like the new options are applied but they aren't. * Remount is disallowed. The behaviors changes are documented in the comment above CGRP_ROOT_SANE_BEHAVIOR enum and will be expanded as different controllers are converted and planned improvements progress. v2: Dropped unnecessary explicit file permission setting sane_behavior cftype entry as suggested by Li Zefan. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com> Acked-by: Li Zefan <lizefan@huawei.com> Cc: Michal Hocko <mhocko@suse.cz> Cc: Vivek Goyal <vgoyal@redhat.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/cgroup.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index b21881e1ea08..9c300ad9a911 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -156,6 +156,8 @@ enum {
156 * specified at mount time and thus is implemented here. 156 * specified at mount time and thus is implemented here.
157 */ 157 */
158 CGRP_CPUSET_CLONE_CHILDREN, 158 CGRP_CPUSET_CLONE_CHILDREN,
159 /* see the comment above CGRP_ROOT_SANE_BEHAVIOR for details */
160 CGRP_SANE_BEHAVIOR,
159}; 161};
160 162
161struct cgroup_name { 163struct cgroup_name {
@@ -243,6 +245,37 @@ struct cgroup {
243 245
244/* cgroupfs_root->flags */ 246/* cgroupfs_root->flags */
245enum { 247enum {
248 /*
249 * Unfortunately, cgroup core and various controllers are riddled
250 * with idiosyncrasies and pointless options. The following flag,
251 * when set, will force sane behavior - some options are forced on,
252 * others are disallowed, and some controllers will change their
253 * hierarchical or other behaviors.
254 *
255 * The set of behaviors affected by this flag are still being
256 * determined and developed and the mount option for this flag is
257 * prefixed with __DEVEL__. The prefix will be dropped once we
258 * reach the point where all behaviors are compatible with the
259 * planned unified hierarchy, which will automatically turn on this
260 * flag.
261 *
262 * The followings are the behaviors currently affected this flag.
263 *
264 * - Mount options "noprefix" and "clone_children" are disallowed.
265 * Also, cgroupfs file cgroup.clone_children is not created.
266 *
267 * - When mounting an existing superblock, mount options should
268 * match.
269 *
270 * - Remount is disallowed.
271 *
272 * The followings are planned changes.
273 *
274 * - release_agent will be disallowed once replacement notification
275 * mechanism is implemented.
276 */
277 CGRP_ROOT_SANE_BEHAVIOR = (1 << 0),
278
246 CGRP_ROOT_NOPREFIX = (1 << 1), /* mounted subsystems have no named prefix */ 279 CGRP_ROOT_NOPREFIX = (1 << 1), /* mounted subsystems have no named prefix */
247 CGRP_ROOT_XATTR = (1 << 2), /* supports extended attributes */ 280 CGRP_ROOT_XATTR = (1 << 2), /* supports extended attributes */
248}; 281};
@@ -360,6 +393,7 @@ struct cgroup_map_cb {
360/* cftype->flags */ 393/* cftype->flags */
361#define CFTYPE_ONLY_ON_ROOT (1U << 0) /* only create on root cg */ 394#define CFTYPE_ONLY_ON_ROOT (1U << 0) /* only create on root cg */
362#define CFTYPE_NOT_ON_ROOT (1U << 1) /* don't create on root cg */ 395#define CFTYPE_NOT_ON_ROOT (1U << 1) /* don't create on root cg */
396#define CFTYPE_INSANE (1U << 2) /* don't create if sane_behavior */
363 397
364#define MAX_CFTYPE_NAME 64 398#define MAX_CFTYPE_NAME 64
365 399
@@ -486,6 +520,15 @@ struct cgroup_scanner {
486 void *data; 520 void *data;
487}; 521};
488 522
523/*
524 * See the comment above CGRP_ROOT_SANE_BEHAVIOR for details. This
525 * function can be called as long as @cgrp is accessible.
526 */
527static inline bool cgroup_sane_behavior(const struct cgroup *cgrp)
528{
529 return cgrp->root->flags & CGRP_ROOT_SANE_BEHAVIOR;
530}
531
489/* Caller should hold rcu_read_lock() */ 532/* Caller should hold rcu_read_lock() */
490static inline const char *cgroup_name(const struct cgroup *cgrp) 533static inline const char *cgroup_name(const struct cgroup *cgrp)
491{ 534{