|
@@ -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);
|
|
|
}
|
|
|
|
|
|
/*
|