diff options
author | Yinghai Lu <yhlu.kernel@gmail.com> | 2008-08-19 23:49:44 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-16 10:52:03 -0400 |
commit | 1f3fcd4b1adc972d5c6a34cfed98931c46575b49 (patch) | |
tree | a79b6c656a09a8424863a0025d5b20e7264d6999 /include | |
parent | 3ddfda11861d305b02ed810b522dcf48b74ca808 (diff) |
add per_cpu_dyn_array support
allow dyn-array in per_cpu area, allocated dynamically.
usage:
| /* in .h */
| struct kernel_stat {
| struct cpu_usage_stat cpustat;
| unsigned int *irqs;
| };
|
| /* in .c */
| DEFINE_PER_CPU(struct kernel_stat, kstat);
|
| DEFINE_PER_CPU_DYN_ARRAY_ADDR(per_cpu__kstat_irqs, per_cpu__kstat.irqs, sizeof(unsigned int), nr_irqs, sizeof(unsigned long), NULL);
after setup_percpu()/per_cpu_alloc_dyn_array(), the dyn_array in
per_cpu area is ready to use.
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-generic/vmlinux.lds.h | 6 | ||||
-rw-r--r-- | include/linux/init.h | 27 |
2 files changed, 30 insertions, 3 deletions
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 7881406c03ec..c68eda9d9a90 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -216,6 +216,12 @@ | |||
216 | VMLINUX_SYMBOL(__dyn_array_start) = .; \ | 216 | VMLINUX_SYMBOL(__dyn_array_start) = .; \ |
217 | *(.dyn_array.init) \ | 217 | *(.dyn_array.init) \ |
218 | VMLINUX_SYMBOL(__dyn_array_end) = .; \ | 218 | VMLINUX_SYMBOL(__dyn_array_end) = .; \ |
219 | } \ | ||
220 | . = ALIGN((align)); \ | ||
221 | .per_cpu_dyn_array.init : AT(ADDR(.per_cpu_dyn_array.init) - LOAD_OFFSET) { \ | ||
222 | VMLINUX_SYMBOL(__per_cpu_dyn_array_start) = .; \ | ||
223 | *(.per_cpu_dyn_array.init) \ | ||
224 | VMLINUX_SYMBOL(__per_cpu_dyn_array_end) = .; \ | ||
219 | } | 225 | } |
220 | #define SECURITY_INIT \ | 226 | #define SECURITY_INIT \ |
221 | .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ | 227 | .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ |
diff --git a/include/linux/init.h b/include/linux/init.h index cf9fa7f174af..332806826b8e 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
@@ -255,12 +255,13 @@ struct dyn_array { | |||
255 | void (*init_work)(void *); | 255 | void (*init_work)(void *); |
256 | }; | 256 | }; |
257 | extern struct dyn_array *__dyn_array_start[], *__dyn_array_end[]; | 257 | extern struct dyn_array *__dyn_array_start[], *__dyn_array_end[]; |
258 | extern struct dyn_array *__per_cpu_dyn_array_start[], *__per_cpu_dyn_array_end[]; | ||
258 | 259 | ||
259 | #define DEFINE_DYN_ARRAY(nameX, sizeX, nrX, alignX, init_workX) \ | 260 | #define DEFINE_DYN_ARRAY_ADDR(nameX, addrX, sizeX, nrX, alignX, init_workX) \ |
260 | static struct dyn_array __dyn_array_##nameX __initdata = \ | 261 | static struct dyn_array __dyn_array_##nameX __initdata = \ |
261 | { .name = (void **)&nameX,\ | 262 | { .name = (void **)&(nameX),\ |
262 | .size = sizeX,\ | 263 | .size = sizeX,\ |
263 | .nr = &nrX,\ | 264 | .nr = &(nrX),\ |
264 | .align = alignX,\ | 265 | .align = alignX,\ |
265 | .init_work = init_workX,\ | 266 | .init_work = init_workX,\ |
266 | }; \ | 267 | }; \ |
@@ -268,7 +269,27 @@ extern struct dyn_array *__dyn_array_start[], *__dyn_array_end[]; | |||
268 | __attribute__((__section__(".dyn_array.init"))) = \ | 269 | __attribute__((__section__(".dyn_array.init"))) = \ |
269 | &__dyn_array_##nameX | 270 | &__dyn_array_##nameX |
270 | 271 | ||
272 | #define DEFINE_DYN_ARRAY(nameX, sizeX, nrX, alignX, init_workX) \ | ||
273 | DEFINE_DYN_ARRAY_ADDR(nameX, nameX, sizeX, nrX, alignX, init_workX) | ||
274 | |||
275 | #define DEFINE_PER_CPU_DYN_ARRAY_ADDR(nameX, addrX, sizeX, nrX, alignX, init_workX) \ | ||
276 | static struct dyn_array __per_cpu_dyn_array_##nameX __initdata = \ | ||
277 | { .name = (void **)&(addrX),\ | ||
278 | .size = sizeX,\ | ||
279 | .nr = &(nrX),\ | ||
280 | .align = alignX,\ | ||
281 | .init_work = init_workX,\ | ||
282 | }; \ | ||
283 | static struct dyn_array *__per_cpu_dyn_array_ptr_##nameX __used \ | ||
284 | __attribute__((__section__(".per_cpu_dyn_array.init"))) = \ | ||
285 | &__per_cpu_dyn_array_##nameX | ||
286 | |||
287 | #define DEFINE_PER_CPU_DYN_ARRAY(nameX, sizeX, nrX, alignX, init_workX) \ | ||
288 | DEFINE_PER_CPU_DYN_ARRAY_ADDR(nameX, nameX, nrX, alignX, init_workX) | ||
289 | |||
271 | extern void pre_alloc_dyn_array(void); | 290 | extern void pre_alloc_dyn_array(void); |
291 | extern unsigned long per_cpu_dyn_array_size(void); | ||
292 | extern void per_cpu_alloc_dyn_array(int cpu, char *ptr); | ||
272 | #endif /* __ASSEMBLY__ */ | 293 | #endif /* __ASSEMBLY__ */ |
273 | 294 | ||
274 | /** | 295 | /** |