diff options
| author | Mark Brown <broonie@kernel.org> | 2019-06-26 12:39:34 +0100 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2019-06-26 12:39:34 +0100 |
| commit | 53c8b29abe42e5601cfa0ea5962532f0cfdec8a0 (patch) | |
| tree | cad53f42ce7a03c39a984bcdbcc42cd47f1af6f9 /include/linux/cgroup.h | |
| parent | e3303268f9cfa4eb7c2217df471417d4327109fd (diff) | |
| parent | 4b972a01a7da614b4796475f933094751a295a2f (diff) | |
Merge tag 'v5.2-rc6' into asoc-5.3
Linux 5.2-rc6
Diffstat (limited to 'include/linux/cgroup.h')
| -rw-r--r-- | include/linux/cgroup.h | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index c0077adeea83..0297f930a56e 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -43,6 +43,9 @@ /* walk all threaded css_sets in the domain */ #define CSS_TASK_ITER_THREADED (1U << 1) +/* internal flags */ +#define CSS_TASK_ITER_SKIPPED (1U << 16) + /* a css_task_iter should be treated as an opaque object */ struct css_task_iter { struct cgroup_subsys *ss; @@ -57,6 +60,7 @@ struct css_task_iter { struct list_head *task_pos; struct list_head *tasks_head; struct list_head *mg_tasks_head; + struct list_head *dying_tasks_head; struct css_set *cur_cset; struct css_set *cur_dcset; @@ -487,7 +491,7 @@ static inline struct cgroup_subsys_state *task_css(struct task_struct *task, * * Find the css for the (@task, @subsys_id) combination, increment a * reference on and return it. This function is guaranteed to return a - * valid css. + * valid css. The returned css may already have been offlined. */ static inline struct cgroup_subsys_state * task_get_css(struct task_struct *task, int subsys_id) @@ -497,7 +501,13 @@ task_get_css(struct task_struct *task, int subsys_id) rcu_read_lock(); while (true) { css = task_css(task, subsys_id); - if (likely(css_tryget_online(css))) + /* + * Can't use css_tryget_online() here. A task which has + * PF_EXITING set may stay associated with an offline css. + * If such task calls this function, css_tryget_online() + * will keep failing. + */ + if (likely(css_tryget(css))) break; cpu_relax(); } |
