bool cgroup_debug __read_mostly;
/*
- * Protects cgroup_idr and css_idr so that IDs can be released without
+ * Protects css_idr so that IDs can be released without
* grabbing cgroup_mutex.
*/
static DEFINE_SPINLOCK(cgroup_idr_lock);
void cgroup_free_root(struct cgroup_root *root)
{
- if (root) {
- idr_destroy(&root->cgroup_idr);
- kfree(root);
- }
+ kfree(root);
}
static void cgroup_destroy_root(struct cgroup_root *root)
atomic_set(&root->nr_cgrps, 1);
cgrp->root = root;
init_cgroup_housekeeping(cgrp);
- idr_init(&root->cgroup_idr);
+ xa_init_flags(&root->cgroup_ids, XA_FLAGS_ALLOC1 | XA_FLAGS_LOCK_BH);
root->flags = ctx->flags;
if (ctx->release_agent)
lockdep_assert_held(&cgroup_mutex);
- ret = cgroup_idr_alloc(&root->cgroup_idr, root_cgrp, 1, 2, GFP_KERNEL);
+ ret = xa_insert_bh(&root->cgroup_ids, 1, root_cgrp, GFP_KERNEL);
if (ret < 0)
goto out;
- root_cgrp->id = ret;
+ root_cgrp->id = 1;
root_cgrp->ancestor_ids[0] = ret;
ret = percpu_ref_init(&root_cgrp->self.refcnt, css_release,
tcgrp->nr_dying_descendants--;
spin_unlock_irq(&css_set_lock);
- cgroup_idr_remove(&cgrp->root->cgroup_idr, cgrp->id);
+ xa_erase_bh(&cgrp->root->cgroup_ids, cgrp->id);
cgrp->id = -1;
/*
goto out_cancel_ref;
}
- /*
- * Temporarily set the pointer to NULL, so idr_find() won't return
- * a half-baked cgroup.
- */
- cgrp->id = cgroup_idr_alloc(&root->cgroup_idr, NULL, 2, 0, GFP_KERNEL);
- if (cgrp->id < 0) {
+ /* Use a NULL pointer, so we won't find a half-baked cgroup. */
+ ret = xa_alloc_bh(&root->cgroup_ids, &cgrp->id, NULL, xa_limit_32b,
+ GFP_KERNEL);
+ if (ret < 0) {
ret = -ENOMEM;
goto out_stat_exit;
}
ret = psi_cgroup_alloc(cgrp);
if (ret)
- goto out_idr_free;
+ goto out_xa_free;
ret = cgroup_bpf_inherit(cgrp);
if (ret)
* @cgrp is now fully operational. If something fails after this
* point, it'll be released via the normal destruction path.
*/
- cgroup_idr_replace(&root->cgroup_idr, cgrp, cgrp->id);
+ xa_store_bh(&root->cgroup_ids, cgrp->id, cgrp, 0);
/*
* On the default hierarchy, a child doesn't automatically inherit
out_psi_free:
psi_cgroup_free(cgrp);
-out_idr_free:
- cgroup_idr_remove(&root->cgroup_idr, cgrp->id);
+out_xa_free:
+ xa_erase_bh(&root->cgroup_ids, cgrp->id);
out_stat_exit:
if (cgroup_on_dfl(parent))
cgroup_rstat_exit(cgrp);