x86/cpu/topology: Confine topology information
authorThomas Gleixner <tglx@linutronix.de>
Tue, 13 Feb 2024 21:05:46 +0000 (22:05 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 15 Feb 2024 21:07:42 +0000 (22:07 +0100)
Now that all external fiddling with num_processors and disabled_cpus is
gone, move the last user prefill_possible_map() into the topology code too
and remove the global visibility of these variables.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Michael Kelley <mhklinux@outlook.com>
Tested-by: Sohil Mehta <sohil.mehta@intel.com>
Link: https://lore.kernel.org/r/20240213210251.994756960@linutronix.de
arch/x86/include/asm/smp.h
arch/x86/kernel/apic/apic.c
arch/x86/kernel/cpu/topology.c
arch/x86/kernel/smpboot.c

index 4fab2ed454f3ab86a636ec9d2ac1ed682d1de624..f1510d6f4e843392156b392c801176f9417eb684 100644 (file)
@@ -9,7 +9,6 @@
 #include <asm/thread_info.h>
 
 extern int smp_num_siblings;
-extern unsigned int num_processors;
 
 DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_map);
 DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_map);
@@ -174,8 +173,6 @@ static inline struct cpumask *cpu_llc_shared_mask(int cpu)
 }
 #endif /* CONFIG_SMP */
 
-extern unsigned disabled_cpus;
-
 #ifdef CONFIG_DEBUG_NMI_SELFTEST
 extern void nmi_selftest(void);
 #else
index 5814b801419761b4230dd860fccccdfde70b4e31..a42d8a6f7149588bc74213268733003bf7ccf470 100644 (file)
@@ -2054,7 +2054,6 @@ void __init init_apic_mappings(void)
                        pr_info("APIC: disable apic facility\n");
                        apic_disable();
                }
-               num_processors = 1;
        }
 }
 
index 669e258b9e0b490e995a7a4861df9bc2c6b38012..a6c9314349516b589876d13fbcada937d0cae7d4 100644 (file)
@@ -29,8 +29,8 @@ u32 cpuid_to_apicid[] __read_mostly = { [0 ... NR_CPUS - 1] = BAD_APICID, };
  */
 static u32 disabled_cpu_apicid __ro_after_init = BAD_APICID;
 
