linux/include/linux/cpu.h
<<
>>
Prefs
   1/*
   2 * include/linux/cpu.h - generic cpu definition
   3 *
   4 * This is mainly for topological representation. We define the 
   5 * basic 'struct cpu' here, which can be embedded in per-arch 
   6 * definitions of processors.
   7 *
   8 * Basic handling of the devices is done in drivers/base/cpu.c
   9 *
  10 * CPUs are exported via sysfs in the devices/system/cpu
  11 * directory. 
  12 */
  13#ifndef _LINUX_CPU_H_
  14#define _LINUX_CPU_H_
  15
  16#include <linux/node.h>
  17#include <linux/compiler.h>
  18#include <linux/cpumask.h>
  19
  20struct device;
  21
  22struct cpu {
  23        int node_id;            /* The node which contains the CPU */
  24        int hotpluggable;       /* creates sysfs control file if hotpluggable */
  25        struct device dev;
  26};
  27
  28extern int register_cpu(struct cpu *cpu, int num);
  29extern struct device *get_cpu_device(unsigned cpu);
  30extern bool cpu_is_hotpluggable(unsigned cpu);
  31extern bool arch_match_cpu_phys_id(int cpu, u64 phys_id);
  32
  33extern int cpu_add_dev_attr(struct device_attribute *attr);
  34extern void cpu_remove_dev_attr(struct device_attribute *attr);
  35
  36extern int cpu_add_dev_attr_group(struct attribute_group *attrs);
  37extern void cpu_remove_dev_attr_group(struct attribute_group *attrs);
  38
  39#ifdef CONFIG_HOTPLUG_CPU
  40extern void unregister_cpu(struct cpu *cpu);
  41extern ssize_t arch_cpu_probe(const char *, size_t);
  42extern ssize_t arch_cpu_release(const char *, size_t);
  43#endif
  44struct notifier_block;
  45
  46#ifdef CONFIG_ARCH_HAS_CPU_AUTOPROBE
  47extern int arch_cpu_uevent(struct device *dev, struct kobj_uevent_env *env);
  48extern ssize_t arch_print_cpu_modalias(struct device *dev,
  49                                       struct device_attribute *attr,
  50                                       char *bufptr);
  51#endif
  52
  53/*
  54 * CPU notifier priorities.
  55 */
  56enum {
  57        /*
  58         * SCHED_ACTIVE marks a cpu which is coming up active during
  59         * CPU_ONLINE and CPU_DOWN_FAILED and must be the first
  60         * notifier.  CPUSET_ACTIVE adjusts cpuset according to
  61         * cpu_active mask right after SCHED_ACTIVE.  During
  62         * CPU_DOWN_PREPARE, SCHED_INACTIVE and CPUSET_INACTIVE are
  63         * ordered in the similar way.
  64         *
  65         * This ordering guarantees consistent cpu_active mask and
  66         * migration behavior to all cpu notifiers.
  67         */
  68        CPU_PRI_SCHED_ACTIVE    = INT_MAX,
  69        CPU_PRI_CPUSET_ACTIVE   = INT_MAX - 1,
  70        CPU_PRI_SCHED_INACTIVE  = INT_MIN + 1,
  71        CPU_PRI_CPUSET_INACTIVE = INT_MIN,
  72
  73        /* migration should happen before other stuff but after perf */
  74        CPU_PRI_PERF            = 20,
  75        CPU_PRI_MIGRATION       = 10,
  76        /* bring up workqueues before normal notifiers and down after */
  77        CPU_PRI_WORKQUEUE_UP    = 5,
  78        CPU_PRI_WORKQUEUE_DOWN  = -5,
  79};
  80
  81#define CPU_ONLINE              0x0002 /* CPU (unsigned)v is up */
  82#define CPU_UP_PREPARE          0x0003 /* CPU (unsigned)v coming up */
  83#define CPU_UP_CANCELED         0x0004 /* CPU (unsigned)v NOT coming up */
  84#define CPU_DOWN_PREPARE        0x0005 /* CPU (unsigned)v going down */
  85#define CPU_DOWN_FAILED         0x0006 /* CPU (unsigned)v NOT going down */
  86#define CPU_DEAD                0x0007 /* CPU (unsigned)v dead */
  87#define CPU_DYING               0x0008 /* CPU (unsigned)v not running any task,
  88                                        * not handling interrupts, soon dead.
  89                                        * Called on the dying cpu, interrupts
  90                                        * are already disabled. Must not
  91                                        * sleep, must not fail */
  92#define CPU_POST_DEAD           0x0009 /* CPU (unsigned)v dead, cpu_hotplug
  93                                        * lock is dropped */
  94#define CPU_STARTING            0x000A /* CPU (unsigned)v soon running.
  95                                        * Called on the new cpu, just before
  96                                        * enabling interrupts. Must not sleep,
  97                                        * must not fail */
  98
  99/* Used for CPU hotplug events occurring while tasks are frozen due to a suspend
 100 * operation in progress
 101 */
 102#define CPU_TASKS_FROZEN        0x0010
 103
 104#define CPU_ONLINE_FROZEN       (CPU_ONLINE | CPU_TASKS_FROZEN)
 105#define CPU_UP_PREPARE_FROZEN   (CPU_UP_PREPARE | CPU_TASKS_FROZEN)
 106#define CPU_UP_CANCELED_FROZEN  (CPU_UP_CANCELED | CPU_TASKS_FROZEN)
 107#define CPU_DOWN_PREPARE_FROZEN (CPU_DOWN_PREPARE | CPU_TASKS_FROZEN)
 108#define CPU_DOWN_FAILED_FROZEN  (CPU_DOWN_FAILED | CPU_TASKS_FROZEN)
 109#define CPU_DEAD_FROZEN         (CPU_DEAD | CPU_TASKS_FROZEN)
 110#define CPU_DYING_FROZEN        (CPU_DYING | CPU_TASKS_FROZEN)
 111#define CPU_STARTING_FROZEN     (CPU_STARTING | CPU_TASKS_FROZEN)
 112
 113
 114#ifdef CONFIG_SMP
 115/* Need to know about CPUs going up/down? */
 116#if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE)
 117#define cpu_notifier(fn, pri) {                                 \
 118        static struct notifier_block fn##_nb =                  \
 119                { .notifier_call = fn, .priority = pri };       \
 120        register_cpu_notifier(&fn##_nb);                        \
 121}
 122#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
 123#define cpu_notifier(fn, pri)   do { (void)(fn); } while (0)
 124#endif /* #else #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
 125#ifdef CONFIG_HOTPLUG_CPU
 126extern int register_cpu_notifier(struct notifier_block *nb);
 127extern void unregister_cpu_notifier(struct notifier_block *nb);
 128#else
 129
 130#ifndef MODULE
 131extern int register_cpu_notifier(struct notifier_block *nb);
 132#else
 133static inline int register_cpu_notifier(struct notifier_block *nb)
 134{
 135        return 0;
 136}
 137#endif
 138
 139static inline void unregister_cpu_notifier(struct notifier_block *nb)
 140{
 141}
 142#endif
 143
 144int cpu_up(unsigned int cpu);
 145void notify_cpu_starting(unsigned int cpu);
 146extern void cpu_maps_update_begin(void);
 147extern void cpu_maps_update_done(void);
 148
 149#else   /* CONFIG_SMP */
 150
 151#define cpu_notifier(fn, pri)   do { (void)(fn); } while (0)
 152
 153static inline int register_cpu_notifier(struct notifier_block *nb)
 154{
 155        return 0;
 156}
 157
 158static inline void unregister_cpu_notifier(struct notifier_block *nb)
 159{
 160}
 161
 162static inline void cpu_maps_update_begin(void)
 163{
 164}
 165
 166static inline void cpu_maps_update_done(void)
 167{
 168}
 169
 170#endif /* CONFIG_SMP */
 171extern struct bus_type cpu_subsys;
 172
 173#ifdef CONFIG_HOTPLUG_CPU
 174/* Stop CPUs going up and down. */
 175
 176extern void cpu_hotplug_begin(void);
 177extern void cpu_hotplug_done(void);
 178extern void get_online_cpus(void);
 179extern void put_online_cpus(void);
 180extern void cpu_hotplug_disable(void);
 181extern void cpu_hotplug_enable(void);
 182#define hotcpu_notifier(fn, pri)        cpu_notifier(fn, pri)
 183#define register_hotcpu_notifier(nb)    register_cpu_notifier(nb)
 184#define unregister_hotcpu_notifier(nb)  unregister_cpu_notifier(nb)
 185void clear_tasks_mm_cpumask(int cpu);
 186int cpu_down(unsigned int cpu);
 187
 188#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
 189extern void cpu_hotplug_driver_lock(void);
 190extern void cpu_hotplug_driver_unlock(void);
 191#else
 192static inline void cpu_hotplug_driver_lock(void)
 193{
 194}
 195
 196static inline void cpu_hotplug_driver_unlock(void)
 197{
 198}
 199#endif
 200
 201#else           /* CONFIG_HOTPLUG_CPU */
 202
 203static inline void cpu_hotplug_begin(void) {}
 204static inline void cpu_hotplug_done(void) {}
 205#define get_online_cpus()       do { } while (0)
 206#define put_online_cpus()       do { } while (0)
 207#define cpu_hotplug_disable()   do { } while (0)
 208#define cpu_hotplug_enable()    do { } while (0)
 209#define hotcpu_notifier(fn, pri)        do { (void)(fn); } while (0)
 210/* These aren't inline functions due to a GCC bug. */
 211#define register_hotcpu_notifier(nb)    ({ (void)(nb); 0; })
 212#define unregister_hotcpu_notifier(nb)  ({ (void)(nb); })
 213#endif          /* CONFIG_HOTPLUG_CPU */
 214
 215#ifdef CONFIG_PM_SLEEP_SMP
 216extern int disable_nonboot_cpus(void);
 217extern void enable_nonboot_cpus(void);
 218#else /* !CONFIG_PM_SLEEP_SMP */
 219static inline int disable_nonboot_cpus(void) { return 0; }
 220static inline void enable_nonboot_cpus(void) {}
 221#endif /* !CONFIG_PM_SLEEP_SMP */
 222
 223enum cpuhp_state {
 224        CPUHP_OFFLINE,
 225        CPUHP_ONLINE,
 226};
 227
 228void cpu_startup_entry(enum cpuhp_state state);
 229void cpu_idle(void);
 230
 231void cpu_idle_poll_ctrl(bool enable);
 232
 233void arch_cpu_idle(void);
 234void arch_cpu_idle_prepare(void);
 235void arch_cpu_idle_enter(void);
 236void arch_cpu_idle_exit(void);
 237void arch_cpu_idle_dead(void);
 238
 239#endif /* _LINUX_CPU_H_ */
 240