x86/smp: Replace cpu_up/down() with add/remove_cpu()
authorQais Yousef <qais.yousef@arm.com>
Mon, 23 Mar 2020 13:51:02 +0000 (13:51 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 25 Mar 2020 11:59:35 +0000 (12:59 +0100)
The core device API performs extra housekeeping bits that are missing
from directly calling cpu_up/down().

See commit a6717c01ddc2 ("powerpc/rtas: use device model APIs and
serialization during LPM") for an example description of what might go
wrong.

This also prepares to make cpu_up/down() a private interface of the CPU
subsystem.

Signed-off-by: Qais Yousef <qais.yousef@arm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/20200323135110.30522-10-qais.yousef@arm.com
arch/x86/kernel/topology.c
arch/x86/mm/mmio-mod.c
arch/x86/xen/smp.c

index be5bc2e47c71e864a0500a9ad64d81247bf8782e..b8810ebbc8ae78c16be71254ca75c47814386c8a 100644 (file)
@@ -59,39 +59,29 @@ __setup("cpu0_hotplug", enable_cpu0_hotplug);
  */
 int _debug_hotplug_cpu(int cpu, int action)
 {
-       struct device *dev = get_cpu_device(cpu);
        int ret;
 
        if (!cpu_is_hotpluggable(cpu))
                return -EINVAL;
 
-       lock_device_hotplug();
-
        switch (action) {
        case 0:
-               ret = cpu_down(cpu);
-               if (!ret) {
+               ret = remove_cpu(cpu);
+               if (!ret)
                        pr_info("DEBUG_HOTPLUG_CPU0: CPU %u is now offline\n", cpu);
-                       dev->offline = true;
-                       kobject_uevent(&dev->kobj, KOBJ_OFFLINE);
-               } else
+               else
                        pr_debug("Can't offline CPU%d.\n", cpu);
                break;
        case 1:
-               ret = cpu_up(cpu);
-               if (!ret) {
-                       dev->offline = false;
-                       kobject_uevent(&dev->kobj, KOBJ_ONLINE);
-               } else {
+               ret = add_cpu(cpu);
+               if (ret)
                        pr_debug("Can't online CPU%d.\n", cpu);
-               }
+
                break;
        default:
                ret = -EINVAL;
        }
 
-       unlock_device_hotplug();
-
        return ret;
 }
 
index 673de60633459309557508af9700bc13c24e9d52..109325d77b3e8f0cef8c77d6466965a70cc896fa 100644 (file)
@@ -386,7 +386,7 @@ static void enter_uniprocessor(void)
        put_online_cpus();
 
        for_each_cpu(cpu, downed_cpus) {
-               err = cpu_down(cpu);
+               err = remove_cpu(cpu);
                if (!err)
                        pr_info("CPU%d is down.\n", cpu);
                else
@@ -406,7 +406,7 @@ static void leave_uniprocessor(void)
                return;
        pr_notice("Re-enabling CPUs...\n");
        for_each_cpu(cpu, downed_cpus) {
-               err = cpu_up(cpu);
+               err = add_cpu(cpu);
                if (!err)
                        pr_info("enabled CPU%d.\n", cpu);
                else
index 7a43b2ae19f1228b247e57fe453d21ab15e116f7..2097fa0ebdb59bf6a9e42f352751e0f4dd7fd558 100644 (file)
@@ -132,7 +132,7 @@ void __init xen_smp_cpus_done(unsigned int max_cpus)
                if (xen_vcpu_nr(cpu) < MAX_VIRT_CPUS)
                        continue;
 
-               rc = cpu_down(cpu);
+               rc = remove_cpu(cpu);
 
                if (rc == 0) {
                        /*