-unsigned int num_processors;
-unsigned disabled_cpus;
+static unsigned int num_processors;
+static unsigned int disabled_cpus;
 
 /*
  * The number of allocated logical CPU IDs. Since logical CPU IDs are allocated
@@ -174,6 +174,71 @@ static int generic_processor_info(int apicid)
        return cpu;
 }
 
+static int __initdata setup_possible_cpus = -1;
+
+/*
+ * cpu_possible_mask should be static, it cannot change as cpu's
+ * are onlined, or offlined. The reason is per-cpu data-structures
+ * are allocated by some modules at init time, and don't expect to
+ * do this dynamically on cpu arrival/departure.
+ * cpu_present_mask on the other hand can change dynamically.
+ * In case when cpu_hotplug is not compiled, then we resort to current
+ * behaviour, which is cpu_possible == cpu_present.
+ * - Ashok Raj
+ *
+ * Three ways to find out the number of additional hotplug CPUs:
+ * - If the BIOS specified disabled CPUs in ACPI/mptables use that.
+ * - The user can overwrite it with possible_cpus=NUM
+ * - Otherwise don't reserve additional CPUs.
+ * We do this because additional CPUs waste a lot of memory.
+ * -AK
+ */
+__init void prefill_possible_map(void)
+{
+       int i, possible;
+
+       i = setup_max_cpus ?: 1;
+       if (setup_possible_cpus == -1) {
+               possible = num_processors;
+#ifdef CONFIG_HOTPLUG_CPU
+               if (setup_max_cpus)
+                       possible += disabled_cpus;
+#else
+               if (possible > i)
+                       possible = i;
+#endif
+       } else
+               possible = setup_possible_cpus;
+
+       total_cpus = max_t(int, possible, num_processors + disabled_cpus);
+
+       /* nr_cpu_ids could be reduced via nr_cpus= */
+       if (possible > nr_cpu_ids) {
+               pr_warn("%d Processors exceeds NR_CPUS limit of %u\n",
+                       possible, nr_cpu_ids);
+               possible = nr_cpu_ids;
+       }
+
+#ifdef CONFIG_HOTPLUG_CPU
+       if (!setup_max_cpus)
+#endif
+       if (possible > i) {
+               pr_warn("%d Processors exceeds max_cpus limit of %u\n",
+                       possible, setup_max_cpus);
+               possible = i;
+       }
+
+       set_nr_cpu_ids(possible);
+
+       pr_info("Allowing %d CPUs, %d hotplug CPUs\n",
+               possible, max_t(int, possible - num_processors, 0));
+
+       reset_cpu_possible_mask();
+
+       for (i = 0; i < possible; i++)
+               set_cpu_possible(i, true);
+}
+
 /**
  * topology_register_apic - Register an APIC in early topology maps
  * @apic_id:   The APIC ID to set up
@@ -251,6 +316,13 @@ void topology_hotunplug_apic(unsigned int cpu)
 }
 #endif
 
+static int __init _setup_possible_cpus(char *str)
+{
+       get_option(&str, &setup_possible_cpus);
+       return 0;
+}
+early_param("possible_cpus", _setup_possible_cpus);
+
 static int __init apic_set_disabled_cpu_apicid(char *arg)
 {
        if (!arg || !get_option(&arg, &disabled_cpu_apicid))
index 000b856db8cef600a1c810248b00164e5282757d..bfb99b5c56061cdb9d267192207ef83a15e1a289 100644 (file)
@@ -1291,78 +1291,6 @@ void __init native_smp_cpus_done(unsigned int max_cpus)
        cache_aps_init();
 }
 
-static int __initdata setup_possible_cpus = -1;
-static int __init _setup_possible_cpus(char *str)
-{
-       get_option(&str, &setup_possible_cpus);
-       return 0;
-}
-early_param("possible_cpus", _setup_possible_cpus);
-
-
-/*
- * cpu_possible_mask should be static, it cannot change as cpu's
- * are onlined, or offlined. The reason is per-cpu data-structures
- * are allocated by some modules at init time, and don't expect to
- * do this dynamically on cpu arrival/departure.
- * cpu_present_mask on the other hand can change dynamically.
- * In case when cpu_hotplug is not compiled, then we resort to current
- * behaviour, which is cpu_possible == cpu_present.
- * - Ashok Raj
- *
- * Three ways to find out the number of additional hotplug CPUs:
- * - If the BIOS specified disabled CPUs in ACPI/mptables use that.
- * - The user can overwrite it with possible_cpus=NUM
- * - Otherwise don't reserve additional CPUs.
- * We do this because additional CPUs waste a lot of memory.
- * -AK
- */
-__init void prefill_possible_map(void)
-{
-       int i, possible;
-
-       i = setup_max_cpus ?: 1;
-       if (setup_possible_cpus == -1) {
-               possible = num_processors;
-#ifdef CONFIG_HOTPLUG_CPU
-               if (setup_max_cpus)
-                       possible += disabled_cpus;
-#else
-               if (possible > i)
-                       possible = i;
-#endif
-       } else
-               possible = setup_possible_cpus;
-
-       total_cpus = max_t(int, possible, num_processors + disabled_cpus);
-
-       /* nr_cpu_ids could be reduced via nr_cpus= */
-       if (possible > nr_cpu_ids) {
-               pr_warn("%d Processors exceeds NR_CPUS limit of %u\n",
-                       possible, nr_cpu_ids);
-               possible = nr_cpu_ids;
-       }
-
-#ifdef CONFIG_HOTPLUG_CPU
-       if (!setup_max_cpus)
-#endif
-       if (possible > i) {
-               pr_warn("%d Processors exceeds max_cpus limit of %u\n",
-                       possible, setup_max_cpus);
-               possible = i;
-       }
-
-       set_nr_cpu_ids(possible);
-
-       pr_info("Allowing %d CPUs, %d hotplug CPUs\n",
-               possible, max_t(int, possible - num_processors, 0));
-
-       reset_cpu_possible_mask();
-
-       for (i = 0; i < possible; i++)
-               set_cpu_possible(i, true);
-}
-
 /* correctly size the local cpu masks */
 void __init setup_cpu_local_masks(void)
 {