]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - include/linux/cgroup.h
cgroup: implement cgroup_add_cftypes() and friends
[mirror_ubuntu-zesty-kernel.git] / include / linux / cgroup.h
index ad2a14680b7f69ed2e035ab205e88480ff95bd9b..af6211c7a42b610ab30b6e40b9f8d9660e949cd7 100644 (file)
@@ -192,6 +192,7 @@ struct cgroup {
        struct list_head css_sets;
 
        struct list_head allcg_node;    /* cgroupfs_root->allcg_list */
+       struct list_head cft_q_node;    /* used during cftype add/rm */
 
        /*
         * Linked list running through all cgroups that can
@@ -277,11 +278,17 @@ struct cgroup_map_cb {
  *     - the 'cftype' of the file is file->f_dentry->d_fsdata
  */
 
-#define MAX_CFTYPE_NAME 64
+/* cftype->flags */
+#define CFTYPE_ONLY_ON_ROOT    (1U << 0)       /* only create on root cg */
+#define CFTYPE_NOT_ON_ROOT     (1U << 1)       /* don't create onp root cg */
+
+#define MAX_CFTYPE_NAME                64
+
 struct cftype {
        /*
         * By convention, the name should begin with the name of the
-        * subsystem, followed by a period
+        * subsystem, followed by a period.  Zero length string indicates
+        * end of cftype array.
         */
        char name[MAX_CFTYPE_NAME];
        int private;
@@ -297,6 +304,9 @@ struct cftype {
         */
        size_t max_write_len;
 
+       /* CFTYPE_* flags */
+       unsigned int flags;
+
        int (*open)(struct inode *inode, struct file *file);
        ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft,
                        struct file *file,
@@ -375,6 +385,16 @@ struct cftype {
                        struct eventfd_ctx *eventfd);
 };
 
+/*
+ * cftype_sets describe cftypes belonging to a subsystem and are chained at
+ * cgroup_subsys->cftsets.  Each cftset points to an array of cftypes
+ * terminated by zero length name.
+ */
+struct cftype_set {
+       struct list_head                node;   /* chained at subsys->cftsets */
+       const struct cftype             *cfts;
+};
+
 struct cgroup_scanner {
        struct cgroup *cg;
        int (*test_task)(struct task_struct *p, struct cgroup_scanner *scan);
@@ -400,6 +420,8 @@ int cgroup_add_files(struct cgroup *cgrp,
                        const struct cftype cft[],
                        int count);
 
+int cgroup_add_cftypes(struct cgroup_subsys *ss, const struct cftype *cfts);
+
 int cgroup_is_removed(const struct cgroup *cgrp);
 
 int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
@@ -502,6 +524,13 @@ struct cgroup_subsys {
        struct idr idr;
        spinlock_t id_lock;
 
+       /* list of cftype_sets */
+       struct list_head cftsets;
+
+       /* base cftypes, automatically [de]registered with subsys itself */
+       struct cftype *base_cftypes;
+       struct cftype_set base_cftset;
+
        /* should be defined only by modular subsystems */
        struct module *module;
 };