cgroup: introduce task_css_is_root()
Determining the css of a task usually requires RCU read lock as that's
the only thing which keeps the returned css accessible till its
reference is acquired; however, testing whether a task belongs to the
root can be performed without dereferencing the returned css by
comparing the returned pointer against the root one in init_css_set[]
which never changes.
Implement task_css_is_root() which can be invoked in any context.
This will be used by the scheduled cgroup_freezer change.
v2: cgroup no longer supports modular controllers. No need to export
init_css_set. Pointed out by Li.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
This commit is contained in:
parent
36c38fb714
commit
5024ae29cd
2 changed files with 16 additions and 1 deletions
|
|
@ -473,6 +473,7 @@ struct cftype {
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct cgroup_root cgrp_dfl_root;
|
extern struct cgroup_root cgrp_dfl_root;
|
||||||
|
extern struct css_set init_css_set;
|
||||||
|
|
||||||
static inline bool cgroup_on_dfl(const struct cgroup *cgrp)
|
static inline bool cgroup_on_dfl(const struct cgroup *cgrp)
|
||||||
{
|
{
|
||||||
|
|
@ -700,6 +701,20 @@ static inline struct cgroup_subsys_state *task_css(struct task_struct *task,
|
||||||
return task_css_check(task, subsys_id, false);
|
return task_css_check(task, subsys_id, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task_css_is_root - test whether a task belongs to the root css
|
||||||
|
* @task: the target task
|
||||||
|
* @subsys_id: the target subsystem ID
|
||||||
|
*
|
||||||
|
* Test whether @task belongs to the root css on the specified subsystem.
|
||||||
|
* May be invoked in any context.
|
||||||
|
*/
|
||||||
|
static inline bool task_css_is_root(struct task_struct *task, int subsys_id)
|
||||||
|
{
|
||||||
|
return task_css_check(task, subsys_id, true) ==
|
||||||
|
init_css_set.subsys[subsys_id];
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct cgroup *task_cgroup(struct task_struct *task,
|
static inline struct cgroup *task_cgroup(struct task_struct *task,
|
||||||
int subsys_id)
|
int subsys_id)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -348,7 +348,7 @@ struct cgrp_cset_link {
|
||||||
* reference-counted, to improve performance when child cgroups
|
* reference-counted, to improve performance when child cgroups
|
||||||
* haven't been created.
|
* haven't been created.
|
||||||
*/
|
*/
|
||||||
static struct css_set init_css_set = {
|
struct css_set init_css_set = {
|
||||||
.refcount = ATOMIC_INIT(1),
|
.refcount = ATOMIC_INIT(1),
|
||||||
.cgrp_links = LIST_HEAD_INIT(init_css_set.cgrp_links),
|
.cgrp_links = LIST_HEAD_INIT(init_css_set.cgrp_links),
|
||||||
.tasks = LIST_HEAD_INIT(init_css_set.tasks),
|
.tasks = LIST_HEAD_INIT(init_css_set.tasks),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue