|
|
@@ -4659,9 +4659,11 @@ static void css_release_work_fn(struct work_struct *work)
|
|
|
if (cgroup_on_dfl(cgrp))
|
|
|
cgroup_rstat_flush(cgrp);
|
|
|
|
|
|
+ spin_lock_irq(&css_set_lock);
|
|
|
for (tcgrp = cgroup_parent(cgrp); tcgrp;
|
|
|
tcgrp = cgroup_parent(tcgrp))
|
|
|
tcgrp->nr_dying_descendants--;
|
|
|
+ spin_unlock_irq(&css_set_lock);
|
|
|
|
|
|
cgroup_idr_remove(&cgrp->root->cgroup_idr, cgrp->id);
|
|
|
cgrp->id = -1;
|
|
|
@@ -4874,12 +4876,14 @@ static struct cgroup *cgroup_create(struct cgroup *parent)
|
|
|
if (ret)
|
|
|
goto out_idr_free;
|
|
|
|
|
|
+ spin_lock_irq(&css_set_lock);
|
|
|
for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp)) {
|
|
|
cgrp->ancestor_ids[tcgrp->level] = tcgrp->id;
|
|
|
|
|
|
if (tcgrp != cgrp)
|
|
|
tcgrp->nr_descendants++;
|
|
|
}
|
|
|
+ spin_unlock_irq(&css_set_lock);
|
|
|
|
|
|
if (notify_on_release(parent))
|
|
|
set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags);
|
|
|
@@ -5162,10 +5166,12 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
|
|
|
if (parent && cgroup_is_threaded(cgrp))
|
|
|
parent->nr_threaded_children--;
|
|
|
|
|
|
+ spin_lock_irq(&css_set_lock);
|
|
|
for (tcgrp = cgroup_parent(cgrp); tcgrp; tcgrp = cgroup_parent(tcgrp)) {
|
|
|
tcgrp->nr_descendants--;
|
|
|
tcgrp->nr_dying_descendants++;
|
|
|
}
|
|
|
+ spin_unlock_irq(&css_set_lock);
|
|
|
|
|
|
cgroup1_check_for_release(parent);
|
|
|
|