* Removal of cgroup itself succeeds regardless of refs from swap.
  */
 
-static void mem_cgroup_free(struct mem_cgroup *mem)
+static void __mem_cgroup_free(struct mem_cgroup *mem)
 {
        int node;
 
-       if (atomic_read(&mem->refcnt) > 0)
-               return;
-
-
        for_each_node_state(node, N_POSSIBLE)
                free_mem_cgroup_per_zone_info(mem, node);
 
 
 static void mem_cgroup_put(struct mem_cgroup *mem)
 {
-       if (atomic_dec_and_test(&mem->refcnt)) {
-               if (!mem->obsolete)
-                       return;
-               mem_cgroup_free(mem);
-       }
+       if (atomic_dec_and_test(&mem->refcnt))
+               __mem_cgroup_free(mem);
 }
 
 
 
        if (parent)
                mem->swappiness = get_swappiness(parent);
-
+       atomic_set(&mem->refcnt, 1);
        return &mem->css;
 free_out:
-       for_each_node_state(node, N_POSSIBLE)
-               free_mem_cgroup_per_zone_info(mem, node);
-       mem_cgroup_free(mem);
+       __mem_cgroup_free(mem);
        return ERR_PTR(-ENOMEM);
 }
 
 static void mem_cgroup_destroy(struct cgroup_subsys *ss,
                                struct cgroup *cont)
 {
-       mem_cgroup_free(mem_cgroup_from_cont(cont));
+       mem_cgroup_put(mem_cgroup_from_cont(cont));
 }
 
 static int mem_cgroup_populate(struct cgroup_subsys *ss,