Merge branch 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
[cascardo/linux.git] / include / linux / cpuhotplug.h
index 52a81f5..a8ffc40 100644 (file)
@@ -16,15 +16,40 @@ enum cpuhp_state {
        CPUHP_PERF_SUPERH,
        CPUHP_X86_HPET_DEAD,
        CPUHP_X86_APB_DEAD,
+       CPUHP_VIRT_NET_DEAD,
+       CPUHP_SLUB_DEAD,
+       CPUHP_MM_WRITEBACK_DEAD,
+       CPUHP_SOFTIRQ_DEAD,
+       CPUHP_NET_MVNETA_DEAD,
+       CPUHP_CPUIDLE_DEAD,
+       CPUHP_ARM64_FPSIMD_DEAD,
+       CPUHP_ARM_OMAP_WAKE_DEAD,
+       CPUHP_IRQ_POLL_DEAD,
+       CPUHP_BLOCK_SOFTIRQ_DEAD,
+       CPUHP_VIRT_SCSI_DEAD,
+       CPUHP_ACPI_CPUDRV_DEAD,
+       CPUHP_S390_PFAULT_DEAD,
+       CPUHP_BLK_MQ_DEAD,
        CPUHP_WORKQUEUE_PREP,
        CPUHP_POWER_NUMA_PREPARE,
        CPUHP_HRTIMERS_PREPARE,
        CPUHP_PROFILE_PREPARE,
        CPUHP_X2APIC_PREPARE,
        CPUHP_SMPCFD_PREPARE,
+       CPUHP_RELAY_PREPARE,
+       CPUHP_SLAB_PREPARE,
+       CPUHP_MD_RAID5_PREPARE,
        CPUHP_RCUTREE_PREP,
+       CPUHP_CPUIDLE_COUPLED_PREPARE,
+       CPUHP_POWERPC_PMAC_PREPARE,
+       CPUHP_POWERPC_MMU_CTX_PREPARE,
        CPUHP_NOTIFY_PREPARE,
+       CPUHP_ARM_SHMOBILE_SCU_PREPARE,
+       CPUHP_SH_SH3X_PREPARE,
+       CPUHP_BLK_MQ_PREPARE,
        CPUHP_TIMERS_DEAD,
+       CPUHP_NOTF_ERR_INJ_PREPARE,
+       CPUHP_MIPS_SOC_PREPARE,
        CPUHP_BRINGUP_CPU,
        CPUHP_AP_IDLE_DEAD,
        CPUHP_AP_OFFLINE,
@@ -47,6 +72,8 @@ enum cpuhp_state {
        CPUHP_AP_PERF_METAG_STARTING,
        CPUHP_AP_MIPS_OP_LOONGSON3_STARTING,
        CPUHP_AP_ARM_VFP_STARTING,
+       CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING,
+       CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING,
        CPUHP_AP_PERF_ARM_STARTING,
        CPUHP_AP_ARM_L2X0_STARTING,
        CPUHP_AP_ARM_ARCH_TIMER_STARTING,
@@ -70,7 +97,6 @@ enum cpuhp_state {
        CPUHP_AP_ARM64_ISNDEP_STARTING,
        CPUHP_AP_SMPCFD_DYING,
        CPUHP_AP_X86_TBOOT_DYING,
-       CPUHP_AP_NOTIFY_STARTING,
        CPUHP_AP_ONLINE,
        CPUHP_TEARDOWN_CPU,
        CPUHP_AP_ONLINE_IDLE,
@@ -102,7 +128,7 @@ enum cpuhp_state {
 
 int __cpuhp_setup_state(enum cpuhp_state state,        const char *name, bool invoke,
                        int (*startup)(unsigned int cpu),
-                       int (*teardown)(unsigned int cpu));
+                       int (*teardown)(unsigned int cpu), bool multi_instance);
 
 /**
  * cpuhp_setup_state - Setup hotplug state callbacks with calling the callbacks
@@ -119,7 +145,7 @@ static inline int cpuhp_setup_state(enum cpuhp_state state,
                                    int (*startup)(unsigned int cpu),
                                    int (*teardown)(unsigned int cpu))
 {
-       return __cpuhp_setup_state(state, name, true, startup, teardown);
+       return __cpuhp_setup_state(state, name, true, startup, teardown, false);
 }
 
 /**
@@ -138,7 +164,66 @@ static inline int cpuhp_setup_state_nocalls(enum cpuhp_state state,
                                            int (*startup)(unsigned int cpu),
                                            int (*teardown)(unsigned int cpu))
 {
-       return __cpuhp_setup_state(state, name, false, startup, teardown);
+       return __cpuhp_setup_state(state, name, false, startup, teardown,
+                                  false);
+}
+
+/**
+ * cpuhp_setup_state_multi - Add callbacks for multi state
+ * @state:     The state for which the calls are installed
+ * @name:      Name of the callback.
+ * @startup:   startup callback function
+ * @teardown:  teardown callback function
+ *
+ * Sets the internal multi_instance flag and prepares a state to work as a multi
+ * instance callback. No callbacks are invoked at this point. The callbacks are
+ * invoked once an instance for this state are registered via
+ * @cpuhp_state_add_instance or @cpuhp_state_add_instance_nocalls.
+ */
+static inline int cpuhp_setup_state_multi(enum cpuhp_state state,
+                                         const char *name,
+                                         int (*startup)(unsigned int cpu,
+                                                        struct hlist_node *node),
+                                         int (*teardown)(unsigned int cpu,
+                                                         struct hlist_node *node))
+{
+       return __cpuhp_setup_state(state, name, false,
+                                  (void *) startup,
+                                  (void *) teardown, true);
+}
+
+int __cpuhp_state_add_instance(enum cpuhp_state state, struct hlist_node *node,
+                              bool invoke);
+
+/**
+ * cpuhp_state_add_instance - Add an instance for a state and invoke startup
+ *                            callback.
+ * @state:     The state for which the instance is installed
+ * @node:      The node for this individual state.
+ *
+ * Installs the instance for the @state and invokes the startup callback on
+ * the present cpus which have already reached the @state. The @state must have
+ * been earlier marked as multi-instance by @cpuhp_setup_state_multi.
+ */
+static inline int cpuhp_state_add_instance(enum cpuhp_state state,
+                                          struct hlist_node *node)
+{
+       return __cpuhp_state_add_instance(state, node, true);
+}
+
+/**
+ * cpuhp_state_add_instance_nocalls - Add an instance for a state without
+ *                                    invoking the startup callback.
+ * @state:     The state for which the instance is installed
+ * @node:      The node for this individual state.
+ *
+ * Installs the instance for the @state The @state must have been earlier
+ * marked as multi-instance by @cpuhp_setup_state_multi.
+ */
+static inline int cpuhp_state_add_instance_nocalls(enum cpuhp_state state,
+                                                  struct hlist_node *node)
+{
+       return __cpuhp_state_add_instance(state, node, false);
 }
 
 void __cpuhp_remove_state(enum cpuhp_state state, bool invoke);
@@ -165,6 +250,51 @@ static inline void cpuhp_remove_state_nocalls(enum cpuhp_state state)
        __cpuhp_remove_state(state, false);
 }
 
+/**
+ * cpuhp_remove_multi_state - Remove hotplug multi state callback
+ * @state:     The state for which the calls are removed
+ *
+ * Removes the callback functions from a multi state. This is the reverse of
+ * cpuhp_setup_state_multi(). All instances should have been removed before
+ * invoking this function.
+ */
+static inline void cpuhp_remove_multi_state(enum cpuhp_state state)
+{
+       __cpuhp_remove_state(state, false);
+}
+
+int __cpuhp_state_remove_instance(enum cpuhp_state state,
+                                 struct hlist_node *node, bool invoke);
+
+/**
+ * cpuhp_state_remove_instance - Remove hotplug instance from state and invoke
+ *                               the teardown callback
+ * @state:     The state from which the instance is removed
+ * @node:      The node for this individual state.
+ *
+ * Removes the instance and invokes the teardown callback on the present cpus
+ * which have already reached the @state.
+ */
+static inline int cpuhp_state_remove_instance(enum cpuhp_state state,
+                                             struct hlist_node *node)
+{
+       return __cpuhp_state_remove_instance(state, node, true);
+}
+
+/**
+ * cpuhp_state_remove_instance_nocalls - Remove hotplug instance from state
+ *                                      without invoking the reatdown callback
+ * @state:     The state from which the instance is removed
+ * @node:      The node for this individual state.
+ *
+ * Removes the instance without invoking the teardown callback.
+ */
+static inline int cpuhp_state_remove_instance_nocalls(enum cpuhp_state state,
+                                                     struct hlist_node *node)
+{
+       return __cpuhp_state_remove_instance(state, node, false);
+}
+
 #ifdef CONFIG_SMP
 void cpuhp_online_idle(enum cpuhp_state state);
 #else