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 * and system devices are handled in drivers/base/sys.c. 
  10 *
  11 * CPUs are exported via sysfs in the class/cpu/devices/
  12 * directory. 
  13 */
  14#ifndef _LINUX_CPU_H_
  15#define _LINUX_CPU_H_
  16
  17#include <linux/node.h>
  18#include <linux/compiler.h>
  19#include <linux/cpumask.h>
  20
  21struct device;
  22
  23struct cpu {
  24        int node_id;            /* The node which contains the CPU */
  25        int hotpluggable;       /* creates sysfs control file if hotpluggable */
  26        struct device dev;
  27};
  28
  29extern int register_cpu(struct cpu *cpu, int num);
  30extern struct device *get_cpu_device(unsigned cpu);
  31extern bool cpu_is_hotpluggable(unsigned cpu);
  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 __cpuinitdata =    \
 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 get_online_cpus(void);
 177extern void put_online_cpus(void);
 178#define hotcpu_notifier(fn, pri)        cpu_notifier(fn, pri)
 179#define register_hotcpu_notifier(nb)    register_cpu_notifier(nb)
 180#define unregister_hotcpu_notifier(nb)  unregister_cpu_notifier(nb)
 181void clear_tasks_mm_cpumask(int cpu);
 182int cpu_down(unsigned int cpu);
 183
 184#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
 185extern void cpu_hotplug_driver_lock(void);
 186extern void cpu_hotplug_driver_unlock(void);
 187#else
 188static inline void cpu_hotplug_driver_lock(void)
 189{
 190}
 191
 192static inline void cpu_hotplug_driver_unlock(void)
 193{
 194}
 195#endif
 196
 197#else           /* CONFIG_HOTPLUG_CPU */
 198
 199#define get_online_cpus()       do { } while (0)
 200#define put_online_cpus()       do { } while (0)
 201#define hotcpu_notifier(fn, pri)        do { (void)(fn); } while (0)
 202/* These aren't inline functions due to a GCC bug. */
 203#define register_hotcpu_notifier(nb)    ({ (void)(nb); 0; })
 204#define unregister_hotcpu_notifier(nb)  ({ (void)(nb); })
 205#endif          /* CONFIG_HOTPLUG_CPU */
 206
 207#ifdef CONFIG_PM_SLEEP_SMP
 208extern int disable_nonboot_cpus(void);
 209extern void enable_nonboot_cpus(void);
 210#else /* !CONFIG_PM_SLEEP_SMP */
 211static inline int disable_nonboot_cpus(void) { return 0; }
 212static inline void enable_nonboot_cpus(void) {}
 213#endif /* !CONFIG_PM_SLEEP_SMP */
 214
 215#endif /* _LINUX_CPU_H_ */
 216