Blame view

include/linux/cpu.h 6.34 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
  /*
   * include/linux/cpu.h - generic cpu definition
   *
   * This is mainly for topological representation. We define the 
   * basic 'struct cpu' here, which can be embedded in per-arch 
   * definitions of processors.
   *
   * Basic handling of the devices is done in drivers/base/cpu.c
   * and system devices are handled in drivers/base/sys.c. 
   *
d51fe1be3   Rolf Eike Beer   [PATCH] remove dr...
11
   * CPUs are exported via sysfs in the class/cpu/devices/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
   * directory. 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
   */
  #ifndef _LINUX_CPU_H_
  #define _LINUX_CPU_H_
8a25a2fd1   Kay Sievers   cpu: convert 'cpu...
16
  #include <linux/device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
  #include <linux/node.h>
  #include <linux/compiler.h>
  #include <linux/cpumask.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
22
  
  struct cpu {
  	int node_id;		/* The node which contains the CPU */
72486f1f8   Siddha, Suresh B   [PATCH] i386: cha...
23
  	int hotpluggable;	/* creates sysfs control file if hotpluggable */
8a25a2fd1   Kay Sievers   cpu: convert 'cpu...
24
  	struct device dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  };
76b67ed9d   KAMEZAWA Hiroyuki   [PATCH] node hotp...
26
  extern int register_cpu(struct cpu *cpu, int num);
8a25a2fd1   Kay Sievers   cpu: convert 'cpu...
27
  extern struct device *get_cpu_device(unsigned cpu);
2987557f5   Josh Triplett   driver-core/cpu: ...
28
  extern bool cpu_is_hotpluggable(unsigned cpu);
0344c6c53   Christian Krafft   [POWERPC] sysfs: ...
29

8a25a2fd1   Kay Sievers   cpu: convert 'cpu...
30
31
  extern int cpu_add_dev_attr(struct device_attribute *attr);
  extern void cpu_remove_dev_attr(struct device_attribute *attr);
0344c6c53   Christian Krafft   [POWERPC] sysfs: ...
32

8a25a2fd1   Kay Sievers   cpu: convert 'cpu...
33
34
  extern int cpu_add_dev_attr_group(struct attribute_group *attrs);
  extern void cpu_remove_dev_attr_group(struct attribute_group *attrs);
0344c6c53   Christian Krafft   [POWERPC] sysfs: ...
35

8a25a2fd1   Kay Sievers   cpu: convert 'cpu...
36
  extern int sched_create_sysfs_power_savings_entries(struct device *dev);
0344c6c53   Christian Krafft   [POWERPC] sysfs: ...
37

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  #ifdef CONFIG_HOTPLUG_CPU
76b67ed9d   KAMEZAWA Hiroyuki   [PATCH] node hotp...
39
  extern void unregister_cpu(struct cpu *cpu);
