cgroup: implement cgroup_get_e_css()
Implement cgroup_get_e_css() which finds and gets the effective css for the specified cgroup and subsystem combination. This function always returns a valid pinned css. This will be used by cgroup writeback support. While at it, add comment to cgroup_e_css() to explain why that function is different from cgroup_get_e_css() and has to test cgrp->child_subsys_mask instead of cgroup_css(cgrp, ss). Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Zefan Li <lizefan@huawei.com>
This commit is contained in:
parent
56c807ba4e
commit
eeecbd1971
2 changed files with 39 additions and 0 deletions
|
@ -910,6 +910,8 @@ void css_task_iter_end(struct css_task_iter *it);
|
|||
int cgroup_attach_task_all(struct task_struct *from, struct task_struct *);
|
||||
int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from);
|
||||
|
||||
struct cgroup_subsys_state *cgroup_get_e_css(struct cgroup *cgroup,
|
||||
struct cgroup_subsys *ss);
|
||||
struct cgroup_subsys_state *css_tryget_online_from_dir(struct dentry *dentry,
|
||||
struct cgroup_subsys *ss);
|
||||
|
||||
|
|
|
@ -277,6 +277,10 @@ static struct cgroup_subsys_state *cgroup_e_css(struct cgroup *cgrp,
|
|||
if (!(cgrp->root->subsys_mask & (1 << ss->id)))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* This function is used while updating css associations and thus
|
||||
* can't test the csses directly. Use ->child_subsys_mask.
|
||||
*/
|
||||
while (cgroup_parent(cgrp) &&
|
||||
!(cgroup_parent(cgrp)->child_subsys_mask & (1 << ss->id)))
|
||||
cgrp = cgroup_parent(cgrp);
|
||||
|
@ -284,6 +288,39 @@ static struct cgroup_subsys_state *cgroup_e_css(struct cgroup *cgrp,
|
|||
return cgroup_css(cgrp, ss);
|
||||
}
|
||||
|
||||
/**
|
||||
* cgroup_get_e_css - get a cgroup's effective css for the specified subsystem
|
||||
* @cgrp: the cgroup of interest
|
||||
* @ss: the subsystem of interest
|
||||
*
|
||||
* Find and get the effective css of @cgrp for @ss. The effective css is
|
||||
* defined as the matching css of the nearest ancestor including self which
|
||||
* has @ss enabled. If @ss is not mounted on the hierarchy @cgrp is on,
|
||||
* the root css is returned, so this function always returns a valid css.
|
||||
* The returned css must be put using css_put().
|
||||
*/
|
||||
struct cgroup_subsys_state *cgroup_get_e_css(struct cgroup *cgrp,
|
||||
struct cgroup_subsys *ss)
|
||||
{
|
||||
struct cgroup_subsys_state *css;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
do {
|
||||
css = cgroup_css(cgrp, ss);
|
||||
|
||||
if (css && css_tryget_online(css))
|
||||
goto out_unlock;
|
||||
cgrp = cgroup_parent(cgrp);
|
||||
} while (cgrp);
|
||||
|
||||
css = init_css_set.subsys[ss->id];
|
||||
css_get(css);
|
||||
out_unlock:
|
||||
rcu_read_unlock();
|
||||
return css;
|
||||
}
|
||||
|
||||
/* convenient tests for these bits */
|
||||
static inline bool cgroup_is_dead(const struct cgroup *cgrp)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue