diff options
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/vmlinux_32.lds.S | 1 | ||||
| -rw-r--r-- | include/asm-generic/vmlinux.lds.h | 1 | ||||
| -rw-r--r-- | include/linux/percpu.h | 7 |
4 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index d0463a946247..b2f54fafb8bc 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | 21 | ||
| 22 | #include "cpu.h" | 22 | #include "cpu.h" |
| 23 | 23 | ||
| 24 | DEFINE_PER_CPU(struct gdt_page, gdt_page) = { .gdt = { | 24 | DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { |
| 25 | [GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00cf9a00 } } }, | 25 | [GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00cf9a00 } } }, |
| 26 | [GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9200 } } }, | 26 | [GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9200 } } }, |
| 27 | [GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00cffa00 } } }, | 27 | [GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00cffa00 } } }, |
diff --git a/arch/x86/kernel/vmlinux_32.lds.S b/arch/x86/kernel/vmlinux_32.lds.S index ce5ed083a1e9..0f7c29a8c4ea 100644 --- a/arch/x86/kernel/vmlinux_32.lds.S +++ b/arch/x86/kernel/vmlinux_32.lds.S | |||
| @@ -189,6 +189,7 @@ SECTIONS | |||
| 189 | . = ALIGN(PAGE_SIZE); | 189 | . = ALIGN(PAGE_SIZE); |
| 190 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { | 190 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { |
| 191 | __per_cpu_start = .; | 191 | __per_cpu_start = .; |
| 192 | *(.data.percpu.page_aligned) | ||
| 192 | *(.data.percpu) | 193 | *(.data.percpu) |
| 193 | *(.data.percpu.shared_aligned) | 194 | *(.data.percpu.shared_aligned) |
| 194 | __per_cpu_end = .; | 195 | __per_cpu_end = .; |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index f054778e916c..69e5c1182fde 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
| @@ -348,6 +348,7 @@ | |||
| 348 | . = ALIGN(align); \ | 348 | . = ALIGN(align); \ |
| 349 | __per_cpu_start = .; \ | 349 | __per_cpu_start = .; \ |
| 350 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \ | 350 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \ |
| 351 | *(.data.percpu.page_aligned) \ | ||
| 351 | *(.data.percpu) \ | 352 | *(.data.percpu) \ |
| 352 | *(.data.percpu.shared_aligned) \ | 353 | *(.data.percpu.shared_aligned) \ |
| 353 | } \ | 354 | } \ |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 4cdd393e71e1..2edacc8e6b8b 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
| @@ -23,12 +23,19 @@ | |||
| 23 | __attribute__((__section__(SHARED_ALIGNED_SECTION))) \ | 23 | __attribute__((__section__(SHARED_ALIGNED_SECTION))) \ |
| 24 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name \ | 24 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name \ |
| 25 | ____cacheline_aligned_in_smp | 25 | ____cacheline_aligned_in_smp |
| 26 | |||
| 27 | #define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \ | ||
| 28 | __attribute__((__section__(".data.percpu.page_aligned"))) \ | ||
| 29 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name | ||
| 26 | #else | 30 | #else |
| 27 | #define DEFINE_PER_CPU(type, name) \ | 31 | #define DEFINE_PER_CPU(type, name) \ |
| 28 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name | 32 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name |
| 29 | 33 | ||
| 30 | #define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \ | 34 | #define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \ |
| 31 | DEFINE_PER_CPU(type, name) | 35 | DEFINE_PER_CPU(type, name) |
| 36 | |||
| 37 | #define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \ | ||
| 38 | DEFINE_PER_CPU(type, name) | ||
| 32 | #endif | 39 | #endif |
| 33 | 40 | ||
| 34 | #define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var) | 41 | #define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var) |
