aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-generic
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-03-06 10:44:14 -0500
committerIngo Molnar <mingo@elte.hu>2009-03-06 10:45:01 -0500
commitf0ef03985130287c6c84ebe69416cf790e6cc00e (patch)
tree3ecb04cc4d82e5fc3ae5f1747e6da172ae8cbcb7 /include/asm-generic
parent16097439703bcd38e9fe5608c12add6dacb825ea (diff)
parent31bbed527e7039203920c51c9fb48c27aed0820c (diff)
Merge branch 'x86/core' into tracing/textedit
Conflicts: arch/x86/Kconfig block/blktrace.c kernel/irq/handle.c Semantic conflict: kernel/trace/blktrace.c Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-generic')
-rw-r--r--include/asm-generic/percpu.h52
-rw-r--r--include/asm-generic/sections.h2
-rw-r--r--include/asm-generic/vmlinux.lds.h55
3 files changed, 104 insertions, 5 deletions
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h
index b0e63c672ebd..00f45ff081a6 100644
--- a/include/asm-generic/percpu.h
+++ b/include/asm-generic/percpu.h
@@ -80,4 +80,56 @@ extern void setup_per_cpu_areas(void);
80#define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \ 80#define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \
81 __typeof__(type) per_cpu_var(name) 81 __typeof__(type) per_cpu_var(name)
82 82
83/*
84 * Optional methods for optimized non-lvalue per-cpu variable access.
85 *
86 * @var can be a percpu variable or a field of it and its size should
87 * equal char, int or long. percpu_read() evaluates to a lvalue and
88 * all others to void.
89 *
90 * These operations are guaranteed to be atomic w.r.t. preemption.
91 * The generic versions use plain get/put_cpu_var(). Archs are
92 * encouraged to implement single-instruction alternatives which don't
93 * require preemption protection.
94 */
95#ifndef percpu_read
96# define percpu_read(var) \
97 ({ \
98 typeof(per_cpu_var(var)) __tmp_var__; \
99 __tmp_var__ = get_cpu_var(var); \
100 put_cpu_var(var); \
101 __tmp_var__; \
102 })
103#endif
104
105#define __percpu_generic_to_op(var, val, op) \
106do { \
107 get_cpu_var(var) op val; \
108 put_cpu_var(var); \
109} while (0)
110
111#ifndef percpu_write
112# define percpu_write(var, val) __percpu_generic_to_op(var, (val), =)
113#endif
114
115#ifndef percpu_add
116# define percpu_add(var, val) __percpu_generic_to_op(var, (val), +=)
117#endif
118
119#ifndef percpu_sub
120# define percpu_sub(var, val) __percpu_generic_to_op(var, (val), -=)
121#endif
122
123#ifndef percpu_and
124# define percpu_and(var, val) __percpu_generic_to_op(var, (val), &=)
125#endif
126
127#ifndef percpu_or
128# define percpu_or(var, val) __percpu_generic_to_op(var, (val), |=)
129#endif
130
131#ifndef percpu_xor
132# define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=)
133#endif
134
83#endif /* _ASM_GENERIC_PERCPU_H_ */ 135#endif /* _ASM_GENERIC_PERCPU_H_ */
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index 79a7ff925bf8..4ce48e878530 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -9,7 +9,7 @@ extern char __bss_start[], __bss_stop[];
9extern char __init_begin[], __init_end[]; 9extern char __init_begin[], __init_end[];
10extern char _sinittext[], _einittext[]; 10extern char _sinittext[], _einittext[];
11extern char _end[]; 11extern char _end[];
12extern char __per_cpu_start[], __per_cpu_end[]; 12extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
13extern char __kprobes_text_start[], __kprobes_text_end[]; 13extern char __kprobes_text_start[], __kprobes_text_end[];
14extern char __initdata_begin[], __initdata_end[]; 14extern char __initdata_begin[], __initdata_end[];
15extern char __start_rodata[], __end_rodata[]; 15extern char __start_rodata[], __end_rodata[];
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 0add6b28c366..9d974914e914 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -439,12 +439,59 @@
439 *(.initcall7.init) \ 439 *(.initcall7.init) \
440 *(.initcall7s.init) 440 *(.initcall7s.init)
441 441
442/**
443 * PERCPU_VADDR - define output section for percpu area
444 * @vaddr: explicit base address (optional)
445 * @phdr: destination PHDR (optional)
446 *
447 * Macro which expands to output section for percpu area. If @vaddr
448 * is not blank, it specifies explicit base address and all percpu
449 * symbols will be offset from the given address. If blank, @vaddr
450 * always equals @laddr + LOAD_OFFSET.
451 *
452 * @phdr defines the output PHDR to use if not blank. Be warned that
453 * output PHDR is sticky. If @phdr is specified, the next output
454 * section in the linker script will go there too. @phdr should have
455 * a leading colon.
456 *
457 * Note that this macros defines __per_cpu_load as an absolute symbol.
458 * If there is no need to put the percpu section at a predetermined
459 * address, use PERCPU().
460 */
461#define PERCPU_VADDR(vaddr, phdr) \
462 VMLINUX_SYMBOL(__per_cpu_load) = .; \
463 .data.percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \
464 - LOAD_OFFSET) { \
465 VMLINUX_SYMBOL(__per_cpu_start) = .; \
466 *(.data.percpu.first) \
467 *(.data.percpu.page_aligned) \
468 *(.data.percpu) \
469 *(.data.percpu.shared_aligned) \
470 VMLINUX_SYMBOL(__per_cpu_end) = .; \
471 } phdr \
472 . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data.percpu);
473
474/**
475 * PERCPU - define output section for percpu area, simple version
476 * @align: required alignment
477 *
478 * Align to @align and outputs output section for percpu area. This
479 * macro doesn't maniuplate @vaddr or @phdr and __per_cpu_load and
480 * __per_cpu_start will be identical.
481 *
482 * This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except
483 * that __per_cpu_load is defined as a relative symbol against
484 * .data.percpu which is required for relocatable x86_32
485 * configuration.
486 */
442#define PERCPU(align) \ 487#define PERCPU(align) \
443 . = ALIGN(align); \ 488 . = ALIGN(align); \
444 VMLINUX_SYMBOL(__per_cpu_start) = .; \ 489 .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \
445 .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \ 490 VMLINUX_SYMBOL(__per_cpu_load) = .; \
491 VMLINUX_SYMBOL(__per_cpu_start) = .; \
492 *(.data.percpu.first) \
446 *(.data.percpu.page_aligned) \ 493 *(.data.percpu.page_aligned) \
447 *(.data.percpu) \ 494 *(.data.percpu) \
448 *(.data.percpu.shared_aligned) \ 495 *(.data.percpu.shared_aligned) \
449 } \ 496 VMLINUX_SYMBOL(__per_cpu_end) = .; \
450 VMLINUX_SYMBOL(__per_cpu_end) = .; 497 }