From 2199ce7e00eed8ce884d49f0cb690477c5193ed7 Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Wed, 23 Sep 2009 15:56:29 -0700 Subject: [PATCH] --- yaml --- r: 165661 b: refs/heads/master c: c378369d8b4fa516ff2b1e79c3eded4e0e955ebb h: refs/heads/master i: 165659: 311e45381340764813e8fabdd2901ed49ffea0a0 v: v3 --- [refs] | 2 +- trunk/include/linux/cgroup.h | 3 +++ trunk/kernel/cgroup.c | 8 +++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 817bad33265f..311303477b26 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d1d9fd3308fdef6b4bf564fa3d6cfe35b68b50bc +refs/heads/master: c378369d8b4fa516ff2b1e79c3eded4e0e955ebb diff --git a/trunk/include/linux/cgroup.h b/trunk/include/linux/cgroup.h index 88e863460726..3ac78a2f4b5a 100644 --- a/trunk/include/linux/cgroup.h +++ b/trunk/include/linux/cgroup.h @@ -260,6 +260,9 @@ struct css_set { * during subsystem registration (at boot time). */ struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; + + /* For RCU-protected deletion */ + struct rcu_head rcu_head; }; /* diff --git a/trunk/kernel/cgroup.c b/trunk/kernel/cgroup.c index 3e356b05b2d5..bf8dd1a9f2d1 100644 --- a/trunk/kernel/cgroup.c +++ b/trunk/kernel/cgroup.c @@ -267,6 +267,12 @@ static struct hlist_head *css_set_hash(struct cgroup_subsys_state *css[]) return &css_set_table[index]; } +static void free_css_set_rcu(struct rcu_head *obj) +{ + struct css_set *cg = container_of(obj, struct css_set, rcu_head); + kfree(cg); +} + /* We don't maintain the lists running through each css_set to its * task until after the first call to cgroup_iter_start(). This * 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) } write_unlock(&css_set_lock); - kfree(cg); + call_rcu(&cg->rcu_head, free_css_set_rcu); } /*