]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/cgroup.h
Merge branch 'for-4.14/block' of git://git.kernel.dk/linux-block
[linux.git] / include / linux / cgroup.h
index 6144fe923b73b5d29285a1c74a5c42fd0912d32d..d023ac5e377f4bd21b0a6fdc5ae33a100990e32f 100644 (file)
 #define CGROUP_WEIGHT_DFL              100
 #define CGROUP_WEIGHT_MAX              10000
 
+/* walk only threadgroup leaders */
+#define CSS_TASK_ITER_PROCS            (1U << 0)
+/* walk all threaded css_sets in the domain */
+#define CSS_TASK_ITER_THREADED         (1U << 1)
+
 /* a css_task_iter should be treated as an opaque object */
 struct css_task_iter {
        struct cgroup_subsys            *ss;
+       unsigned int                    flags;
 
        struct list_head                *cset_pos;
        struct list_head                *cset_head;
 
+       struct list_head                *tcset_pos;
+       struct list_head                *tcset_head;
+
        struct list_head                *task_pos;
        struct list_head                *tasks_head;
        struct list_head                *mg_tasks_head;
 
        struct css_set                  *cur_cset;
+       struct css_set                  *cur_dcset;
        struct task_struct              *cur_task;
        struct list_head                iters_node;     /* css_set->task_iters */
 };
@@ -129,7 +139,7 @@ struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset,
 struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset,
                                        struct cgroup_subsys_state **dst_cssp);
 
-void css_task_iter_start(struct cgroup_subsys_state *css,
+void css_task_iter_start(struct cgroup_subsys_state *css, unsigned int flags,
                         struct css_task_iter *it);
 struct task_struct *css_task_iter_next(struct css_task_iter *it);
 void css_task_iter_end(struct css_task_iter *it);
@@ -388,6 +398,16 @@ static inline void css_put_many(struct cgroup_subsys_state *css, unsigned int n)
                percpu_ref_put_many(&css->refcnt, n);
 }
 
+static inline void cgroup_get(struct cgroup *cgrp)
+{
+       css_get(&cgrp->self);
+}
+
+static inline bool cgroup_tryget(struct cgroup *cgrp)
+{
+       return css_tryget(&cgrp->self);
+}
+
 static inline void cgroup_put(struct cgroup *cgrp)
 {
        css_put(&cgrp->self);
@@ -500,6 +520,20 @@ static inline struct cgroup *task_cgroup(struct task_struct *task,
        return task_css(task, subsys_id)->cgroup;
 }
 
+static inline struct cgroup *task_dfl_cgroup(struct task_struct *task)
+{
+       return task_css_set(task)->dfl_cgrp;
+}
+
+static inline struct cgroup *cgroup_parent(struct cgroup *cgrp)
+{
+       struct cgroup_subsys_state *parent_css = cgrp->self.parent;
+
+       if (parent_css)
+               return container_of(parent_css, struct cgroup, self);
+       return NULL;
+}
+
 /**
  * cgroup_is_descendant - test ancestry
  * @cgrp: the cgroup to be tested
@@ -537,7 +571,8 @@ static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
 /* no synchronization, the result can only be used as a hint */
 static inline bool cgroup_is_populated(struct cgroup *cgrp)
 {
-       return cgrp->populated_cnt;
+       return cgrp->nr_populated_csets + cgrp->nr_populated_domain_children +
+               cgrp->nr_populated_threaded_children;
 }
 
 /* returns ino associated with a cgroup */