OSDN Git Service

arm/bL_switcher: Convert to hotplug state machine
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Thu, 17 Nov 2016 18:35:35 +0000 (19:35 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 22 Nov 2016 22:34:41 +0000 (23:34 +0100)
Install the callbacks via the state machine.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: rt@linuxtronix.de
Cc: linux-arm-kernel@lists.infradead.org
Cc: Russell King <linux@armlinux.org.uk>
Link: http://lkml.kernel.org/r/20161117183541.8588-15-bigeasy@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/arm/common/bL_switcher.c
include/linux/cpuhotplug.h

index 37dc0fe..4673001 100644 (file)
@@ -757,19 +757,18 @@ EXPORT_SYMBOL_GPL(bL_switcher_put_enabled);
  * while the switcher is active.
  * We're just not ready to deal with that given the trickery involved.
  */
-static int bL_switcher_hotplug_callback(struct notifier_block *nfb,
-                                       unsigned long action, void *hcpu)
+static int bL_switcher_cpu_pre(unsigned int cpu)
 {
-       if (bL_switcher_active) {
-               int pairing = bL_switcher_cpu_pairing[(unsigned long)hcpu];
-               switch (action & 0xf) {
-               case CPU_UP_PREPARE:
-               case CPU_DOWN_PREPARE:
-                       if (pairing == -1)
-                               return NOTIFY_BAD;
-               }
-       }
-       return NOTIFY_DONE;
+       int pairing;
+
+       if (!bL_switcher_active)
+               return 0;
+
+       pairing = bL_switcher_cpu_pairing[cpu];
+
+       if (pairing == -1)
+               return -EINVAL;
+       return 0;
 }
 
 static bool no_bL_switcher;
@@ -782,8 +781,15 @@ static int __init bL_switcher_init(void)
        if (!mcpm_is_available())
                return -ENODEV;
 
-       cpu_notifier(bL_switcher_hotplug_callback, 0);
-
+       cpuhp_setup_state_nocalls(CPUHP_ARM_BL_PREPARE, "arm/bl:prepare",
+                                 bL_switcher_cpu_pre, NULL);
+       ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "arm/bl:predown",
+                                       NULL, bL_switcher_cpu_pre);
+       if (ret < 0) {
+               cpuhp_remove_state_nocalls(CPUHP_ARM_BL_PREPARE);
+               pr_err("bL_switcher: Failed to allocate a hotplug state\n");
+               return ret;
+       }
        if (!no_bL_switcher) {
                ret = bL_switcher_enable();
                if (ret)
index 12bbcf3..e3771fb 100644 (file)
@@ -61,6 +61,7 @@ enum cpuhp_state {
        CPUHP_NET_FLOW_PREPARE,
        CPUHP_TOPOLOGY_PREPARE,
        CPUHP_NET_IUCV_PREPARE,
+       CPUHP_ARM_BL_PREPARE,
        CPUHP_TIMERS_DEAD,
        CPUHP_NOTF_ERR_INJ_PREPARE,
        CPUHP_MIPS_SOC_PREPARE,