Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
cpu.h
Go to the documentation of this file.
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
21
struct
device
;
22
23
struct
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
29
extern
int
register_cpu
(
struct
cpu
*
cpu
,
int
num);
30
extern
struct
device
*
get_cpu_device
(
unsigned
cpu
);
31
extern
bool
cpu_is_hotpluggable
(
unsigned
cpu
);
32
33
extern
int
cpu_add_dev_attr
(
struct
device_attribute
*
attr
);
34
extern
void
cpu_remove_dev_attr
(
struct
device_attribute
*
attr
);
35
36
extern
int
cpu_add_dev_attr_group
(
struct
attribute_group
*attrs);
37
extern
void
cpu_remove_dev_attr_group
(
struct
attribute_group
*attrs);
38
39
#ifdef CONFIG_HOTPLUG_CPU
40
extern
void
unregister_cpu(
struct
cpu
*
cpu
);
41
extern
ssize_t
arch_cpu_probe(
const
char
*,
size_t
);
42
extern
ssize_t
arch_cpu_release(
const
char
*,
size_t
);
43
#endif
44
struct
notifier_block
;
45
46
#ifdef CONFIG_ARCH_HAS_CPU_AUTOPROBE
47
extern
int
arch_cpu_uevent
(
struct
device
*
dev
,
struct
kobj_uevent_env
*
env
);
48
extern
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
*/
56
enum
{
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
126
extern
int
register_cpu_notifier(
struct
notifier_block
*nb);
127
extern
void
unregister_cpu_notifier(
struct
notifier_block
*nb);
128
#else
129
130
#ifndef MODULE
131
extern
int
register_cpu_notifier(
struct
notifier_block
*nb);
132
#else
133
static
inline
int
register_cpu_notifier(
struct
notifier_block
*nb)
134
{
135
return
0;
136
}
137
#endif
138
139
static
inline
void
unregister_cpu_notifier(
struct
notifier_block
*nb)
140
{
141
}
142
#endif
143
144
int
cpu_up(
unsigned
int
cpu
);
145
void
notify_cpu_starting(
unsigned
int
cpu
);
146
extern
void
cpu_maps_update_begin(
void
);
147
extern
void
cpu_maps_update_done(
void
);
148
149
#else
/* CONFIG_SMP */
150
151
#define cpu_notifier(fn, pri) do { (void)(fn); } while (0)
152
153
static
inline
int
register_cpu_notifier(
struct
notifier_block
*nb)
154
{
155
return
0;
156
}
157
158
static
inline
void
unregister_cpu_notifier(
struct
notifier_block
*nb)
159
{
160
}
161
162
static
inline
void
cpu_maps_update_begin(
void
)
163
{
164
}
165
166
static
inline
void
cpu_maps_update_done(
void
)
167
{
168
}
169
170
#endif
/* CONFIG_SMP */
171
extern
struct
bus_type
cpu_subsys
;
172
173
#ifdef CONFIG_HOTPLUG_CPU
174
/* Stop CPUs going up and down. */
175
176
extern
void
get_online_cpus
(
void
);
177
extern
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)
181
void
clear_tasks_mm_cpumask(
int
cpu
);
182
int
cpu_down(
unsigned
int
cpu
);
183
184
#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
185
extern
void
cpu_hotplug_driver_lock(
void
);
186
extern
void
cpu_hotplug_driver_unlock(
void
);
187
#else
188
static
inline
void
cpu_hotplug_driver_lock(
void
)
189
{
190
}
191
192
static
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
208
extern
int
disable_nonboot_cpus(
void
);
209
extern
void
enable_nonboot_cpus(
void
);
210
#else
/* !CONFIG_PM_SLEEP_SMP */
211
static
inline
int
disable_nonboot_cpus(
void
) {
return
0; }
212
static
inline
void
enable_nonboot_cpus(
void
) {}
213
#endif
/* !CONFIG_PM_SLEEP_SMP */
214
215
#endif
/* _LINUX_CPU_H_ */
Generated on Thu Jan 10 2013 12:55:04 for Linux Kernel by
1.8.2