RISC-V: Fix wrong use of CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK
[platform/kernel/linux-rpi.git] / mm / memcontrol.c
index b29b850..a4d3282 100644 (file)
@@ -5326,7 +5326,6 @@ static struct mem_cgroup *mem_cgroup_alloc(void)
        INIT_LIST_HEAD(&memcg->deferred_split_queue.split_queue);
        memcg->deferred_split_queue.split_queue_len = 0;
 #endif
-       idr_replace(&mem_cgroup_idr, memcg, memcg->id.id);
        lru_gen_init_memcg(memcg);
        return memcg;
 fail:
@@ -5398,14 +5397,27 @@ static int mem_cgroup_css_online(struct cgroup_subsys_state *css)
        if (alloc_shrinker_info(memcg))
                goto offline_kmem;
 
-       /* Online state pins memcg ID, memcg ID pins CSS */
-       refcount_set(&memcg->id.ref, 1);
-       css_get(css);
-
        if (unlikely(mem_cgroup_is_root(memcg)))
                queue_delayed_work(system_unbound_wq, &stats_flush_dwork,
                                   FLUSH_TIME);
        lru_gen_online_memcg(memcg);
+
+       /* Online state pins memcg ID, memcg ID pins CSS */
+       refcount_set(&memcg->id.ref, 1);
+       css_get(css);
+
+       /*
+        * Ensure mem_cgroup_from_id() works once we're fully online.
+        *
+        * We could do this earlier and require callers to filter with
+        * css_tryget_online(). But right now there are no users that
+        * need earlier access, and the workingset code relies on the
+        * cgroup tree linkage (mem_cgroup_get_nr_swap_pages()). So
+        * publish it here at the end of onlining. This matches the
+        * regular ID destruction during offlining.
+        */
+       idr_replace(&mem_cgroup_idr, memcg, memcg->id.id);
+
        return 0;
 offline_kmem:
        memcg_offline_kmem(memcg);