From: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx> The IDR now behaves the way the cgroup wrappers made the IDR behave, so the wrappers are no longer needed. Signed-off-by: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx> --- kernel/cgroup/cgroup.c | 59 ++++++++++---------------------------------------- 1 file changed, 11 insertions(+), 48 deletions(-) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index 351b355336d4..67b4c2aa69a9 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -80,12 +80,6 @@ EXPORT_SYMBOL_GPL(cgroup_mutex); EXPORT_SYMBOL_GPL(css_set_lock); #endif -/* - * Protects cgroup_idr and css_idr so that IDs can be released without - * grabbing cgroup_mutex. - */ -static DEFINE_SPINLOCK(cgroup_idr_lock); - /* * Protects cgroup_file->kn for !self csses. It synchronizes notifications * against file removal/re-creation across css hiding. @@ -291,37 +285,6 @@ bool cgroup_on_dfl(const struct cgroup *cgrp) return cgrp->root == &cgrp_dfl_root; } -/* IDR wrappers which synchronize using cgroup_idr_lock */ -static int cgroup_idr_alloc(struct idr *idr, void *ptr, int start, int end, - gfp_t gfp_mask) -{ - int ret; - - idr_preload(gfp_mask); - spin_lock_bh(&cgroup_idr_lock); - ret = idr_alloc(idr, ptr, start, end, gfp_mask & ~__GFP_DIRECT_RECLAIM); - spin_unlock_bh(&cgroup_idr_lock); - idr_preload_end(); - return ret; -} - -static void *cgroup_idr_replace(struct idr *idr, void *ptr, int id) -{ - void *ret; - - spin_lock_bh(&cgroup_idr_lock); - ret = idr_replace(idr, ptr, id); - spin_unlock_bh(&cgroup_idr_lock); - return ret; -} - -static void cgroup_idr_remove(struct idr *idr, int id) -{ - spin_lock_bh(&cgroup_idr_lock); - idr_remove(idr, id); - spin_unlock_bh(&cgroup_idr_lock); -} - static bool cgroup_has_tasks(struct cgroup *cgrp) { return cgrp->nr_populated_csets; @@ -1883,7 +1846,7 @@ int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask, int ref_flags) lockdep_assert_held(&cgroup_mutex); - ret = cgroup_idr_alloc(&root->cgroup_idr, root_cgrp, 1, 2, GFP_KERNEL); + ret = idr_alloc(&root->cgroup_idr, root_cgrp, 1, 2, GFP_KERNEL); if (ret < 0) goto out; root_cgrp->id = ret; @@ -4532,7 +4495,7 @@ static void css_free_work_fn(struct work_struct *work) int id = css->id; ss->css_free(css); - cgroup_idr_remove(&ss->css_idr, id); + idr_remove(&ss->css_idr, id); cgroup_put(cgrp); if (parent) @@ -4589,7 +4552,7 @@ static void css_release_work_fn(struct work_struct *work) if (ss) { /* css release path */ - cgroup_idr_replace(&ss->css_idr, NULL, css->id); + idr_replace(&ss->css_idr, NULL, css->id); if (ss->css_released) ss->css_released(css); } else { @@ -4605,7 +4568,7 @@ static void css_release_work_fn(struct work_struct *work) tcgrp = cgroup_parent(tcgrp)) tcgrp->nr_dying_descendants--; - cgroup_idr_remove(&cgrp->root->cgroup_idr, cgrp->id); + idr_remove(&cgrp->root->cgroup_idr, cgrp->id); cgrp->id = -1; /* @@ -4731,14 +4694,14 @@ static struct cgroup_subsys_state *css_create(struct cgroup *cgrp, if (err) goto err_free_css; - err = cgroup_idr_alloc(&ss->css_idr, NULL, 2, 0, GFP_KERNEL); + err = idr_alloc(&ss->css_idr, NULL, 2, 0, GFP_KERNEL); if (err < 0) goto err_free_css; css->id = err; /* @css is ready to be brought online now, make it visible */ list_add_tail_rcu(&css->sibling, &parent_css->children); - cgroup_idr_replace(&ss->css_idr, css, css->id); + idr_replace(&ss->css_idr, css, css->id); err = online_css(css); if (err) @@ -4794,7 +4757,7 @@ static struct cgroup *cgroup_create(struct cgroup *parent) * 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); + cgrp->id = idr_alloc(&root->cgroup_idr, NULL, 2, 0, GFP_KERNEL); if (cgrp->id < 0) { ret = -ENOMEM; goto out_stat_exit; @@ -4833,7 +4796,7 @@ static struct cgroup *cgroup_create(struct cgroup *parent) * @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); + idr_replace(&root->cgroup_idr, cgrp, cgrp->id); /* * On the default hierarchy, a child doesn't automatically inherit @@ -4847,7 +4810,7 @@ static struct cgroup *cgroup_create(struct cgroup *parent) return cgrp; out_idr_free: - cgroup_idr_remove(&root->cgroup_idr, cgrp->id); + idr_remove(&root->cgroup_idr, cgrp->id); out_stat_exit: if (cgroup_on_dfl(parent)) cgroup_stat_exit(cgrp); @@ -5166,7 +5129,7 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss, bool early) /* allocation can't be done safely during early init */ css->id = 1; } else { - css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, GFP_KERNEL); + css->id = idr_alloc(&ss->css_idr, css, 1, 2, GFP_KERNEL); BUG_ON(css->id < 0); } @@ -5273,7 +5236,7 @@ int __init cgroup_init(void) struct cgroup_subsys_state *css = init_css_set.subsys[ss->id]; - css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, + css->id = idr_alloc(&ss->css_idr, css, 1, 2, GFP_KERNEL); BUG_ON(css->id < 0); } else { -- 2.15.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>