x86/topology: Switch over to GENERIC_CPU_DEVICES
authorJames Morse <james.morse@arm.com>
Tue, 21 Nov 2023 13:45:01 +0000 (13:45 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 6 Dec 2023 03:41:49 +0000 (12:41 +0900)
Now that GENERIC_CPU_DEVICES calls arch_register_cpu(), which can be
overridden by the arch code, switch over to this to allow common code
to choose when the register_cpu() call is made.

x86's struct cpus come from struct x86_cpu, which has no other members
or users. Remove this and use the version defined by common code.

This is an intermediate step to the logic being moved to drivers/acpi,
where GENERIC_CPU_DEVICES will do the work when booting with acpi=off.

This patch also has the effect of moving the registration of CPUs from
subsys to driver core initialisation, prior to any initcalls running.

----
Changes since RFC:
 * Fixed the second copy of arch_register_cpu() used for non-hotplug
Changes since RFC v2:
 * Remove duplicate of the weak generic arch_register_cpu(), spotted
   by Jonathan Cameron. Add note about initialisation order change.
Changes since RFC v3:
 * Adapt to removal of EXPORT_SYMBOL()s

Signed-off-by: James Morse <james.morse@arm.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
Signed-off-by: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/E1r5R3l-00Cszm-UA@rmk-PC.armlinux.org.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/Kconfig
arch/x86/include/asm/cpu.h
arch/x86/kernel/topology.c

index dbdcfc708369a63a38c624517473260ccab88e09..8330c4ac26b32226ddfb59a0206b4e335725f991 100644 (file)
@@ -148,6 +148,7 @@ config X86
        select GENERIC_CLOCKEVENTS_MIN_ADJUST
        select GENERIC_CMOS_UPDATE
        select GENERIC_CPU_AUTOPROBE
+       select GENERIC_CPU_DEVICES
        select GENERIC_CPU_VULNERABILITIES
        select GENERIC_EARLY_IOREMAP
        select GENERIC_ENTRY
index fecc4fe1d68aff799c7b91b363d69e961cefbab1..f8f9a9b7939587b2b8f6e00794e94ea69e6a338a 100644 (file)
@@ -23,10 +23,6 @@ static inline void prefill_possible_map(void) {}
 
 #endif /* CONFIG_SMP */
 
-struct x86_cpu {
-       struct cpu cpu;
-};
-
 #ifdef CONFIG_HOTPLUG_CPU
 extern void soft_restart_cpu(void);
 #endif
index fcb62cfdf9464c5326ebb87e9a3feb504c64c97b..c2ed3145a93bad4791d3419197a86ea958b982dc 100644 (file)
 #include <asm/io_apic.h>
 #include <asm/cpu.h>
 
-static DEFINE_PER_CPU(struct x86_cpu, cpu_devices);
-
 #ifdef CONFIG_HOTPLUG_CPU
 int arch_register_cpu(int cpu)
 {
-       struct x86_cpu *xc = per_cpu_ptr(&cpu_devices, cpu);
+       struct cpu *c = per_cpu_ptr(&cpu_devices, cpu);
 
-       xc->cpu.hotpluggable = cpu > 0;
-       return register_cpu(&xc->cpu, cpu);
+       c->hotpluggable = cpu > 0;
+       return register_cpu(c, cpu);
 }
 
 void arch_unregister_cpu(int num)
 {
-       unregister_cpu(&per_cpu(cpu_devices, num).cpu);
-}
-#else /* CONFIG_HOTPLUG_CPU */
-
-int __init arch_register_cpu(int num)
-{
-       return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
+       unregister_cpu(&per_cpu(cpu_devices, num));
 }
 #endif /* CONFIG_HOTPLUG_CPU */
-
-static int __init topology_init(void)
-{
-       int i;
-
-       for_each_present_cpu(i)
-               arch_register_cpu(i);
-
-       return 0;
-}
-subsys_initcall(topology_init);