12633e803   Nathan Fontenot   sysfs/cpu: Add pr...
40
41
  extern ssize_t arch_cpu_probe(const char *, size_t);
  extern ssize_t arch_cpu_release(const char *, size_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
  #endif
  struct notifier_block;
50a323b73   Tejun Heo   sched: define and...
44
45
46
47
  /*
   * CPU notifier priorities.
   */
  enum {
3a101d054   Tejun Heo   sched: adjust whe...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  	/*
  	 * SCHED_ACTIVE marks a cpu which is coming up active during
  	 * CPU_ONLINE and CPU_DOWN_FAILED and must be the first
  	 * notifier.  CPUSET_ACTIVE adjusts cpuset according to
  	 * cpu_active mask right after SCHED_ACTIVE.  During
  	 * CPU_DOWN_PREPARE, SCHED_INACTIVE and CPUSET_INACTIVE are
  	 * ordered in the similar way.
  	 *
  	 * This ordering guarantees consistent cpu_active mask and
  	 * migration behavior to all cpu notifiers.
  	 */
  	CPU_PRI_SCHED_ACTIVE	= INT_MAX,
  	CPU_PRI_CPUSET_ACTIVE	= INT_MAX - 1,
  	CPU_PRI_SCHED_INACTIVE	= INT_MIN + 1,
  	CPU_PRI_CPUSET_INACTIVE	= INT_MIN,
50a323b73   Tejun Heo   sched: define and...
63
64
65
  	/* migration should happen before other stuff but after perf */
  	CPU_PRI_PERF		= 20,
  	CPU_PRI_MIGRATION	= 10,
db7bccf45   Tejun Heo   workqueue: reimpl...
66
67
  	/* prepare workqueues for other notifiers */
  	CPU_PRI_WORKQUEUE	= 5,
50a323b73   Tejun Heo   sched: define and...
68
  };
80f1ff97d   Amerigo Wang   notifiers: cpu: m...
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  #define CPU_ONLINE		0x0002 /* CPU (unsigned)v is up */
  #define CPU_UP_PREPARE		0x0003 /* CPU (unsigned)v coming up */
  #define CPU_UP_CANCELED		0x0004 /* CPU (unsigned)v NOT coming up */
  #define CPU_DOWN_PREPARE	0x0005 /* CPU (unsigned)v going down */
  #define CPU_DOWN_FAILED		0x0006 /* CPU (unsigned)v NOT going down */
  #define CPU_DEAD		0x0007 /* CPU (unsigned)v dead */
  #define CPU_DYING		0x0008 /* CPU (unsigned)v not running any task,
  					* not handling interrupts, soon dead.
  					* Called on the dying cpu, interrupts
  					* are already disabled. Must not
  					* sleep, must not fail */
  #define CPU_POST_DEAD		0x0009 /* CPU (unsigned)v dead, cpu_hotplug
  					* lock is dropped */
  #define CPU_STARTING		0x000A /* CPU (unsigned)v soon running.
  					* Called on the new cpu, just before
  					* enabling interrupts. Must not sleep,
  					* must not fail */
  
  /* Used for CPU hotplug events occurring while tasks are frozen due to a suspend
   * operation in progress
   */
  #define CPU_TASKS_FROZEN	0x0010
  
  #define CPU_ONLINE_FROZEN	(CPU_ONLINE | CPU_TASKS_FROZEN)
  #define CPU_UP_PREPARE_FROZEN	(CPU_UP_PREPARE | CPU_TASKS_FROZEN)
  #define CPU_UP_CANCELED_FROZEN	(CPU_UP_CANCELED | CPU_TASKS_FROZEN)
  #define CPU_DOWN_PREPARE_FROZEN	(CPU_DOWN_PREPARE | CPU_TASKS_FROZEN)
  #define CPU_DOWN_FAILED_FROZEN	(CPU_DOWN_FAILED | CPU_TASKS_FROZEN)
  #define CPU_DEAD_FROZEN		(CPU_DEAD | CPU_TASKS_FROZEN)
  #define CPU_DYING_FROZEN	(CPU_DYING | CPU_TASKS_FROZEN)
  #define CPU_STARTING_FROZEN	(CPU_STARTING | CPU_TASKS_FROZEN)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
  #ifdef CONFIG_SMP
  /* Need to know about CPUs going up/down? */
799e64f05   Paul E. McKenney   cpu hotplug: Intr...
102
103
104
105
106
107
108
109
110
  #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE)
  #define cpu_notifier(fn, pri) {					\
  	static struct notifier_block fn##_nb __cpuinitdata =	\
  		{ .notifier_call = fn, .priority = pri };	\
  	register_cpu_notifier(&fn##_nb);			\
  }
  #else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
  #define cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
  #endif /* #else #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
65edc68c3   Chandra Seetharaman   [PATCH] cpu hotpl...
111
  #ifdef CONFIG_HOTPLUG_CPU
47e627bc8   Avi Kivity   [PATCH] hotplug: ...
112
  extern int register_cpu_notifier(struct notifier_block *nb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
  extern void unregister_cpu_notifier(struct notifier_block *nb);
65edc68c3   Chandra Seetharaman   [PATCH] cpu hotpl...
114
  #else
47e627bc8   Avi Kivity   [PATCH] hotplug: ...
115
116
117
118
119
120
121
122
123
  
  #ifndef MODULE
  extern int register_cpu_notifier(struct notifier_block *nb);
  #else
  static inline int register_cpu_notifier(struct notifier_block *nb)
  {
  	return 0;
  }
  #endif
65edc68c3   Chandra Seetharaman   [PATCH] cpu hotpl...
124
125
126
127
  static inline void unregister_cpu_notifier(struct notifier_block *nb)
  {
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
129
  
  int cpu_up(unsigned int cpu);
e545a6140   Manfred Spraul   kernel/cpu.c: cre...
130
  void notify_cpu_starting(unsigned int cpu);
3da1c84c0   Oleg Nesterov   workqueues: make ...
131
132
  extern void cpu_maps_update_begin(void);
  extern void cpu_maps_update_done(void);
d0d23b543   Ingo Molnar   cpu-hotplug: fix ...
133

3da1c84c0   Oleg Nesterov   workqueues: make ...
134
  #else	/* CONFIG_SMP */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135

799e64f05   Paul E. McKenney   cpu hotplug: Intr...
136
  #define cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
138
139
140
  static inline int register_cpu_notifier(struct notifier_block *nb)
  {
  	return 0;
  }
d0d23b543   Ingo Molnar   cpu-hotplug: fix ...
141

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
144
  static inline void unregister_cpu_notifier(struct notifier_block *nb)
  {
  }
3da1c84c0   Oleg Nesterov   workqueues: make ...
145
146
147
148
149
150
151
  static inline void cpu_maps_update_begin(void)
  {
  }
  
  static inline void cpu_maps_update_done(void)
  {
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
  #endif /* CONFIG_SMP */
8a25a2fd1   Kay Sievers   cpu: convert 'cpu...
153
  extern struct bus_type cpu_subsys;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
156
  
  #ifdef CONFIG_HOTPLUG_CPU
  /* Stop CPUs going up and down. */
f7dff2b12   Gautham R Shenoy   [PATCH] Handle pe...
157

86ef5c9a8   Gautham R Shenoy   cpu-hotplug: repl...
158
159
  extern void get_online_cpus(void);
  extern void put_online_cpus(void);
799e64f05   Paul E. McKenney   cpu hotplug: Intr...
160
  #define hotcpu_notifier(fn, pri)	cpu_notifier(fn, pri)
39f4885c5   Chandra Seetharaman   [PATCH] cpu hotpl...
161
162
  #define register_hotcpu_notifier(nb)	register_cpu_notifier(nb)
  #define unregister_hotcpu_notifier(nb)	unregister_cpu_notifier(nb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
  int cpu_down(unsigned int cpu);
f7dff2b12   Gautham R Shenoy   [PATCH] Handle pe...
164

51badebdc   Gautham R Shenoy   powerpc/pseries: ...
165
166
167
168
169
170
171
172
173
174
175
176
  #ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
  extern void cpu_hotplug_driver_lock(void);
  extern void cpu_hotplug_driver_unlock(void);
  #else
  static inline void cpu_hotplug_driver_lock(void)
  {
  }
  
  static inline void cpu_hotplug_driver_unlock(void)
  {
  }
  #endif
f7dff2b12   Gautham R Shenoy   [PATCH] Handle pe...
177
  #else		/* CONFIG_HOTPLUG_CPU */
86ef5c9a8   Gautham R Shenoy   cpu-hotplug: repl...
178
179
  #define get_online_cpus()	do { } while (0)
  #define put_online_cpus()	do { } while (0)
023160678   Ingo Molnar   [PATCH] hotplug C...
180
  #define hotcpu_notifier(fn, pri)	do { (void)(fn); } while (0)
761bb4319   Satyam Sharma   Redefine {un}regi...
181
182
183
  /* These aren't inline functions due to a GCC bug. */
  #define register_hotcpu_notifier(nb)	({ (void)(nb); 0; })
  #define unregister_hotcpu_notifier(nb)	({ (void)(nb); })
f7dff2b12   Gautham R Shenoy   [PATCH] Handle pe...
184
  #endif		/* CONFIG_HOTPLUG_CPU */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185

f3de4be9d   Rafael J. Wysocki   PM: Fix dependenc...
186
  #ifdef CONFIG_PM_SLEEP_SMP
e3920fb42   Rafael J. Wysocki   [PATCH] Disable C...
187
188
  extern int disable_nonboot_cpus(void);
  extern void enable_nonboot_cpus(void);
f3de4be9d   Rafael J. Wysocki   PM: Fix dependenc...
189
  #else /* !CONFIG_PM_SLEEP_SMP */
e3920fb42   Rafael J. Wysocki   [PATCH] Disable C...
190
191
  static inline int disable_nonboot_cpus(void) { return 0; }
  static inline void enable_nonboot_cpus(void) {}
f3de4be9d   Rafael J. Wysocki   PM: Fix dependenc...
192
  #endif /* !CONFIG_PM_SLEEP_SMP */
e3920fb42   Rafael J. Wysocki   [PATCH] Disable C...
193

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  #endif /* _LINUX_CPU_H_ */