|
@@ -4037,6 +4037,14 @@ static struct cftype mem_cgroup_legacy_files[] = {
|
|
|
|
|
|
static DEFINE_IDR(mem_cgroup_idr);
|
|
|
|
|
|
+static void mem_cgroup_id_remove(struct mem_cgroup *memcg)
|
|
|
+{
|
|
|
+ if (memcg->id.id > 0) {
|
|
|
+ idr_remove(&mem_cgroup_idr, memcg->id.id);
|
|
|
+ memcg->id.id = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void mem_cgroup_id_get_many(struct mem_cgroup *memcg, unsigned int n)
|
|
|
{
|
|
|
VM_BUG_ON(atomic_read(&memcg->id.ref) <= 0);
|
|
@@ -4047,8 +4055,7 @@ static void mem_cgroup_id_put_many(struct mem_cgroup *memcg, unsigned int n)
|
|
|
{
|
|
|
VM_BUG_ON(atomic_read(&memcg->id.ref) < n);
|
|
|
if (atomic_sub_and_test(n, &memcg->id.ref)) {
|
|
|
- idr_remove(&mem_cgroup_idr, memcg->id.id);
|
|
|
- memcg->id.id = 0;
|
|
|
+ mem_cgroup_id_remove(memcg);
|
|
|
|
|
|
/* Memcg ID pins CSS */
|
|
|
css_put(&memcg->css);
|
|
@@ -4185,8 +4192,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void)
|
|
|
idr_replace(&mem_cgroup_idr, memcg, memcg->id.id);
|
|
|
return memcg;
|
|
|
fail:
|
|
|
- if (memcg->id.id > 0)
|
|
|
- idr_remove(&mem_cgroup_idr, memcg->id.id);
|
|
|
+ mem_cgroup_id_remove(memcg);
|
|
|
__mem_cgroup_free(memcg);
|
|
|
return NULL;
|
|
|
}
|
|
@@ -4245,6 +4251,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
|
|
|
|
|
|
return &memcg->css;
|
|
|
fail:
|
|
|
+ mem_cgroup_id_remove(memcg);
|
|
|
mem_cgroup_free(memcg);
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
}
|