summaryrefslogtreecommitdiffstats
path: root/include/linux/cgroup.h
diff options
context:
space:
mode:
authorJason Gunthorpe2019-07-02 19:34:43 +0200
committerJason Gunthorpe2019-07-02 19:34:43 +0200
commit9ec3f4cb35bc8278f0582fed9f9229c9315c2ffb (patch)
tree3ff6a17a33913268a2ed06e7d9a1a95e29eeee97 /include/linux/cgroup.h
parentmm/swap: fix release_pages() when releasing devmap pages (diff)
parentLinux 5.2-rc7 (diff)
downloadkernel-qcow2-linux-9ec3f4cb35bc8278f0582fed9f9229c9315c2ffb.tar.gz
kernel-qcow2-linux-9ec3f4cb35bc8278f0582fed9f9229c9315c2ffb.tar.xz
kernel-qcow2-linux-9ec3f4cb35bc8278f0582fed9f9229c9315c2ffb.zip
Merge tag 'v5.2-rc7' into rdma.git hmm
Required for dependencies in the next patches.
Diffstat (limited to 'include/linux/cgroup.h')
-rw-r--r--include/linux/cgroup.h14
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();
}