Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12a9d2fe authored by Tejun Heo's avatar Tejun Heo
Browse files

cgroup: implement cgroup_rightmost_descendant()



Implement cgroup_rightmost_descendant() which returns the right most
descendant of the specified cgroup.  This can be used to skip the
cgroup's subtree while iterating with
cgroup_for_each_descendant_pre().

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
parent d5b1fe68
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -558,6 +558,7 @@ static inline struct cgroup* task_cgroup(struct task_struct *task,


struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,
struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,
					  struct cgroup *cgroup);
					  struct cgroup *cgroup);
struct cgroup *cgroup_rightmost_descendant(struct cgroup *pos);


/**
/**
 * cgroup_for_each_descendant_pre - pre-order walk of a cgroup's descendants
 * cgroup_for_each_descendant_pre - pre-order walk of a cgroup's descendants
+26 −0
Original line number Original line Diff line number Diff line
@@ -3017,6 +3017,32 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,
}
}
EXPORT_SYMBOL_GPL(cgroup_next_descendant_pre);
EXPORT_SYMBOL_GPL(cgroup_next_descendant_pre);


/**
 * cgroup_rightmost_descendant - return the rightmost descendant of a cgroup
 * @pos: cgroup of interest
 *
 * Return the rightmost descendant of @pos.  If there's no descendant,
 * @pos is returned.  This can be used during pre-order traversal to skip
 * subtree of @pos.
 */
struct cgroup *cgroup_rightmost_descendant(struct cgroup *pos)
{
	struct cgroup *last, *tmp;

	WARN_ON_ONCE(!rcu_read_lock_held());

	do {
		last = pos;
		/* ->prev isn't RCU safe, walk ->next till the end */
		pos = NULL;
		list_for_each_entry_rcu(tmp, &last->children, sibling)
			pos = tmp;
	} while (pos);

	return last;
}
EXPORT_SYMBOL_GPL(cgroup_rightmost_descendant);

static struct cgroup *cgroup_leftmost_descendant(struct cgroup *pos)
static struct cgroup *cgroup_leftmost_descendant(struct cgroup *pos)
{
{
	struct cgroup *last;
	struct cgroup *last;