Merge tag 'trace-v4.4-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[firefly-linux-kernel-4.4.55.git] / include / linux / cgroup-defs.h
index 8492721b39be8f0fffa793c5ef39f33d32b5c5fb..60d44b26276d84a77d7f7e3379ae12821a8b3eeb 100644 (file)
@@ -76,12 +76,24 @@ enum {
        CFTYPE_ONLY_ON_ROOT     = (1 << 0),     /* only create on root cgrp */
        CFTYPE_NOT_ON_ROOT      = (1 << 1),     /* don't create on root cgrp */
        CFTYPE_NO_PREFIX        = (1 << 3),     /* (DON'T USE FOR NEW FILES) no subsys prefix */
+       CFTYPE_WORLD_WRITABLE   = (1 << 4),     /* (DON'T USE FOR NEW FILES) S_IWUGO */
 
        /* internal flags, do not use outside cgroup core proper */
        __CFTYPE_ONLY_ON_DFL    = (1 << 16),    /* only on default hierarchy */
        __CFTYPE_NOT_ON_DFL     = (1 << 17),    /* not on default hierarchy */
 };
 
+/*
+ * cgroup_file is the handle for a file instance created in a cgroup which
+ * is used, for example, to generate file changed notifications.  This can
+ * be obtained by setting cftype->file_offset.
+ */
+struct cgroup_file {
+       /* do not access any fields from outside cgroup core */
+       struct list_head node;                  /* anchored at css->files */
+       struct kernfs_node *kn;
+};
+
 /*
  * Per-subsystem/per-cgroup state maintained by the system.  This is the
  * fundamental structural building block that controllers deal with.
@@ -122,6 +134,9 @@ struct cgroup_subsys_state {
         */
        u64 serial_nr;
 
+       /* all cgroup_files associated with this css */
+       struct list_head files;
+
        /* percpu_ref killing and RCU release */
        struct rcu_head rcu_head;
        struct work_struct destroy_work;
@@ -196,6 +211,9 @@ struct css_set {
         */
        struct list_head e_cset_node[CGROUP_SUBSYS_COUNT];
 
+       /* all css_task_iters currently walking this cset */
+       struct list_head task_iters;
+
        /* For RCU-protected deletion */
        struct rcu_head rcu_head;
 };
@@ -217,16 +235,16 @@ struct cgroup {
        int id;
 
        /*
-        * If this cgroup contains any tasks, it contributes one to
-        * populated_cnt.  All children with non-zero popuplated_cnt of
-        * their own contribute one.  The count is zero iff there's no task
-        * in this cgroup or its subtree.
+        * Each non-empty css_set associated with this cgroup contributes
+        * one to populated_cnt.  All children with non-zero popuplated_cnt
+        * of their own contribute one.  The count is zero iff there's no
+        * task in this cgroup or its subtree.
         */
        int populated_cnt;
 
        struct kernfs_node *kn;         /* cgroup kernfs entry */
-       struct kernfs_node *procs_kn;   /* kn for "cgroup.procs" */
-       struct kernfs_node *populated_kn; /* kn for "cgroup.subtree_populated" */
+       struct cgroup_file procs_file;  /* handle for "cgroup.procs" */
+       struct cgroup_file events_file; /* handle for "cgroup.events" */
 
        /*
         * The bitmask of subsystems enabled on the child cgroups.
@@ -324,11 +342,6 @@ struct cftype {
         */
        char name[MAX_CFTYPE_NAME];
        unsigned long private;
-       /*
-        * If not 0, file mode is set to this value, otherwise it will
-        * be figured out automatically
-        */
-       umode_t mode;
 
        /*
         * The maximum length of string, excluding trailing nul, that can
@@ -339,6 +352,14 @@ struct cftype {
        /* CFTYPE_* flags */
        unsigned int flags;
 
+       /*
+        * If non-zero, should contain the offset from the start of css to
+        * a struct cgroup_file field.  cgroup will record the handle of
+        * the created file into it.  The recorded handle can be used as
+        * long as the containing css remains accessible.
+        */
+       unsigned int file_offset;
+
        /*
         * Fields used for internal bookkeeping.  Initialized automatically
         * during registration.
@@ -414,12 +435,10 @@ struct cgroup_subsys {
        int (*can_fork)(struct task_struct *task, void **priv_p);
        void (*cancel_fork)(struct task_struct *task, void *priv);
        void (*fork)(struct task_struct *task, void *priv);
-       void (*exit)(struct cgroup_subsys_state *css,
-                    struct cgroup_subsys_state *old_css,
-                    struct task_struct *task);
+       void (*exit)(struct task_struct *task);
+       void (*free)(struct task_struct *task);
        void (*bind)(struct cgroup_subsys_state *root_css);
 
-       int disabled;
        int early_init;
 
        /*
@@ -473,8 +492,31 @@ struct cgroup_subsys {
        unsigned int depends_on;
 };
 
-void cgroup_threadgroup_change_begin(struct task_struct *tsk);
-void cgroup_threadgroup_change_end(struct task_struct *tsk);
+extern struct percpu_rw_semaphore cgroup_threadgroup_rwsem;
+
+/**
+ * cgroup_threadgroup_change_begin - threadgroup exclusion for cgroups
+ * @tsk: target task
+ *
+ * Called from threadgroup_change_begin() and allows cgroup operations to
+ * synchronize against threadgroup changes using a percpu_rw_semaphore.
+ */
+static inline void cgroup_threadgroup_change_begin(struct task_struct *tsk)
+{
+       percpu_down_read(&cgroup_threadgroup_rwsem);
+}
+
+/**
+ * cgroup_threadgroup_change_end - threadgroup exclusion for cgroups
+ * @tsk: target task
+ *
+ * Called from threadgroup_change_end().  Counterpart of
+ * cgroup_threadcgroup_change_begin().
+ */
+static inline void cgroup_threadgroup_change_end(struct task_struct *tsk)
+{
+       percpu_up_read(&cgroup_threadgroup_rwsem);
+}
 
 #else  /* CONFIG_CGROUPS */