Skip to content

Commit 01e5865

Browse files
Vladimir Davydovtorvalds
authored andcommitted
cgroup: release css->id after css_free
Currently, we release css->id in css_release_work_fn, right before calling css_free callback, so that when css_free is called, the id may have already been reused for a new cgroup. I am going to use css->id to create unique names for per memcg kmem caches. Since kmem caches are destroyed only on css_free, I need css->id to be freed after css_free was called to avoid name clashes. This patch therefore moves css->id removal to css_free_work_fn. To prevent css_from_id from returning a pointer to a stale css, it makes css_release_work_fn replace the css ptr at css_idr:css->id with NULL. Signed-off-by: Vladimir Davydov <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: Michal Hocko <[email protected]> Acked-by: Tejun Heo <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: Pekka Enberg <[email protected]> Cc: David Rientjes <[email protected]> Cc: Joonsoo Kim <[email protected]> Cc: Dave Chinner <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 426589f commit 01e5865

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

kernel/cgroup.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4373,16 +4373,20 @@ static void css_free_work_fn(struct work_struct *work)
43734373
{
43744374
struct cgroup_subsys_state *css =
43754375
container_of(work, struct cgroup_subsys_state, destroy_work);
4376+
struct cgroup_subsys *ss = css->ss;
43764377
struct cgroup *cgrp = css->cgroup;
43774378

43784379
percpu_ref_exit(&css->refcnt);
43794380

4380-
if (css->ss) {
4381+
if (ss) {
43814382
/* css free path */
4383+
int id = css->id;
4384+
43824385
if (css->parent)
43834386
css_put(css->parent);
43844387

4385-
css->ss->css_free(css);
4388+
ss->css_free(css);
4389+
cgroup_idr_remove(&ss->css_idr, id);
43864390
cgroup_put(cgrp);
43874391
} else {
43884392
/* cgroup free path */
@@ -4434,7 +4438,7 @@ static void css_release_work_fn(struct work_struct *work)
44344438

44354439
if (ss) {
44364440
/* css release path */
4437-
cgroup_idr_remove(&ss->css_idr, css->id);
4441+
cgroup_idr_replace(&ss->css_idr, NULL, css->id);
44384442
if (ss->css_released)
44394443
ss->css_released(css);
44404444
} else {

0 commit comments

Comments
 (0)