mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
![Tejun Heo](/assets/img/avatar_default.png)
Percpu allocator honors alignment request upto PAGE_SIZE and both the percpu addresses in the percpu address space and the translated kernel addresses should be aligned accordingly. The calculation of the former depends on the alignment of percpu output section in the kernel image. The linker script macros PERCPU_VADDR() and PERCPU() are used to define this output section and the latter takes @align parameter. Several architectures are using @align smaller than PAGE_SIZE breaking percpu memory alignment. This patch removes @align parameter from PERCPU(), renames it to PERCPU_SECTION() and makes it always align to PAGE_SIZE. While at it, add PCPU_SETUP_BUG_ON() checks such that alignment problems are reliably detected and remove percpu alignment comment recently added in workqueue.c as the condition would trigger BUG way before reaching there. For um, this patch raises the alignment of percpu area. As the area is in .init, there shouldn't be any noticeable difference. This problem was discovered by David Howells while debugging boot failure on mn10300. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Mike Frysinger <vapier@gentoo.org> Cc: uclinux-dist-devel@blackfin.uclinux.org Cc: David Howells <dhowells@redhat.com> Cc: Jeff Dike <jdike@addtoit.com> Cc: user-mode-linux-devel@lists.sourceforge.net
95 lines
2 KiB
ArmAsm
95 lines
2 KiB
ArmAsm
#include <asm-generic/vmlinux.lds.h>
|
|
#include <asm/page.h>
|
|
#include <asm/cache.h>
|
|
#include <asm/thread_info.h>
|
|
#include <hv/hypervisor.h>
|
|
|
|
/* Text loads starting from the supervisor interrupt vector address. */
|
|
#define TEXT_OFFSET MEM_SV_INTRPT
|
|
|
|
OUTPUT_ARCH(tile)
|
|
ENTRY(_start)
|
|
jiffies = jiffies_64;
|
|
|
|
PHDRS
|
|
{
|
|
intrpt1 PT_LOAD ;
|
|
text PT_LOAD ;
|
|
data PT_LOAD ;
|
|
}
|
|
SECTIONS
|
|
{
|
|
/* Text is loaded with a different VA than data; start with text. */
|
|
#undef LOAD_OFFSET
|
|
#define LOAD_OFFSET TEXT_OFFSET
|
|
|
|
/* Interrupt vectors */
|
|
.intrpt1 (LOAD_OFFSET) : AT ( 0 ) /* put at the start of physical memory */
|
|
{
|
|
_text = .;
|
|
_stext = .;
|
|
*(.intrpt1)
|
|
} :intrpt1 =0
|
|
|
|
/* Hypervisor call vectors */
|
|
#include "hvglue.lds"
|
|
|
|
/* Now the real code */
|
|
. = ALIGN(0x20000);
|
|
.text : AT (ADDR(.text) - LOAD_OFFSET) {
|
|
HEAD_TEXT
|
|
SCHED_TEXT
|
|
LOCK_TEXT
|
|
__fix_text_end = .; /* tile-cpack won't rearrange before this */
|
|
TEXT_TEXT
|
|
*(.text.*)
|
|
*(.coldtext*)
|
|
*(.fixup)
|
|
*(.gnu.warning)
|
|
} :text =0
|
|
_etext = .;
|
|
|
|
/* "Init" is divided into two areas with very different virtual addresses. */
|
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
|
|
|
/* Now we skip back to PAGE_OFFSET for the data. */
|
|
. = (. - TEXT_OFFSET + PAGE_OFFSET);
|
|
#undef LOAD_OFFSET
|
|
#define LOAD_OFFSET PAGE_OFFSET
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
VMLINUX_SYMBOL(_sinitdata) = .;
|
|
INIT_DATA_SECTION(16) :data =0
|
|
PERCPU_SECTION(L2_CACHE_BYTES)
|
|
. = ALIGN(PAGE_SIZE);
|
|
VMLINUX_SYMBOL(_einitdata) = .;
|
|
|
|
_sdata = .; /* Start of data section */
|
|
|
|
RO_DATA_SECTION(PAGE_SIZE)
|
|
|
|
/* initially writeable, then read-only */
|
|
. = ALIGN(PAGE_SIZE);
|
|
__w1data_begin = .;
|
|
.w1data : AT(ADDR(.w1data) - LOAD_OFFSET) {
|
|
VMLINUX_SYMBOL(__w1data_begin) = .;
|
|
*(.w1data)
|
|
VMLINUX_SYMBOL(__w1data_end) = .;
|
|
}
|
|
|
|
RW_DATA_SECTION(L2_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
|
|
|
|
_edata = .;
|
|
|
|
EXCEPTION_TABLE(L2_CACHE_BYTES)
|
|
NOTES
|
|
|
|
|
|
BSS_SECTION(8, PAGE_SIZE, 1)
|
|
_end = . ;
|
|
|
|
STABS_DEBUG
|
|
DWARF_DEBUG
|
|
|
|
DISCARDS
|
|
}
|