|
@@ -232,11 +232,33 @@ void css_task_iter_end(struct css_task_iter *it);
|
|
|
* cgroup_taskset_for_each - iterate cgroup_taskset
|
|
|
* @task: the loop cursor
|
|
|
* @tset: taskset to iterate
|
|
|
+ *
|
|
|
+ * @tset may contain multiple tasks and they may belong to multiple
|
|
|
+ * processes. When there are multiple tasks in @tset, if a task of a
|
|
|
+ * process is in @tset, all tasks of the process are in @tset. Also, all
|
|
|
+ * are guaranteed to share the same source and destination csses.
|
|
|
+ *
|
|
|
+ * Iteration is not in any specific order.
|
|
|
*/
|
|
|
#define cgroup_taskset_for_each(task, tset) \
|
|
|
for ((task) = cgroup_taskset_first((tset)); (task); \
|
|
|
(task) = cgroup_taskset_next((tset)))
|
|
|
|
|
|
+/**
|
|
|
+ * cgroup_taskset_for_each_leader - iterate group leaders in a cgroup_taskset
|
|
|
+ * @leader: the loop cursor
|
|
|
+ * @tset: takset to iterate
|
|
|
+ *
|
|
|
+ * Iterate threadgroup leaders of @tset. For single-task migrations, @tset
|
|
|
+ * may not contain any.
|
|
|
+ */
|
|
|
+#define cgroup_taskset_for_each_leader(leader, tset) \
|
|
|
+ for ((leader) = cgroup_taskset_first((tset)); (leader); \
|
|
|
+ (leader) = cgroup_taskset_next((tset))) \
|
|
|
+ if ((leader) != (leader)->group_leader) \
|
|
|
+ ; \
|
|
|
+ else
|
|
|
+
|
|
|
/*
|
|
|
* Inline functions.
|
|
|
*/
|