x86: Support Generic Initiator only proximity domains
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 30 Sep 2020 14:05:43 +0000 (22:05 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 2 Oct 2020 16:51:57 +0000 (18:51 +0200)
In common with memoryless domains only register GI domains
if the proximity node is not online. If a domain is already
a memory containing domain, or a memoryless domain there is
nothing to do just because it also contains a Generic Initiator.

Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
arch/x86/include/asm/numa.h
arch/x86/kernel/setup.c
arch/x86/mm/numa.c

index bbfde3d2662f4f2254a4604e9eac5efdd11e95f3..f631467272a38f5d85e3c9efd857a2f075f6d64e 100644 (file)
@@ -62,12 +62,14 @@ extern void numa_clear_node(int cpu);
 extern void __init init_cpu_to_node(void);
 extern void numa_add_cpu(int cpu);
 extern void numa_remove_cpu(int cpu);
+extern void init_gi_nodes(void);
 #else  /* CONFIG_NUMA */
 static inline void numa_set_node(int cpu, int node)    { }
 static inline void numa_clear_node(int cpu)            { }
 static inline void init_cpu_to_node(void)              { }
 static inline void numa_add_cpu(int cpu)               { }
 static inline void numa_remove_cpu(int cpu)            { }
+static inline void init_gi_nodes(void)                 { }
 #endif /* CONFIG_NUMA */
 
 #ifdef CONFIG_DEBUG_PER_CPU_MAPS
index 3511736fbc747e3b606daf8bee7ae896ea91980b..9062c146f03a2f169ed888abb1f0e89d36559564 100644 (file)
@@ -1218,6 +1218,7 @@ void __init setup_arch(char **cmdline_p)
        prefill_possible_map();
 
        init_cpu_to_node();
+       init_gi_nodes();
 
        io_apic_init_mappings();
 
index aa76ec2d359b2bf5536d0961e8381fe210c832b4..22d3e5ade3ae2a325f28848de946d4de86eff65b 100644 (file)
@@ -747,6 +747,27 @@ static void __init init_memory_less_node(int nid)
         */
 }
 
+/*
+ * A node may exist which has one or more Generic Initiators but no CPUs and no
+ * memory.
+ *
+ * This function must be called after init_cpu_to_node(), to ensure that any
+ * memoryless CPU nodes have already been brought online, and before the
+ * node_data[nid] is needed for zone list setup in build_all_zonelists().
+ *
+ * When this function is called, any nodes containing either memory and/or CPUs
+ * will already be online and there is no need to do anything extra, even if
+ * they also contain one or more Generic Initiators.
+ */
+void __init init_gi_nodes(void)
+{
+       int nid;
+
+       for_each_node_state(nid, N_GENERIC_INITIATOR)
+               if (!node_online(nid))
+                       init_memory_less_node(nid);
+}
+
 /*
  * Setup early cpu_to_node.
  *