diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-16 11:22:41 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-16 11:22:41 -0400 |
commit | 79d8a8f736151b12129984b1250fd708440e742c (patch) | |
tree | f67eebe2bafca8820955ee9f851985a41fb32e66 /include/asm-generic | |
parent | bd2895eeade5f11f3e5906283c630bbdb4b57454 (diff) | |
parent | b9ec40af0e18fb7d02106be148036c2ea490fdf9 (diff) |
Merge branch 'for-2.6.39' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
* 'for-2.6.39' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu:
percpu, x86: Add arch-specific this_cpu_cmpxchg_double() support
percpu: Generic support for this_cpu_cmpxchg_double()
alpha: use L1_CACHE_BYTES for cacheline size in the linker script
percpu: align percpu readmostly subsection to cacheline
Fix up trivial conflict in arch/x86/kernel/vmlinux.lds.S due to the
percpu alignment having changed ("x86: Reduce back the alignment of the
per-CPU data section")
Diffstat (limited to 'include/asm-generic')
-rw-r--r-- | include/asm-generic/vmlinux.lds.h | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 906c3ceca9a2..32c45e5fe0ab 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -15,7 +15,7 @@ | |||
15 | * HEAD_TEXT_SECTION | 15 | * HEAD_TEXT_SECTION |
16 | * INIT_TEXT_SECTION(PAGE_SIZE) | 16 | * INIT_TEXT_SECTION(PAGE_SIZE) |
17 | * INIT_DATA_SECTION(...) | 17 | * INIT_DATA_SECTION(...) |
18 | * PERCPU(PAGE_SIZE) | 18 | * PERCPU(CACHELINE_SIZE, PAGE_SIZE) |
19 | * __init_end = .; | 19 | * __init_end = .; |
20 | * | 20 | * |
21 | * _stext = .; | 21 | * _stext = .; |
@@ -689,13 +689,18 @@ | |||
689 | 689 | ||
690 | /** | 690 | /** |
691 | * PERCPU_VADDR - define output section for percpu area | 691 | * PERCPU_VADDR - define output section for percpu area |
692 | * @cacheline: cacheline size | ||
692 | * @vaddr: explicit base address (optional) | 693 | * @vaddr: explicit base address (optional) |
693 | * @phdr: destination PHDR (optional) | 694 | * @phdr: destination PHDR (optional) |
694 | * | 695 | * |
695 | * Macro which expands to output section for percpu area. If @vaddr | 696 | * Macro which expands to output section for percpu area. |
696 | * is not blank, it specifies explicit base address and all percpu | 697 | * |
697 | * symbols will be offset from the given address. If blank, @vaddr | 698 | * @cacheline is used to align subsections to avoid false cacheline |
698 | * always equals @laddr + LOAD_OFFSET. | 699 | * sharing between subsections for different purposes. |
700 | * | ||
701 | * If @vaddr is not blank, it specifies explicit base address and all | ||
702 | * percpu symbols will be offset from the given address. If blank, | ||
703 | * @vaddr always equals @laddr + LOAD_OFFSET. | ||
699 | * | 704 | * |
700 | * @phdr defines the output PHDR to use if not blank. Be warned that | 705 | * @phdr defines the output PHDR to use if not blank. Be warned that |
701 | * output PHDR is sticky. If @phdr is specified, the next output | 706 | * output PHDR is sticky. If @phdr is specified, the next output |
@@ -706,7 +711,7 @@ | |||
706 | * If there is no need to put the percpu section at a predetermined | 711 | * If there is no need to put the percpu section at a predetermined |
707 | * address, use PERCPU(). | 712 | * address, use PERCPU(). |
708 | */ | 713 | */ |
709 | #define PERCPU_VADDR(vaddr, phdr) \ | 714 | #define PERCPU_VADDR(cacheline, vaddr, phdr) \ |
710 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ | 715 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ |
711 | .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ | 716 | .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ |
712 | - LOAD_OFFSET) { \ | 717 | - LOAD_OFFSET) { \ |
@@ -714,7 +719,9 @@ | |||
714 | *(.data..percpu..first) \ | 719 | *(.data..percpu..first) \ |
715 | . = ALIGN(PAGE_SIZE); \ | 720 | . = ALIGN(PAGE_SIZE); \ |
716 | *(.data..percpu..page_aligned) \ | 721 | *(.data..percpu..page_aligned) \ |
722 | . = ALIGN(cacheline); \ | ||
717 | *(.data..percpu..readmostly) \ | 723 | *(.data..percpu..readmostly) \ |
724 | . = ALIGN(cacheline); \ | ||
718 | *(.data..percpu) \ | 725 | *(.data..percpu) \ |
719 | *(.data..percpu..shared_aligned) \ | 726 | *(.data..percpu..shared_aligned) \ |
720 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ | 727 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ |
@@ -723,18 +730,18 @@ | |||
723 | 730 | ||
724 | /** | 731 | /** |
725 | * PERCPU - define output section for percpu area, simple version | 732 | * PERCPU - define output section for percpu area, simple version |
733 | * @cacheline: cacheline size | ||
726 | * @align: required alignment | 734 | * @align: required alignment |
727 | * | 735 | * |
728 | * Align to @align and outputs output section for percpu area. This | 736 | * Align to @align and outputs output section for percpu area. This macro |
729 | * macro doesn't maniuplate @vaddr or @phdr and __per_cpu_load and | 737 | * doesn't manipulate @vaddr or @phdr and __per_cpu_load and |
730 | * __per_cpu_start will be identical. | 738 | * __per_cpu_start will be identical. |
731 | * | 739 | * |
732 | * This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except | 740 | * This macro is equivalent to ALIGN(@align); PERCPU_VADDR(@cacheline,,) |
733 | * that __per_cpu_load is defined as a relative symbol against | 741 | * except that __per_cpu_load is defined as a relative symbol against |
734 | * .data..percpu which is required for relocatable x86_32 | 742 | * .data..percpu which is required for relocatable x86_32 configuration. |
735 | * configuration. | ||
736 | */ | 743 | */ |
737 | #define PERCPU(align) \ | 744 | #define PERCPU(cacheline, align) \ |
738 | . = ALIGN(align); \ | 745 | . = ALIGN(align); \ |
739 | .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ | 746 | .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ |
740 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ | 747 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ |
@@ -742,7 +749,9 @@ | |||
742 | *(.data..percpu..first) \ | 749 | *(.data..percpu..first) \ |
743 | . = ALIGN(PAGE_SIZE); \ | 750 | . = ALIGN(PAGE_SIZE); \ |
744 | *(.data..percpu..page_aligned) \ | 751 | *(.data..percpu..page_aligned) \ |
752 | . = ALIGN(cacheline); \ | ||
745 | *(.data..percpu..readmostly) \ | 753 | *(.data..percpu..readmostly) \ |
754 | . = ALIGN(cacheline); \ | ||
746 | *(.data..percpu) \ | 755 | *(.data..percpu) \ |
747 | *(.data..percpu..shared_aligned) \ | 756 | *(.data..percpu..shared_aligned) \ |
748 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ | 757 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ |