linux/include/linux/cpuhotplug.h
<<
>>
Prefs
   1#ifndef __CPUHOTPLUG_H
   2#define __CPUHOTPLUG_H
   3
   4#include <linux/types.h>
   5
   6enum cpuhp_state {
   7        CPUHP_OFFLINE,
   8        CPUHP_CREATE_THREADS,
   9        CPUHP_PERF_PREPARE,
  10        CPUHP_PERF_X86_PREPARE,
  11        CPUHP_PERF_X86_UNCORE_PREP,
  12        CPUHP_PERF_X86_AMD_UNCORE_PREP,
  13        CPUHP_PERF_X86_RAPL_PREP,
  14        CPUHP_PERF_BFIN,
  15        CPUHP_PERF_POWER,
  16        CPUHP_PERF_SUPERH,
  17        CPUHP_X86_HPET_DEAD,
  18        CPUHP_X86_APB_DEAD,
  19        CPUHP_VIRT_NET_DEAD,
  20        CPUHP_SLUB_DEAD,
  21        CPUHP_MM_WRITEBACK_DEAD,
  22        CPUHP_SOFTIRQ_DEAD,
  23        CPUHP_NET_MVNETA_DEAD,
  24        CPUHP_CPUIDLE_DEAD,
  25        CPUHP_ARM64_FPSIMD_DEAD,
  26        CPUHP_ARM_OMAP_WAKE_DEAD,
  27        CPUHP_IRQ_POLL_DEAD,
  28        CPUHP_BLOCK_SOFTIRQ_DEAD,
  29        CPUHP_VIRT_SCSI_DEAD,
  30        CPUHP_ACPI_CPUDRV_DEAD,
  31        CPUHP_S390_PFAULT_DEAD,
  32        CPUHP_BLK_MQ_DEAD,
  33        CPUHP_WORKQUEUE_PREP,
  34        CPUHP_POWER_NUMA_PREPARE,
  35        CPUHP_HRTIMERS_PREPARE,
  36        CPUHP_PROFILE_PREPARE,
  37        CPUHP_X2APIC_PREPARE,
  38        CPUHP_SMPCFD_PREPARE,
  39        CPUHP_RELAY_PREPARE,
  40        CPUHP_SLAB_PREPARE,
  41        CPUHP_MD_RAID5_PREPARE,
  42        CPUHP_RCUTREE_PREP,
  43        CPUHP_CPUIDLE_COUPLED_PREPARE,
  44        CPUHP_POWERPC_PMAC_PREPARE,
  45        CPUHP_POWERPC_MMU_CTX_PREPARE,
  46        CPUHP_XEN_PREPARE,
  47        CPUHP_XEN_EVTCHN_PREPARE,
  48        CPUHP_NOTIFY_PREPARE,
  49        CPUHP_ARM_SHMOBILE_SCU_PREPARE,
  50        CPUHP_SH_SH3X_PREPARE,
  51        CPUHP_BLK_MQ_PREPARE,
  52        CPUHP_TIMERS_DEAD,
  53        CPUHP_NOTF_ERR_INJ_PREPARE,
  54        CPUHP_MIPS_SOC_PREPARE,
  55        CPUHP_BRINGUP_CPU,
  56        CPUHP_AP_IDLE_DEAD,
  57        CPUHP_AP_OFFLINE,
  58        CPUHP_AP_SCHED_STARTING,
  59        CPUHP_AP_RCUTREE_DYING,
  60        CPUHP_AP_IRQ_GIC_STARTING,
  61        CPUHP_AP_IRQ_GICV3_STARTING,
  62        CPUHP_AP_IRQ_HIP04_STARTING,
  63        CPUHP_AP_IRQ_ARMADA_XP_STARTING,
  64        CPUHP_AP_IRQ_ARMADA_CASC_STARTING,
  65        CPUHP_AP_IRQ_BCM2836_STARTING,
  66        CPUHP_AP_ARM_MVEBU_COHERENCY,
  67        CPUHP_AP_PERF_X86_UNCORE_STARTING,
  68        CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING,
  69        CPUHP_AP_PERF_X86_STARTING,
  70        CPUHP_AP_PERF_X86_AMD_IBS_STARTING,
  71        CPUHP_AP_PERF_X86_CQM_STARTING,
  72        CPUHP_AP_PERF_X86_CSTATE_STARTING,
  73        CPUHP_AP_PERF_XTENSA_STARTING,
  74        CPUHP_AP_PERF_METAG_STARTING,
  75        CPUHP_AP_MIPS_OP_LOONGSON3_STARTING,
  76        CPUHP_AP_ARM_VFP_STARTING,
  77        CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING,
  78        CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING,
  79        CPUHP_AP_PERF_ARM_STARTING,
  80        CPUHP_AP_ARM_L2X0_STARTING,
  81        CPUHP_AP_ARM_ARCH_TIMER_STARTING,
  82        CPUHP_AP_ARM_GLOBAL_TIMER_STARTING,
  83        CPUHP_AP_DUMMY_TIMER_STARTING,
  84        CPUHP_AP_JCORE_TIMER_STARTING,
  85        CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING,
  86        CPUHP_AP_ARM_TWD_STARTING,
  87        CPUHP_AP_METAG_TIMER_STARTING,
  88        CPUHP_AP_QCOM_TIMER_STARTING,
  89        CPUHP_AP_ARMADA_TIMER_STARTING,
  90        CPUHP_AP_MARCO_TIMER_STARTING,
  91        CPUHP_AP_MIPS_GIC_TIMER_STARTING,
  92        CPUHP_AP_ARC_TIMER_STARTING,
  93        CPUHP_AP_KVM_STARTING,
  94        CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING,
  95        CPUHP_AP_KVM_ARM_VGIC_STARTING,
  96        CPUHP_AP_KVM_ARM_TIMER_STARTING,
  97        CPUHP_AP_ARM_XEN_STARTING,
  98        CPUHP_AP_ARM_CORESIGHT_STARTING,
  99        CPUHP_AP_ARM_CORESIGHT4_STARTING,
 100        CPUHP_AP_ARM64_ISNDEP_STARTING,
 101        CPUHP_AP_SMPCFD_DYING,
 102        CPUHP_AP_X86_TBOOT_DYING,
 103        CPUHP_AP_ONLINE,
 104        CPUHP_TEARDOWN_CPU,
 105        CPUHP_AP_ONLINE_IDLE,
 106        CPUHP_AP_SMPBOOT_THREADS,
 107        CPUHP_AP_X86_VDSO_VMA_ONLINE,
 108        CPUHP_AP_PERF_ONLINE,
 109        CPUHP_AP_PERF_X86_ONLINE,
 110        CPUHP_AP_PERF_X86_UNCORE_ONLINE,
 111        CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE,
 112        CPUHP_AP_PERF_X86_AMD_POWER_ONLINE,
 113        CPUHP_AP_PERF_X86_RAPL_ONLINE,
 114        CPUHP_AP_PERF_X86_CQM_ONLINE,
 115        CPUHP_AP_PERF_X86_CSTATE_ONLINE,
 116        CPUHP_AP_PERF_S390_CF_ONLINE,
 117        CPUHP_AP_PERF_S390_SF_ONLINE,
 118        CPUHP_AP_PERF_ARM_CCI_ONLINE,
 119        CPUHP_AP_PERF_ARM_CCN_ONLINE,
 120        CPUHP_AP_PERF_ARM_L2X0_ONLINE,
 121        CPUHP_AP_WORKQUEUE_ONLINE,
 122        CPUHP_AP_RCUTREE_ONLINE,
 123        CPUHP_AP_NOTIFY_ONLINE,
 124        CPUHP_AP_ONLINE_DYN,
 125        CPUHP_AP_ONLINE_DYN_END         = CPUHP_AP_ONLINE_DYN + 30,
 126        CPUHP_AP_X86_HPET_ONLINE,
 127        CPUHP_AP_X86_KVM_CLK_ONLINE,
 128        CPUHP_AP_ACTIVE,
 129        CPUHP_ONLINE,
 130};
 131
 132int __cpuhp_setup_state(enum cpuhp_state state, const char *name, bool invoke,
 133                        int (*startup)(unsigned int cpu),
 134                        int (*teardown)(unsigned int cpu), bool multi_instance);
 135
 136/**
 137 * cpuhp_setup_state - Setup hotplug state callbacks with calling the callbacks
 138 * @state:      The state for which the calls are installed
 139 * @name:       Name of the callback (will be used in debug output)
 140 * @startup:    startup callback function
 141 * @teardown:   teardown callback function
 142 *
 143 * Installs the callback functions and invokes the startup callback on
 144 * the present cpus which have already reached the @state.
 145 */
 146static inline int cpuhp_setup_state(enum cpuhp_state state,
 147                                    const char *name,
 148                                    int (*startup)(unsigned int cpu),
 149                                    int (*teardown)(unsigned int cpu))
 150{
 151        return __cpuhp_setup_state(state, name, true, startup, teardown, false);
 152}
 153
 154/**
 155 * cpuhp_setup_state_nocalls - Setup hotplug state callbacks without calling the
 156 *                             callbacks
 157 * @state:      The state for which the calls are installed
 158 * @name:       Name of the callback.
 159 * @startup:    startup callback function
 160 * @teardown:   teardown callback function
 161 *
 162 * Same as @cpuhp_setup_state except that no calls are executed are invoked
 163 * during installation of this callback. NOP if SMP=n or HOTPLUG_CPU=n.
 164 */
 165static inline int cpuhp_setup_state_nocalls(enum cpuhp_state state,
 166                                            const char *name,
 167                                            int (*startup)(unsigned int cpu),
 168                                            int (*teardown)(unsigned int cpu))
 169{
 170        return __cpuhp_setup_state(state, name, false, startup, teardown,
 171                                   false);
 172}
 173
 174/**
 175 * cpuhp_setup_state_multi - Add callbacks for multi state
 176 * @state:      The state for which the calls are installed
 177 * @name:       Name of the callback.
 178 * @startup:    startup callback function
 179 * @teardown:   teardown callback function
 180 *
 181 * Sets the internal multi_instance flag and prepares a state to work as a multi
 182 * instance callback. No callbacks are invoked at this point. The callbacks are
 183 * invoked once an instance for this state are registered via
 184 * @cpuhp_state_add_instance or @cpuhp_state_add_instance_nocalls.
 185 */
 186static inline int cpuhp_setup_state_multi(enum cpuhp_state state,
 187                                          const char *name,
 188                                          int (*startup)(unsigned int cpu,
 189                                                         struct hlist_node *node),
 190                                          int (*teardown)(unsigned int cpu,
 191                                                          struct hlist_node *node))
 192{
 193        return __cpuhp_setup_state(state, name, false,
 194                                   (void *) startup,
 195                                   (void *) teardown, true);
 196}
 197
 198int __cpuhp_state_add_instance(enum cpuhp_state state, struct hlist_node *node,
 199                               bool invoke);
 200
 201/**
 202 * cpuhp_state_add_instance - Add an instance for a state and invoke startup
 203 *                            callback.
 204 * @state:      The state for which the instance is installed
 205 * @node:       The node for this individual state.
 206 *
 207 * Installs the instance for the @state and invokes the startup callback on
 208 * the present cpus which have already reached the @state. The @state must have
 209 * been earlier marked as multi-instance by @cpuhp_setup_state_multi.
 210 */
 211static inline int cpuhp_state_add_instance(enum cpuhp_state state,
 212                                           struct hlist_node *node)
 213{
 214        return __cpuhp_state_add_instance(state, node, true);
 215}
 216
 217/**
 218 * cpuhp_state_add_instance_nocalls - Add an instance for a state without
 219 *                                    invoking the startup callback.
 220 * @state:      The state for which the instance is installed
 221 * @node:       The node for this individual state.
 222 *
 223 * Installs the instance for the @state The @state must have been earlier
 224 * marked as multi-instance by @cpuhp_setup_state_multi.
 225 */
 226static inline int cpuhp_state_add_instance_nocalls(enum cpuhp_state state,
 227                                                   struct hlist_node *node)
 228{
 229        return __cpuhp_state_add_instance(state, node, false);
 230}
 231
 232void __cpuhp_remove_state(enum cpuhp_state state, bool invoke);
 233
 234/**
 235 * cpuhp_remove_state - Remove hotplug state callbacks and invoke the teardown
 236 * @state:      The state for which the calls are removed
 237 *
 238 * Removes the callback functions and invokes the teardown callback on
 239 * the present cpus which have already reached the @state.
 240 */
 241static inline void cpuhp_remove_state(enum cpuhp_state state)
 242{
 243        __cpuhp_remove_state(state, true);
 244}
 245
 246/**
 247 * cpuhp_remove_state_nocalls - Remove hotplug state callbacks without invoking
 248 *                              teardown
 249 * @state:      The state for which the calls are removed
 250 */
 251static inline void cpuhp_remove_state_nocalls(enum cpuhp_state state)
 252{
 253        __cpuhp_remove_state(state, false);
 254}
 255
 256/**
 257 * cpuhp_remove_multi_state - Remove hotplug multi state callback
 258 * @state:      The state for which the calls are removed
 259 *
 260 * Removes the callback functions from a multi state. This is the reverse of
 261 * cpuhp_setup_state_multi(). All instances should have been removed before
 262 * invoking this function.
 263 */
 264static inline void cpuhp_remove_multi_state(enum cpuhp_state state)
 265{
 266        __cpuhp_remove_state(state, false);
 267}
 268
 269int __cpuhp_state_remove_instance(enum cpuhp_state state,
 270                                  struct hlist_node *node, bool invoke);
 271
 272/**
 273 * cpuhp_state_remove_instance - Remove hotplug instance from state and invoke
 274 *                               the teardown callback
 275 * @state:      The state from which the instance is removed
 276 * @node:       The node for this individual state.
 277 *
 278 * Removes the instance and invokes the teardown callback on the present cpus
 279 * which have already reached the @state.
 280 */
 281static inline int cpuhp_state_remove_instance(enum cpuhp_state state,
 282                                              struct hlist_node *node)
 283{
 284        return __cpuhp_state_remove_instance(state, node, true);
 285}
 286
 287/**
 288 * cpuhp_state_remove_instance_nocalls - Remove hotplug instance from state
 289 *                                       without invoking the reatdown callback
 290 * @state:      The state from which the instance is removed
 291 * @node:       The node for this individual state.
 292 *
 293 * Removes the instance without invoking the teardown callback.
 294 */
 295static inline int cpuhp_state_remove_instance_nocalls(enum cpuhp_state state,
 296                                                      struct hlist_node *node)
 297{
 298        return __cpuhp_state_remove_instance(state, node, false);
 299}
 300
 301#ifdef CONFIG_SMP
 302void cpuhp_online_idle(enum cpuhp_state state);
 303#else
 304static inline void cpuhp_online_idle(enum cpuhp_state state) { }
 305#endif
 306
 307#endif
 308