From: Paul Menage <menage@google.com> To: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: linux-mm@kvack.org, "nishimura@mxp.nes.nec.co.jp" <nishimura@mxp.nes.nec.co.jp>, "balbir@linux.vnet.ibm.com" <balbir@linux.vnet.ibm.com>, gthelen@google.com, m-ikeda@ds.jp.nec.com, "akpm@linux-foundation.org" <akpm@linux-foundation.org>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>, kamezawa.hiroyuki@gmail.com, "lizf@cn.fujitsu.com" <lizf@cn.fujitsu.com> Subject: Re: [PATCH 1/5] cgroup: ID notification call back Date: Tue, 24 Aug 2010 18:35:00 -0700 [thread overview] Message-ID: <AANLkTikuJ9x1u+GC_ox448Fp9wdJ2_GJyu6kNwjOJ9Y=@mail.gmail.com> (raw) In-Reply-To: <20100825100310.ba3fd27e.kamezawa.hiroyu@jp.fujitsu.com> On Tue, Aug 24, 2010 at 6:03 PM, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > Hmm. How this pseudo code looks like ? This passes "new id" via > cgroup->subsys[array] at creation. (Using union will be better, maybe). > That's rather ugly. I was thinking of something more like this. (Not even compiled yet, and the only subsystem updated is cpuset). diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index ed3e92e..063d9f2 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -458,8 +458,7 @@ void cgroup_release_and_wakeup_rmdir(struct cgroup_subsys_state *css); */ struct cgroup_subsys { - struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss, - struct cgroup *cgrp); + int (*create)(struct cgroup_subsys *ss, struct cgroup *cgrp); int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, @@ -513,6 +512,12 @@ struct cgroup_subsys { /* should be defined only by modular subsystems */ struct module *module; + + /* Total size of the subsystem's CSS object */ + size_t css_size; + + /* If non-NULL, the CSS to use for the root cgroup */ + struct cgroup_subsys_state *root_css; }; #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys; diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 192f88c..c589a41 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -3307,6 +3307,7 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, mode_t mode) { struct cgroup *cgrp; + struct cgroup_subsys_state *new_css[CGROUP_SUBSYS_COUNT] = {}; struct cgroupfs_root *root = parent->root; int err = 0; struct cgroup_subsys *ss; @@ -3325,6 +3326,16 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, mutex_lock(&cgroup_mutex); + for_each_subsys(root, ss) { + int id = ss->subsys_id; + new_css[id] = kzalloc(ss->css_size, GFP_KERNEL); + if (!new_css) { + /* Failed to allocate memory */ + err = -ENOMEM; + goto err_destroy; + } + } + init_cgroup_housekeeping(cgrp); cgrp->parent = parent; @@ -3335,19 +3346,19 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); for_each_subsys(root, ss) { - struct cgroup_subsys_state *css = ss->create(ss, cgrp); - - if (IS_ERR(css)) { - err = PTR_ERR(css); - goto err_destroy; - } - init_cgroup_css(css, ss, cgrp); + int id = ss->subsys_id; + init_cgroup_css(new_css[id], ss, cgrp); if (ss->use_id) { err = alloc_css_id(ss, parent, cgrp); if (err) goto err_destroy; } - /* At error, ->destroy() callback has to free assigned ID. */ + err = ss->create(ss, cgrp); + if (err) { + free_css_id(ss, css->id); + goto err_destroy; + } + new_css[id] = NULL; } cgroup_lock_hierarchy(root); @@ -3380,7 +3391,10 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, err_destroy: for_each_subsys(root, ss) { - if (cgrp->subsys[ss->subsys_id]) + int id = ss->subsys_id; + if (new_css[id]) + kfree(new_css[id]); + else if (cgrp->subsys[id]) ss->destroy(ss, cgrp); } @@ -3607,11 +3621,16 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss) /* Create the top cgroup state for this subsystem */ list_add(&ss->sibling, &rootnode.subsys_list); ss->root = &rootnode; - css = ss->create(ss, dummytop); + if (ss->root_css) + css = ss->root_css; + else + css = kzalloc(ss->css_size, GFP_KERNEL); /* We don't handle early failures gracefully */ - BUG_ON(IS_ERR(css)); + BUG_ON(!css); init_cgroup_css(css, ss, dummytop); + BUG_ON(ss->create(ss, dummytop)); + /* Update the init_css_set to contain a subsys * pointer to this state - since the subsystem is * newly registered, all tasks and hence the diff --git a/kernel/cpuset.c b/kernel/cpuset.c index b23c097..7720a79 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -1871,24 +1871,12 @@ static void cpuset_post_clone(struct cgroup_subsys *ss, * cont: control group that the new cpuset will be part of */ -static struct cgroup_subsys_state *cpuset_create( - struct cgroup_subsys *ss, - struct cgroup *cont) +static int cpuset_create(struct cgroup_subsys *ss, struct cgroup *cont) { - struct cpuset *cs; - struct cpuset *parent; - - if (!cont->parent) { - return &top_cpuset.css; - } - parent = cgroup_cs(cont->parent); - cs = kmalloc(sizeof(*cs), GFP_KERNEL); - if (!cs) - return ERR_PTR(-ENOMEM); - if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL)) { - kfree(cs); - return ERR_PTR(-ENOMEM); - } + struct cpuset *cs = cgroup_cs(cont); + struct cpuset *parent = cgroup_cs(cont->parent); + if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL)) + return -ENOMEM; cs->flags = 0; if (is_spread_page(parent)) @@ -1903,7 +1891,7 @@ static struct cgroup_subsys_state *cpuset_create( cs->parent = parent; number_of_cpusets++; - return &cs->css ; + return 0; } /* @@ -1934,6 +1922,8 @@ struct cgroup_subsys cpuset_subsys = { .post_clone = cpuset_post_clone, .subsys_id = cpuset_subsys_id, .early_init = 1, + .css_size = sizeof(struct cpuset), + .root_css = &top_cpuset.css; }; /**
WARNING: multiple messages have this Message-ID (diff)
From: Paul Menage <menage@google.com> To: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: linux-mm@kvack.org, "nishimura@mxp.nes.nec.co.jp" <nishimura@mxp.nes.nec.co.jp>, "balbir@linux.vnet.ibm.com" <balbir@linux.vnet.ibm.com>, gthelen@google.com, m-ikeda@ds.jp.nec.com, "akpm@linux-foundation.org" <akpm@linux-foundation.org>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>, kamezawa.hiroyuki@gmail.com, "lizf@cn.fujitsu.com" <lizf@cn.fujitsu.com> Subject: Re: [PATCH 1/5] cgroup: ID notification call back Date: Tue, 24 Aug 2010 18:35:00 -0700 [thread overview] Message-ID: <AANLkTikuJ9x1u+GC_ox448Fp9wdJ2_GJyu6kNwjOJ9Y=@mail.gmail.com> (raw) In-Reply-To: <20100825100310.ba3fd27e.kamezawa.hiroyu@jp.fujitsu.com> On Tue, Aug 24, 2010 at 6:03 PM, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > Hmm. How this pseudo code looks like ? This passes "new id" via > cgroup->subsys[array] at creation. (Using union will be better, maybe). > That's rather ugly. I was thinking of something more like this. (Not even compiled yet, and the only subsystem updated is cpuset). diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index ed3e92e..063d9f2 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -458,8 +458,7 @@ void cgroup_release_and_wakeup_rmdir(struct cgroup_subsys_state *css); */ struct cgroup_subsys { - struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss, - struct cgroup *cgrp); + int (*create)(struct cgroup_subsys *ss, struct cgroup *cgrp); int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, @@ -513,6 +512,12 @@ struct cgroup_subsys { /* should be defined only by modular subsystems */ struct module *module; + + /* Total size of the subsystem's CSS object */ + size_t css_size; + + /* If non-NULL, the CSS to use for the root cgroup */ + struct cgroup_subsys_state *root_css; }; #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys; diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 192f88c..c589a41 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -3307,6 +3307,7 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, mode_t mode) { struct cgroup *cgrp; + struct cgroup_subsys_state *new_css[CGROUP_SUBSYS_COUNT] = {}; struct cgroupfs_root *root = parent->root; int err = 0; struct cgroup_subsys *ss; @@ -3325,6 +3326,16 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, mutex_lock(&cgroup_mutex); + for_each_subsys(root, ss) { + int id = ss->subsys_id; + new_css[id] = kzalloc(ss->css_size, GFP_KERNEL); + if (!new_css) { + /* Failed to allocate memory */ + err = -ENOMEM; + goto err_destroy; + } + } + init_cgroup_housekeeping(cgrp); cgrp->parent = parent; @@ -3335,19 +3346,19 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); for_each_subsys(root, ss) { - struct cgroup_subsys_state *css = ss->create(ss, cgrp); - - if (IS_ERR(css)) { - err = PTR_ERR(css); - goto err_destroy; - } - init_cgroup_css(css, ss, cgrp); + int id = ss->subsys_id; + init_cgroup_css(new_css[id], ss, cgrp); if (ss->use_id) { err = alloc_css_id(ss, parent, cgrp); if (err) goto err_destroy; } - /* At error, ->destroy() callback has to free assigned ID. */ + err = ss->create(ss, cgrp); + if (err) { + free_css_id(ss, css->id); + goto err_destroy; + } + new_css[id] = NULL; } cgroup_lock_hierarchy(root); @@ -3380,7 +3391,10 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, err_destroy: for_each_subsys(root, ss) { - if (cgrp->subsys[ss->subsys_id]) + int id = ss->subsys_id; + if (new_css[id]) + kfree(new_css[id]); + else if (cgrp->subsys[id]) ss->destroy(ss, cgrp); } @@ -3607,11 +3621,16 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss) /* Create the top cgroup state for this subsystem */ list_add(&ss->sibling, &rootnode.subsys_list); ss->root = &rootnode; - css = ss->create(ss, dummytop); + if (ss->root_css) + css = ss->root_css; + else + css = kzalloc(ss->css_size, GFP_KERNEL); /* We don't handle early failures gracefully */ - BUG_ON(IS_ERR(css)); + BUG_ON(!css); init_cgroup_css(css, ss, dummytop); + BUG_ON(ss->create(ss, dummytop)); + /* Update the init_css_set to contain a subsys * pointer to this state - since the subsystem is * newly registered, all tasks and hence the diff --git a/kernel/cpuset.c b/kernel/cpuset.c index b23c097..7720a79 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -1871,24 +1871,12 @@ static void cpuset_post_clone(struct cgroup_subsys *ss, * cont: control group that the new cpuset will be part of */ -static struct cgroup_subsys_state *cpuset_create( - struct cgroup_subsys *ss, - struct cgroup *cont) +static int cpuset_create(struct cgroup_subsys *ss, struct cgroup *cont) { - struct cpuset *cs; - struct cpuset *parent; - - if (!cont->parent) { - return &top_cpuset.css; - } - parent = cgroup_cs(cont->parent); - cs = kmalloc(sizeof(*cs), GFP_KERNEL); - if (!cs) - return ERR_PTR(-ENOMEM); - if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL)) { - kfree(cs); - return ERR_PTR(-ENOMEM); - } + struct cpuset *cs = cgroup_cs(cont); + struct cpuset *parent = cgroup_cs(cont->parent); + if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL)) + return -ENOMEM; cs->flags = 0; if (is_spread_page(parent)) @@ -1903,7 +1891,7 @@ static struct cgroup_subsys_state *cpuset_create( cs->parent = parent; number_of_cpusets++; - return &cs->css ; + return 0; } /* @@ -1934,6 +1922,8 @@ struct cgroup_subsys cpuset_subsys = { .post_clone = cpuset_post_clone, .subsys_id = cpuset_subsys_id, .early_init = 1, + .css_size = sizeof(struct cpuset), + .root_css = &top_cpuset.css; }; /** -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-08-25 1:35 UTC|newest] Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top 2010-08-20 9:55 [PATCH] memcg: towards I/O aware memcg v5 KAMEZAWA Hiroyuki 2010-08-20 9:55 ` KAMEZAWA Hiroyuki 2010-08-20 9:58 ` [PATCH 1/5] cgroup: ID notification call back KAMEZAWA Hiroyuki 2010-08-20 9:58 ` KAMEZAWA Hiroyuki 2010-08-24 7:19 ` Greg Thelen 2010-08-24 7:19 ` Greg Thelen 2010-08-24 7:18 ` KAMEZAWA Hiroyuki 2010-08-24 7:18 ` KAMEZAWA Hiroyuki 2010-08-24 9:04 ` Li Zefan 2010-08-24 9:04 ` Li Zefan 2010-08-24 23:58 ` KAMEZAWA Hiroyuki 2010-08-24 23:58 ` KAMEZAWA Hiroyuki 2010-08-25 0:11 ` Paul Menage 2010-08-25 0:11 ` Paul Menage 2010-08-25 0:17 ` KAMEZAWA Hiroyuki 2010-08-25 0:17 ` KAMEZAWA Hiroyuki 2010-08-25 0:25 ` Paul Menage 2010-08-25 0:25 ` Paul Menage 2010-08-25 0:09 ` Paul Menage 2010-08-25 0:09 ` Paul Menage 2010-08-25 0:20 ` KAMEZAWA Hiroyuki 2010-08-25 0:20 ` KAMEZAWA Hiroyuki 2010-08-25 0:34 ` Paul Menage 2010-08-25 0:34 ` Paul Menage 2010-08-25 0:37 ` KAMEZAWA Hiroyuki 2010-08-25 0:37 ` KAMEZAWA Hiroyuki 2010-08-25 0:46 ` Paul Menage 2010-08-25 0:46 ` Paul Menage 2010-08-25 1:03 ` KAMEZAWA Hiroyuki 2010-08-25 1:03 ` KAMEZAWA Hiroyuki 2010-08-25 1:35 ` Paul Menage [this message] 2010-08-25 1:35 ` Paul Menage 2010-08-25 1:42 ` KAMEZAWA Hiroyuki 2010-08-25 1:42 ` KAMEZAWA Hiroyuki 2010-08-25 1:52 ` Paul Menage 2010-08-25 1:52 ` Paul Menage 2010-08-25 2:29 ` KAMEZAWA Hiroyuki 2010-08-25 2:29 ` KAMEZAWA Hiroyuki 2010-08-20 9:59 ` [PATCH 2/5] memcg: use array and ID for quick look up KAMEZAWA Hiroyuki 2010-08-20 9:59 ` KAMEZAWA Hiroyuki 2010-08-23 3:35 ` Daisuke Nishimura 2010-08-23 3:35 ` Daisuke Nishimura 2010-08-23 23:51 ` KAMEZAWA Hiroyuki 2010-08-23 23:51 ` KAMEZAWA Hiroyuki 2010-08-24 0:19 ` Daisuke Nishimura 2010-08-24 0:19 ` Daisuke Nishimura 2010-08-24 7:44 ` Greg Thelen 2010-08-24 7:44 ` Greg Thelen 2010-08-24 7:42 ` KAMEZAWA Hiroyuki 2010-08-24 7:42 ` KAMEZAWA Hiroyuki 2010-08-20 10:01 ` [PATCH] memcg: use ID in page_cgroup KAMEZAWA Hiroyuki 2010-08-20 10:01 ` KAMEZAWA Hiroyuki 2010-08-20 10:05 ` KAMEZAWA Hiroyuki 2010-08-23 5:32 ` Daisuke Nishimura 2010-08-23 5:32 ` Daisuke Nishimura 2010-08-23 23:52 ` KAMEZAWA Hiroyuki 2010-08-23 23:52 ` KAMEZAWA Hiroyuki 2010-08-24 1:14 ` Daisuke Nishimura 2010-08-24 1:14 ` Daisuke Nishimura 2010-08-24 1:54 ` KAMEZAWA Hiroyuki 2010-08-24 1:54 ` KAMEZAWA Hiroyuki 2010-08-24 4:04 ` Daisuke Nishimura 2010-08-24 4:04 ` Daisuke Nishimura 2010-08-24 6:05 ` KAMEZAWA Hiroyuki 2010-08-24 6:05 ` KAMEZAWA Hiroyuki 2010-08-24 7:47 ` Greg Thelen 2010-08-24 7:47 ` Greg Thelen 2010-08-24 7:51 ` KAMEZAWA Hiroyuki 2010-08-24 7:51 ` KAMEZAWA Hiroyuki 2010-08-24 8:35 ` Greg Thelen 2010-08-24 8:35 ` Greg Thelen 2010-08-24 8:38 ` KAMEZAWA Hiroyuki 2010-08-24 8:38 ` KAMEZAWA Hiroyuki 2010-08-20 10:02 ` [PATCH 4/5] memcg: lockless update of file_mapped KAMEZAWA Hiroyuki 2010-08-20 10:02 ` KAMEZAWA Hiroyuki 2010-08-23 8:50 ` Daisuke Nishimura 2010-08-23 8:50 ` Daisuke Nishimura 2010-08-23 23:49 ` KAMEZAWA Hiroyuki 2010-08-23 23:49 ` KAMEZAWA Hiroyuki 2010-08-24 0:19 ` Daisuke Nishimura 2010-08-24 0:19 ` Daisuke Nishimura 2010-08-20 10:03 ` [PATCH 5/5] memcg: generic file accounting update function KAMEZAWA Hiroyuki 2010-08-20 10:03 ` KAMEZAWA Hiroyuki 2010-08-24 7:46 ` [PATCH] memcg: towards I/O aware memcg v5 Balbir Singh 2010-08-24 7:46 ` Balbir Singh 2010-08-24 7:59 ` KAMEZAWA Hiroyuki 2010-08-24 7:59 ` KAMEZAWA Hiroyuki
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to='AANLkTikuJ9x1u+GC_ox448Fp9wdJ2_GJyu6kNwjOJ9Y=@mail.gmail.com' \ --to=menage@google.com \ --cc=akpm@linux-foundation.org \ --cc=balbir@linux.vnet.ibm.com \ --cc=gthelen@google.com \ --cc=kamezawa.hiroyu@jp.fujitsu.com \ --cc=kamezawa.hiroyuki@gmail.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=lizf@cn.fujitsu.com \ --cc=m-ikeda@ds.jp.nec.com \ --cc=nishimura@mxp.nes.nec.co.jp \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.