LoongArch: Switch over to GENERIC_CPU_DEVICES
authorJames Morse <james.morse@arm.com>
Tue, 21 Nov 2023 13:45:17 +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.

This allows topology_init() to be removed.

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 is a subtle change. Originally:
- on boot, topology_init() would have marked present CPUs that
  io_master() is true for as hotplug-incapable.
- if a CPU is hotplugged that is an io_master(), it can later be
  hot-unplugged.

The new behaviour is that any CPU that io_master() is true for will
now always be marked as hotplug-incapable, thus even if it was
hotplugged, it can no longer be hot-unplugged.

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

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/E1r5R41-00Ct04-Bg@rmk-PC.armlinux.org.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/loongarch/Kconfig
arch/loongarch/kernel/topology.c

index 331becb2cb4f736db7429c5a994a6f5d76d8dce1..15d05dd2b7f3de828c2aedfec7aa7fd917ddb300 100644 (file)
@@ -72,6 +72,7 @@ config LOONGARCH
        select GENERIC_CLOCKEVENTS
        select GENERIC_CMOS_UPDATE
        select GENERIC_CPU_AUTOPROBE
+       select GENERIC_CPU_DEVICES
        select GENERIC_ENTRY
        select GENERIC_GETTIMEOFDAY
        select GENERIC_IOREMAP if !ARCH_IOREMAP
index ae860fe8153686b55f0f5916f807e6e2a7df3cf8..7dfb46c68f58254c019ac7fcc9ca577f849cb5a5 100644 (file)
 
 #include <acpi/processor.h>
 
-static DEFINE_PER_CPU(struct cpu, cpu_devices);
-
 #ifdef CONFIG_HOTPLUG_CPU
 int arch_register_cpu(int cpu)
 {
-       int ret;
        struct cpu *c = &per_cpu(cpu_devices, cpu);
 
-       c->hotpluggable = 1;
-       ret = register_cpu(c, cpu);
-       if (ret < 0)
-               pr_warn("register_cpu %d failed (%d)\n", cpu, ret);
-
-       return ret;
+       c->hotpluggable = !io_master(cpu);
+       return register_cpu(c, cpu);
 }
 
 void arch_unregister_cpu(int cpu)
@@ -34,21 +27,3 @@ void arch_unregister_cpu(int cpu)
        unregister_cpu(c);
 }
 #endif
-
-static int __init topology_init(void)
-{
-       int i, ret;
-
-       for_each_present_cpu(i) {
-               struct cpu *c = &per_cpu(cpu_devices, i);
-
-               c->hotpluggable = !io_master(i);
-               ret = register_cpu(c, i);
-               if (ret < 0)
-                       pr_warn("topology_init: register_cpu %d failed (%d)\n", i, ret);
-       }
-
-       return 0;
-}
-
-subsys_initcall(topology_init);