diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-15 12:39:44 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-15 12:39:44 -0400 |
| commit | ada3fa15057205b7d3f727bba5cd26b5912e350f (patch) | |
| tree | 60962fc9e4021b92f484d1a58e72cd3906d4f3db /arch/alpha | |
| parent | 2f82af08fcc7dc01a7e98a49a5995a77e32a2925 (diff) | |
| parent | 5579fd7e6aed8860ea0c8e3f11897493153b10ad (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu: (46 commits)
powerpc64: convert to dynamic percpu allocator
sparc64: use embedding percpu first chunk allocator
percpu: kill lpage first chunk allocator
x86,percpu: use embedding for 64bit NUMA and page for 32bit NUMA
percpu: update embedding first chunk allocator to handle sparse units
percpu: use group information to allocate vmap areas sparsely
vmalloc: implement pcpu_get_vm_areas()
vmalloc: separate out insert_vmalloc_vm()
percpu: add chunk->base_addr
percpu: add pcpu_unit_offsets[]
percpu: introduce pcpu_alloc_info and pcpu_group_info
percpu: move pcpu_lpage_build_unit_map() and pcpul_lpage_dump_cfg() upward
percpu: add @align to pcpu_fc_alloc_fn_t
percpu: make @dyn_size mandatory for pcpu_setup_first_chunk()
percpu: drop @static_size from first chunk allocators
percpu: generalize first chunk allocator selection
percpu: build first chunk allocators selectively
percpu: rename 4k first chunk allocator to page
percpu: improve boot messages
percpu: fix pcpu_reclaim() locking
...
Fix trivial conflict as by Tejun Heo in kernel/sched.c
Diffstat (limited to 'arch/alpha')
| -rw-r--r-- | arch/alpha/include/asm/percpu.h | 100 | ||||
| -rw-r--r-- | arch/alpha/include/asm/tlbflush.h | 1 | ||||
| -rw-r--r-- | arch/alpha/kernel/vmlinux.lds.S | 9 |
3 files changed, 11 insertions, 99 deletions
diff --git a/arch/alpha/include/asm/percpu.h b/arch/alpha/include/asm/percpu.h index b663f1f10b6a..2c12378e3aa9 100644 --- a/arch/alpha/include/asm/percpu.h +++ b/arch/alpha/include/asm/percpu.h | |||
| @@ -1,102 +1,18 @@ | |||
| 1 | #ifndef __ALPHA_PERCPU_H | 1 | #ifndef __ALPHA_PERCPU_H |
| 2 | #define __ALPHA_PERCPU_H | 2 | #define __ALPHA_PERCPU_H |
| 3 | 3 | ||
| 4 | #include <linux/compiler.h> | ||
| 5 | #include <linux/threads.h> | ||
| 6 | #include <linux/percpu-defs.h> | ||
| 7 | |||
| 8 | /* | ||
| 9 | * Determine the real variable name from the name visible in the | ||
| 10 | * kernel sources. | ||
| 11 | */ | ||
| 12 | #define per_cpu_var(var) per_cpu__##var | ||
| 13 | |||
| 14 | #ifdef CONFIG_SMP | ||
| 15 | |||
| 16 | /* | ||
| 17 | * per_cpu_offset() is the offset that has to be added to a | ||
| 18 | * percpu variable to get to the instance for a certain processor. | ||
| 19 | */ | ||
| 20 | extern unsigned long __per_cpu_offset[NR_CPUS]; | ||
| 21 | |||
| 22 | #define per_cpu_offset(x) (__per_cpu_offset[x]) | ||
| 23 | |||
| 24 | #define __my_cpu_offset per_cpu_offset(raw_smp_processor_id()) | ||
| 25 | #ifdef CONFIG_DEBUG_PREEMPT | ||
| 26 | #define my_cpu_offset per_cpu_offset(smp_processor_id()) | ||
| 27 | #else | ||
| 28 | #define my_cpu_offset __my_cpu_offset | ||
| 29 | #endif | ||
| 30 | |||
| 31 | #ifndef MODULE | ||
| 32 | #define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset)) | ||
| 33 | #define PER_CPU_DEF_ATTRIBUTES | ||
| 34 | #else | ||
| 35 | /* | 4 | /* |
| 36 | * To calculate addresses of locally defined variables, GCC uses 32-bit | 5 | * To calculate addresses of locally defined variables, GCC uses |
| 37 | * displacement from the GP. Which doesn't work for per cpu variables in | 6 | * 32-bit displacement from the GP. Which doesn't work for per cpu |
| 38 | * modules, as an offset to the kernel per cpu area is way above 4G. | 7 | * variables in modules, as an offset to the kernel per cpu area is |
| 8 | * way above 4G. | ||
| 39 | * | 9 | * |
| 40 | * This forces allocation of a GOT entry for per cpu variable using | 10 | * Always use weak definitions for percpu variables in modules. |
| 41 | * ldq instruction with a 'literal' relocation. | ||
| 42 | */ | ||
| 43 | #define SHIFT_PERCPU_PTR(var, offset) ({ \ | ||
| 44 | extern int simple_identifier_##var(void); \ | ||
| 45 | unsigned long __ptr, tmp_gp; \ | ||
| 46 | asm ( "br %1, 1f \n\ | ||
| 47 | 1: ldgp %1, 0(%1) \n\ | ||
| 48 | ldq %0, per_cpu__" #var"(%1)\t!literal" \ | ||
| 49 | : "=&r"(__ptr), "=&r"(tmp_gp)); \ | ||
| 50 | (typeof(&per_cpu_var(var)))(__ptr + (offset)); }) | ||
| 51 | |||
| 52 | #define PER_CPU_DEF_ATTRIBUTES __used | ||
| 53 | |||
| 54 | #endif /* MODULE */ | ||
| 55 | |||
| 56 | /* | ||
| 57 | * A percpu variable may point to a discarded regions. The following are | ||
| 58 | * established ways to produce a usable pointer from the percpu variable | ||
| 59 | * offset. | ||
| 60 | */ | 11 | */ |
| 61 | #define per_cpu(var, cpu) \ | 12 | #if defined(MODULE) && defined(CONFIG_SMP) |
| 62 | (*SHIFT_PERCPU_PTR(var, per_cpu_offset(cpu))) | 13 | #define ARCH_NEEDS_WEAK_PER_CPU |
| 63 | #define __get_cpu_var(var) \ | ||
| 64 | (*SHIFT_PERCPU_PTR(var, my_cpu_offset)) | ||
| 65 | #define __raw_get_cpu_var(var) \ | ||
| 66 | (*SHIFT_PERCPU_PTR(var, __my_cpu_offset)) | ||
| 67 | |||
| 68 | #else /* ! SMP */ | ||
| 69 | |||
| 70 | #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu_var(var))) | ||
| 71 | #define __get_cpu_var(var) per_cpu_var(var) | ||
| 72 | #define __raw_get_cpu_var(var) per_cpu_var(var) | ||
| 73 | |||
| 74 | #define PER_CPU_DEF_ATTRIBUTES | ||
| 75 | |||
| 76 | #endif /* SMP */ | ||
| 77 | |||
| 78 | #ifdef CONFIG_SMP | ||
| 79 | #define PER_CPU_BASE_SECTION ".data.percpu" | ||
| 80 | #else | ||
| 81 | #define PER_CPU_BASE_SECTION ".data" | ||
| 82 | #endif | ||
| 83 | |||
| 84 | #ifdef CONFIG_SMP | ||
| 85 | |||
| 86 | #ifdef MODULE | ||
| 87 | #define PER_CPU_SHARED_ALIGNED_SECTION "" | ||
| 88 | #else | ||
| 89 | #define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned" | ||
| 90 | #endif | ||
| 91 | #define PER_CPU_FIRST_SECTION ".first" | ||
| 92 | |||
| 93 | #else | ||
| 94 | |||
| 95 | #define PER_CPU_SHARED_ALIGNED_SECTION "" | ||
| 96 | #define PER_CPU_FIRST_SECTION "" | ||
| 97 | |||
| 98 | #endif | 14 | #endif |
| 99 | 15 | ||
| 100 | #define PER_CPU_ATTRIBUTES | 16 | #include <asm-generic/percpu.h> |
| 101 | 17 | ||
| 102 | #endif /* __ALPHA_PERCPU_H */ | 18 | #endif /* __ALPHA_PERCPU_H */ |
diff --git a/arch/alpha/include/asm/tlbflush.h b/arch/alpha/include/asm/tlbflush.h index 9d87aaa08c0d..e89e0c2e15b1 100644 --- a/arch/alpha/include/asm/tlbflush.h +++ b/arch/alpha/include/asm/tlbflush.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _ALPHA_TLBFLUSH_H | 2 | #define _ALPHA_TLBFLUSH_H |
| 3 | 3 | ||
| 4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
| 5 | #include <linux/sched.h> | ||
| 5 | #include <asm/compiler.h> | 6 | #include <asm/compiler.h> |
| 6 | #include <asm/pgalloc.h> | 7 | #include <asm/pgalloc.h> |
| 7 | 8 | ||
diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index b9d6568e5f7f..6dc03c35caa0 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S | |||
| @@ -134,13 +134,6 @@ SECTIONS | |||
| 134 | __bss_stop = .; | 134 | __bss_stop = .; |
| 135 | _end = .; | 135 | _end = .; |
| 136 | 136 | ||
| 137 | /* Sections to be discarded */ | ||
| 138 | /DISCARD/ : { | ||
| 139 | EXIT_TEXT | ||
| 140 | EXIT_DATA | ||
| 141 | *(.exitcall.exit) | ||
| 142 | } | ||
| 143 | |||
| 144 | .mdebug 0 : { | 137 | .mdebug 0 : { |
| 145 | *(.mdebug) | 138 | *(.mdebug) |
| 146 | } | 139 | } |
| @@ -150,4 +143,6 @@ SECTIONS | |||
| 150 | 143 | ||
| 151 | STABS_DEBUG | 144 | STABS_DEBUG |
| 152 | DWARF_DEBUG | 145 | DWARF_DEBUG |
| 146 | |||
| 147 | DISCARDS | ||
| 153 | } | 148 | } |
