at v3.2-rc4 6.5 kB view raw
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/sysdev.h> 18#include <linux/node.h> 19#include <linux/compiler.h> 20#include <linux/cpumask.h> 21 22struct cpu { 23 int node_id; /* The node which contains the CPU */ 24 int hotpluggable; /* creates sysfs control file if hotpluggable */ 25 struct sys_device sysdev; 26}; 27 28extern int register_cpu(struct cpu *cpu, int num); 29extern struct sys_device *get_cpu_sysdev(unsigned cpu); 30 31extern int cpu_add_sysdev_attr(struct sysdev_attribute *attr); 32extern void cpu_remove_sysdev_attr(struct sysdev_attribute *attr); 33 34extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs); 35extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs); 36 37extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls); 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/* 47 * CPU notifier priorities. 48 */ 49enum { 50 /* 51 * SCHED_ACTIVE marks a cpu which is coming up active during 52 * CPU_ONLINE and CPU_DOWN_FAILED and must be the first 53 * notifier. CPUSET_ACTIVE adjusts cpuset according to 54 * cpu_active mask right after SCHED_ACTIVE. During 55 * CPU_DOWN_PREPARE, SCHED_INACTIVE and CPUSET_INACTIVE are 56 * ordered in the similar way. 57 * 58 * This ordering guarantees consistent cpu_active mask and 59 * migration behavior to all cpu notifiers. 60 */ 61 CPU_PRI_SCHED_ACTIVE = INT_MAX, 62 CPU_PRI_CPUSET_ACTIVE = INT_MAX - 1, 63 CPU_PRI_SCHED_INACTIVE = INT_MIN + 1, 64 CPU_PRI_CPUSET_INACTIVE = INT_MIN, 65 66 /* migration should happen before other stuff but after perf */ 67 CPU_PRI_PERF = 20, 68 CPU_PRI_MIGRATION = 10, 69 /* prepare workqueues for other notifiers */ 70 CPU_PRI_WORKQUEUE = 5, 71}; 72 73#define CPU_ONLINE 0x0002 /* CPU (unsigned)v is up */ 74#define CPU_UP_PREPARE 0x0003 /* CPU (unsigned)v coming up */ 75#define CPU_UP_CANCELED 0x0004 /* CPU (unsigned)v NOT coming up */ 76#define CPU_DOWN_PREPARE 0x0005 /* CPU (unsigned)v going down */ 77#define CPU_DOWN_FAILED 0x0006 /* CPU (unsigned)v NOT going down */ 78#define CPU_DEAD 0x0007 /* CPU (unsigned)v dead */ 79#define CPU_DYING 0x0008 /* CPU (unsigned)v not running any task, 80 * not handling interrupts, soon dead. 81 * Called on the dying cpu, interrupts 82 * are already disabled. Must not 83 * sleep, must not fail */ 84#define CPU_POST_DEAD 0x0009 /* CPU (unsigned)v dead, cpu_hotplug 85 * lock is dropped */ 86#define CPU_STARTING 0x000A /* CPU (unsigned)v soon running. 87 * Called on the new cpu, just before 88 * enabling interrupts. Must not sleep, 89 * must not fail */ 90 91/* Used for CPU hotplug events occurring while tasks are frozen due to a suspend 92 * operation in progress 93 */ 94#define CPU_TASKS_FROZEN 0x0010 95 96#define CPU_ONLINE_FROZEN (CPU_ONLINE | CPU_TASKS_FROZEN) 97#define CPU_UP_PREPARE_FROZEN (CPU_UP_PREPARE | CPU_TASKS_FROZEN) 98#define CPU_UP_CANCELED_FROZEN (CPU_UP_CANCELED | CPU_TASKS_FROZEN) 99#define CPU_DOWN_PREPARE_FROZEN (CPU_DOWN_PREPARE | CPU_TASKS_FROZEN) 100#define CPU_DOWN_FAILED_FROZEN (CPU_DOWN_FAILED | CPU_TASKS_FROZEN) 101#define CPU_DEAD_FROZEN (CPU_DEAD | CPU_TASKS_FROZEN) 102#define CPU_DYING_FROZEN (CPU_DYING | CPU_TASKS_FROZEN) 103#define CPU_STARTING_FROZEN (CPU_STARTING | CPU_TASKS_FROZEN) 104 105 106#ifdef CONFIG_SMP 107/* Need to know about CPUs going up/down? */ 108#if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) 109#define cpu_notifier(fn, pri) { \ 110 static struct notifier_block fn##_nb __cpuinitdata = \ 111 { .notifier_call = fn, .priority = pri }; \ 112 register_cpu_notifier(&fn##_nb); \ 113} 114#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */ 115#define cpu_notifier(fn, pri) do { (void)(fn); } while (0) 116#endif /* #else #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */ 117#ifdef CONFIG_HOTPLUG_CPU 118extern int register_cpu_notifier(struct notifier_block *nb); 119extern void unregister_cpu_notifier(struct notifier_block *nb); 120#else 121 122#ifndef MODULE 123extern int register_cpu_notifier(struct notifier_block *nb); 124#else 125static inline int register_cpu_notifier(struct notifier_block *nb) 126{ 127 return 0; 128} 129#endif 130 131static inline void unregister_cpu_notifier(struct notifier_block *nb) 132{ 133} 134#endif 135 136int cpu_up(unsigned int cpu); 137void notify_cpu_starting(unsigned int cpu); 138extern void cpu_maps_update_begin(void); 139extern void cpu_maps_update_done(void); 140 141#else /* CONFIG_SMP */ 142 143#define cpu_notifier(fn, pri) do { (void)(fn); } while (0) 144 145static inline int register_cpu_notifier(struct notifier_block *nb) 146{ 147 return 0; 148} 149 150static inline void unregister_cpu_notifier(struct notifier_block *nb) 151{ 152} 153 154static inline void cpu_maps_update_begin(void) 155{ 156} 157 158static inline void cpu_maps_update_done(void) 159{ 160} 161 162#endif /* CONFIG_SMP */ 163extern struct sysdev_class cpu_sysdev_class; 164 165#ifdef CONFIG_HOTPLUG_CPU 166/* Stop CPUs going up and down. */ 167 168extern void get_online_cpus(void); 169extern void put_online_cpus(void); 170#define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) 171#define register_hotcpu_notifier(nb) register_cpu_notifier(nb) 172#define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) 173int cpu_down(unsigned int cpu); 174 175#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE 176extern void cpu_hotplug_driver_lock(void); 177extern void cpu_hotplug_driver_unlock(void); 178#else 179static inline void cpu_hotplug_driver_lock(void) 180{ 181} 182 183static inline void cpu_hotplug_driver_unlock(void) 184{ 185} 186#endif 187 188#else /* CONFIG_HOTPLUG_CPU */ 189 190#define get_online_cpus() do { } while (0) 191#define put_online_cpus() do { } while (0) 192#define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0) 193/* These aren't inline functions due to a GCC bug. */ 194#define register_hotcpu_notifier(nb) ({ (void)(nb); 0; }) 195#define unregister_hotcpu_notifier(nb) ({ (void)(nb); }) 196#endif /* CONFIG_HOTPLUG_CPU */ 197 198#ifdef CONFIG_PM_SLEEP_SMP 199extern int disable_nonboot_cpus(void); 200extern void enable_nonboot_cpus(void); 201#else /* !CONFIG_PM_SLEEP_SMP */ 202static inline int disable_nonboot_cpus(void) { return 0; } 203static inline void enable_nonboot_cpus(void) {} 204#endif /* !CONFIG_PM_SLEEP_SMP */ 205 206#endif /* _LINUX_CPU_H_ */