mirror of
https://github.com/torvalds/linux.git
synced 2024-10-23 21:50:43 +00:00
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
|
@ -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_attach_task_all(struct task_struct *from, struct task_struct *);
|
||||||
int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from);
|
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_state *css_tryget_online_from_dir(struct dentry *dentry,
|
||||||
struct cgroup_subsys *ss);
|
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)))
|
if (!(cgrp->root->subsys_mask & (1 << ss->id)))
|
||||||
return NULL;
|
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) &&
|
while (cgroup_parent(cgrp) &&
|
||||||
!(cgroup_parent(cgrp)->child_subsys_mask & (1 << ss->id)))
|
!(cgroup_parent(cgrp)->child_subsys_mask & (1 << ss->id)))
|
||||||
cgrp = cgroup_parent(cgrp);
|
cgrp = cgroup_parent(cgrp);
|
||||||
|
@ -284,6 +288,39 @@ static struct cgroup_subsys_state *cgroup_e_css(struct cgroup *cgrp,
|
||||||
return cgroup_css(cgrp, ss);
|
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 */
|
/* convenient tests for these bits */
|
||||||
static inline bool cgroup_is_dead(const struct cgroup *cgrp)
|
static inline bool cgroup_is_dead(const struct cgroup *cgrp)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user