diff options
Diffstat (limited to 'include/linux/cgroup.h')
-rw-r--r-- | include/linux/cgroup.h | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 22e3754f89c5..cb91b44f5f78 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
@@ -88,6 +88,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from); | |||
88 | int cgroup_add_dfl_cftypes(struct cgroup_subsys *ss, struct cftype *cfts); | 88 | int cgroup_add_dfl_cftypes(struct cgroup_subsys *ss, struct cftype *cfts); |
89 | int cgroup_add_legacy_cftypes(struct cgroup_subsys *ss, struct cftype *cfts); | 89 | int cgroup_add_legacy_cftypes(struct cgroup_subsys *ss, struct cftype *cfts); |
90 | int cgroup_rm_cftypes(struct cftype *cfts); | 90 | int cgroup_rm_cftypes(struct cftype *cfts); |
91 | void cgroup_file_notify(struct cgroup_file *cfile); | ||
91 | 92 | ||
92 | char *task_cgroup_path(struct task_struct *task, char *buf, size_t buflen); | 93 | char *task_cgroup_path(struct task_struct *task, char *buf, size_t buflen); |
93 | int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry); | 94 | int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry); |
@@ -119,8 +120,10 @@ struct cgroup_subsys_state *css_rightmost_descendant(struct cgroup_subsys_state | |||
119 | struct cgroup_subsys_state *css_next_descendant_post(struct cgroup_subsys_state *pos, | 120 | struct cgroup_subsys_state *css_next_descendant_post(struct cgroup_subsys_state *pos, |
120 | struct cgroup_subsys_state *css); | 121 | struct cgroup_subsys_state *css); |
121 | 122 | ||
122 | struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset); | 123 | struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset, |
123 | struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset); | 124 | struct cgroup_subsys_state **dst_cssp); |
125 | struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset, | ||
126 | struct cgroup_subsys_state **dst_cssp); | ||
124 | 127 | ||
125 | void css_task_iter_start(struct cgroup_subsys_state *css, | 128 | void css_task_iter_start(struct cgroup_subsys_state *css, |
126 | struct css_task_iter *it); | 129 | struct css_task_iter *it); |
@@ -235,30 +238,39 @@ void css_task_iter_end(struct css_task_iter *it); | |||
235 | /** | 238 | /** |
236 | * cgroup_taskset_for_each - iterate cgroup_taskset | 239 | * cgroup_taskset_for_each - iterate cgroup_taskset |
237 | * @task: the loop cursor | 240 | * @task: the loop cursor |
241 | * @dst_css: the destination css | ||
238 | * @tset: taskset to iterate | 242 | * @tset: taskset to iterate |
239 | * | 243 | * |
240 | * @tset may contain multiple tasks and they may belong to multiple | 244 | * @tset may contain multiple tasks and they may belong to multiple |
241 | * processes. When there are multiple tasks in @tset, if a task of a | 245 | * processes. |
242 | * process is in @tset, all tasks of the process are in @tset. Also, all | 246 | * |
243 | * are guaranteed to share the same source and destination csses. | 247 | * On the v2 hierarchy, there may be tasks from multiple processes and they |
248 | * may not share the source or destination csses. | ||
249 | * | ||
250 | * On traditional hierarchies, when there are multiple tasks in @tset, if a | ||
251 | * task of a process is in @tset, all tasks of the process are in @tset. | ||
252 | * Also, all are guaranteed to share the same source and destination csses. | ||
244 | * | 253 | * |
245 | * Iteration is not in any specific order. | 254 | * Iteration is not in any specific order. |
246 | */ | 255 | */ |
247 | #define cgroup_taskset_for_each(task, tset) \ | 256 | #define cgroup_taskset_for_each(task, dst_css, tset) \ |
248 | for ((task) = cgroup_taskset_first((tset)); (task); \ | 257 | for ((task) = cgroup_taskset_first((tset), &(dst_css)); \ |
249 | (task) = cgroup_taskset_next((tset))) | 258 | (task); \ |
259 | (task) = cgroup_taskset_next((tset), &(dst_css))) | ||
250 | 260 | ||
251 | /** | 261 | /** |
252 | * cgroup_taskset_for_each_leader - iterate group leaders in a cgroup_taskset | 262 | * cgroup_taskset_for_each_leader - iterate group leaders in a cgroup_taskset |
253 | * @leader: the loop cursor | 263 | * @leader: the loop cursor |
264 | * @dst_css: the destination css | ||
254 | * @tset: takset to iterate | 265 | * @tset: takset to iterate |
255 | * | 266 | * |
256 | * Iterate threadgroup leaders of @tset. For single-task migrations, @tset | 267 | * Iterate threadgroup leaders of @tset. For single-task migrations, @tset |
257 | * may not contain any. | 268 | * may not contain any. |
258 | */ | 269 | */ |
259 | #define cgroup_taskset_for_each_leader(leader, tset) \ | 270 | #define cgroup_taskset_for_each_leader(leader, dst_css, tset) \ |
260 | for ((leader) = cgroup_taskset_first((tset)); (leader); \ | 271 | for ((leader) = cgroup_taskset_first((tset), &(dst_css)); \ |
261 | (leader) = cgroup_taskset_next((tset))) \ | 272 | (leader); \ |
273 | (leader) = cgroup_taskset_next((tset), &(dst_css))) \ | ||
262 | if ((leader) != (leader)->group_leader) \ | 274 | if ((leader) != (leader)->group_leader) \ |
263 | ; \ | 275 | ; \ |
264 | else | 276 | else |
@@ -516,19 +528,6 @@ static inline void pr_cont_cgroup_path(struct cgroup *cgrp) | |||
516 | pr_cont_kernfs_path(cgrp->kn); | 528 | pr_cont_kernfs_path(cgrp->kn); |
517 | } | 529 | } |
518 | 530 | ||
519 | /** | ||
520 | * cgroup_file_notify - generate a file modified event for a cgroup_file | ||
521 | * @cfile: target cgroup_file | ||
522 | * | ||
523 | * @cfile must have been obtained by setting cftype->file_offset. | ||
524 | */ | ||
525 | static inline void cgroup_file_notify(struct cgroup_file *cfile) | ||
526 | { | ||
527 | /* might not have been created due to one of the CFTYPE selector flags */ | ||
528 | if (cfile->kn) | ||
529 | kernfs_notify(cfile->kn); | ||
530 | } | ||
531 | |||
532 | #else /* !CONFIG_CGROUPS */ | 531 | #else /* !CONFIG_CGROUPS */ |
533 | 532 | ||
534 | struct cgroup_subsys_state; | 533 | struct cgroup_subsys_state; |