static LIST_HEAD(default_memory_types);
 static struct node_memory_type_map node_memory_types[MAX_NUMNODES];
 struct memory_dev_type *default_dram_type;
+nodemask_t default_dram_nodes __initdata = NODE_MASK_NONE;
 
 static const struct bus_type memory_tier_subsys = {
        .name = "memory_tiering",
 
 /*
  * This is invoked via `late_initcall()` to initialize memory tiers for
- * CPU-less memory nodes after driver initialization, which is
- * expected to provide `adistance` algorithms.
+ * memory nodes, both with and without CPUs. After the initialization of
+ * firmware and devices, adistance algorithms are expected to be provided.
  */
 static int __init memory_tier_late_init(void)
 {
        int nid;
+       struct memory_tier *memtier;
 
+       get_online_mems();
        guard(mutex)(&memory_tier_lock);
+
+       /* Assign each uninitialized N_MEMORY node to a memory tier. */
        for_each_node_state(nid, N_MEMORY) {
                /*
-                * Some device drivers may have initialized memory tiers
-                * between `memory_tier_init()` and `memory_tier_late_init()`,
-                * potentially bringing online memory nodes and
-                * configuring memory tiers. Exclude them here.
+                * Some device drivers may have initialized
+                * memory tiers, potentially bringing memory nodes
+                * online and configuring memory tiers.
+                * Exclude them here.
                 */
                if (node_memory_types[nid].memtype)
                        continue;
 
-               set_node_memory_tier(nid);
+               memtier = set_node_memory_tier(nid);
+               if (IS_ERR(memtier))
+                       continue;
        }
 
        establish_demotion_targets();
+       put_online_mems();
 
        return 0;
 }
 
 static int __init memory_tier_init(void)
 {
-       int ret, node;
-       struct memory_tier *memtier;
+       int ret;
 
        ret = subsys_virtual_register(&memory_tier_subsys, NULL);
        if (ret)
                                GFP_KERNEL);
        WARN_ON(!node_demotion);
 #endif
-       mutex_lock(&memory_tier_lock);
+
+       guard(mutex)(&memory_tier_lock);
        /*
         * For now we can have 4 faster memory tiers with smaller adistance
         * than default DRAM tier.
        if (IS_ERR(default_dram_type))
                panic("%s() failed to allocate default DRAM tier\n", __func__);
 
-       /*
-        * Look at all the existing N_MEMORY nodes and add them to
-        * default memory tier or to a tier if we already have memory
-        * types assigned.
-        */
-       for_each_node_state(node, N_MEMORY) {
-               if (!node_state(node, N_CPU))
-                       /*
-                        * Defer memory tier initialization on
-                        * CPUless numa nodes. These will be initialized
-                        * after firmware and devices are initialized.
-                        */
-                       continue;
-
-               memtier = set_node_memory_tier(node);
-               if (IS_ERR(memtier))
-                       /*
-                        * Continue with memtiers we are able to setup
-                        */
-                       break;
-       }
-       establish_demotion_targets();
-       mutex_unlock(&memory_tier_lock);
+       /* Record nodes with memory and CPU to set default DRAM performance. */
+       nodes_and(default_dram_nodes, node_states[N_MEMORY],
+                 node_states[N_CPU]);
 
        hotplug_memory_notifier(memtier_hotplug_callback, MEMTIER_HOTPLUG_PRI);
        return 0;