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