cgroup: simplify init_subsys()
PATCH 2/3 cgroup: simplify init_subsys()
We are at system boot and there is only 1 cgroup group (i,e, init_css_set), so we don't need to run through the css_set linked list. Neither do we need to run through the task list, since the init process hasn't been created yet.
Also referring to a comment in cgroup.h:
struct css_set
{
...
/*
* Set of subsystem states, one for each subsystem. This array
* is immutable after creation apart from the init_css_set
* during subsystem registration (at boot time).
*/
struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
}--- kernel/cgroup.c | 30 ++++-------------------------- 1 files changed, 4 insertions(+), 26 deletions(-)
kernel/cgroup.c +4 -26
@@ -2467,7 +2467,6 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry)static void __init cgroup_init_subsys (struct cgroup_subsys *ss) {struct cgroup_subsys_state *css; -struct list_head *l;printk (KERN_INFO "Initializing cgroup subsys %s\n" , ss->name);
@@ -2478,32 +2477,11 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss)BUG_ON (IS_ERR (css));init_cgroup_css (css, ss, dummytop); -/* Update all cgroup groups to contain a subsys +/* Update the init_css_set to contain a subsys * pointer to this state - since the subsystem is -* newly registered, all tasks and hence all cgroup -* groups are in the subsystem's top cgroup. */ -write_lock (&css_set_lock); - l = &init_css_set.list; -do { -struct css_set *cg = - list_entry(l, struct css_set, list); - cg->subsys[ss->subsys_id] = dummytop->subsys[ss->subsys_id]; - l = l->next; - }while (l != &init_css_set.list); -write_unlock (&css_set_lock); - -/* If this subsystem requested that it be notified with fork -* events, we should send it one now for every process in the -* system */ -if (ss->fork) { -struct task_struct *g, *p; - -read_lock (&tasklist_lock); - do_each_thread(g, p) { - ss->fork (ss, p); - }while_each_thread (g, p); -read_unlock (&tasklist_lock); - } +* newly registered, all tasks and hence the +* init_css_set is in the subsystem's top cgroup. */ + init_css_set.subsys[ss->subsys_id] = dummytop->subsys[ss->subsys_id]; need_forkexit_callback |= ss->fork || ss->exit;
Signature · 1 line
1.5.4.rc3
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 5 lines · Li Zefan
-
- /* If this subsystem requested that it be notified with fork
- * events, we should send it one now for every process in the
- * system */
- if (ss->fork) {
Quoted 8 lines
- struct
task_struct*g, *p;
-
-read_lock(&tasklist_lock);
-do_each_thread(g, p){
-ss->fork(ss, p);
- }while_each_thread(g, p);
-read_unlock(&tasklist_lock);
- }
Should we maybe call ss->fork(ss, &init_task) ? Or just document that ss->fork() explicitly doesn't get called for init.
Maybe also add some BUG()s to confirm that no other tasks have in fact been forked by this point?
Paul
Quoted 5 lines · Li Zefan
-
- /* If this subsystem requested that it be notified with fork
- * events, we should send it one now for every process in the
- * system */
- if (ss->fork) {
Quoted 8 lines
- struct
task_struct*g, *p;
-
-read_lock(&tasklist_lock);
-do_each_thread(g, p){
-ss->fork(ss, p);
- }while_each_thread(g, p);
-read_unlock(&tasklist_lock);
- }
Should we maybe call ss->fork(ss, &init_task) ? Or just document that ss->fork() explicitly doesn't get called for init.
Maybe also add some BUG()s to confirm that no other tasks have in fact been forked by this point?
Paul
A message that is not in the archive (sent off-list or not yet received): 6599ad830804020326o7947e3e5k25249e6b1c00e6b5-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Quoted 15 lines · Paul Menage
Quoted 5 lines · Li Zefan
-
- /* If this subsystem requested that it be notified with fork
- * events, we should send it one now for every process in the
- * system */
- if (ss->fork) {Quoted 8 lines
- struct
task_struct*g, *p;
-
-read_lock(&tasklist_lock);
-do_each_thread(g, p){
-ss->fork(ss, p);
- }while_each_thread(g, p);
-read_unlock(&tasklist_lock);
- }
Quoted 6 lines
Should we maybe call
ss->fork(ss, &init_task)? Or just document thatss->fork()explicitly doesn't get called for init.Maybe also add some BUG()s to confirm that no other tasks have in fact been forked by this point?
At system boot, before all the subsystems have been registered, no processes including init has been forked, am I right? So the fork callback will be invoked when the init process is forked, so we don't need to call ss->fork(ss, &init_task).
I'll add a BUG_ON(), and update the document about the fork callback.
Regards,
Li Zefan
Quoted 15 lines · Paul Menage
Quoted 5 lines · Li Zefan
-
- /* If this subsystem requested that it be notified with fork
- * events, we should send it one now for every process in the
- * system */
- if (ss->fork) {Quoted 8 lines
- struct
task_struct*g, *p;
-
-read_lock(&tasklist_lock);
-do_each_thread(g, p){
-ss->fork(ss, p);
- }while_each_thread(g, p);
-read_unlock(&tasklist_lock);
- }
Quoted 6 lines
Should we maybe call
ss->fork(ss, &init_task)? Or just document thatss->fork()explicitly doesn't get called for init.Maybe also add some BUG()s to confirm that no other tasks have in fact been forked by this point?
At system boot, before all the subsystems have been registered, no processes including init has been forked, am I right? So the fork callback will be invoked when the init process is forked, so we don't need to call ss->fork(ss, &init_task).
I'll add a BUG_ON(), and update the document about the fork callback.
Regards,
Li Zefan