diff options
| author | Ben Blum <bblum@google.com> | 2009-09-23 18:56:29 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-24 10:20:58 -0400 |
| commit | c378369d8b4fa516ff2b1e79c3eded4e0e955ebb (patch) | |
| tree | 33dff6fa14c5b70cf25368b1bde57e5610a308b3 /kernel | |
| parent | d1d9fd3308fdef6b4bf564fa3d6cfe35b68b50bc (diff) | |
cgroups: change css_set freeing mechanism to be under RCU
Changes css_set freeing mechanism to be under RCU
This is a prepatch for making the procs file writable. In order to free the
old css_sets for each task to be moved as they're being moved, the freeing
mechanism must be RCU-protected, or else we would have to have a call to
synchronize_rcu() for each task before freeing its old css_set.
Signed-off-by: Ben Blum <bblum@google.com>
Signed-off-by: Paul Menage <menage@google.com>
Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
Acked-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: Matt Helsley <matthltc@us.ibm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cgroup.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 3e356b05b2d5..bf8dd1a9f2d1 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -267,6 +267,12 @@ static struct hlist_head *css_set_hash(struct cgroup_subsys_state *css[]) | |||
| 267 | return &css_set_table[index]; | 267 | return &css_set_table[index]; |
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | static void free_css_set_rcu(struct rcu_head *obj) | ||
| 271 | { | ||
| 272 | struct css_set *cg = container_of(obj, struct css_set, rcu_head); | ||
| 273 | kfree(cg); | ||
| 274 | } | ||
| 275 | |||
| 270 | /* We don't maintain the lists running through each css_set to its | 276 | /* We don't maintain the lists running through each css_set to its |
| 271 | * task until after the first call to cgroup_iter_start(). This | 277 | * task until after the first call to cgroup_iter_start(). This |
| 272 | * reduces the fork()/exit() overhead for people who have cgroups | 278 | * reduces the fork()/exit() overhead for people who have cgroups |
| @@ -310,7 +316,7 @@ static void __put_css_set(struct css_set *cg, int taskexit) | |||
| 310 | } | 316 | } |
| 311 | 317 | ||
| 312 | write_unlock(&css_set_lock); | 318 | write_unlock(&css_set_lock); |
| 313 | kfree(cg); | 319 | call_rcu(&cg->rcu_head, free_css_set_rcu); |
| 314 | } | 320 | } |
| 315 | 321 | ||
| 316 | /* | 322 | /* |
