forked from Minki/linux
5260562754
In the MN10300 arch, we occasionally see an assertion being tripped in alloc_cwqs() at the following line: /* just in case, make sure it's actually aligned */ ---> BUG_ON(!IS_ALIGNED(wq->cpu_wq.v, align)); return wq->cpu_wq.v ? 0 : -ENOMEM; The values are: wa->cpu_wq.v => 0x902776e0 align => 0x100 and align is calculated by the following: const size_t align = max_t(size_t, 1 << WORK_STRUCT_FLAG_BITS, __alignof__(unsigned long long)); This is because the pointer in question (wq->cpu_wq.v) loses some of its lower bits to control flags, and so the object it points to must be sufficiently aligned to avoid the need to use those bits for pointing to things. Currently, 4 control bits and 4 colour bits are used in normal circumstances, plus a debugging bit if debugging is set. This requires the cpu_workqueue_struct struct to be at least 256 bytes aligned (or 512 bytes aligned with debugging). PERCPU() alignment on MN13000, however, is only 32 bytes as set in vmlinux.lds.S. So we set this to PAGE_SIZE (4096) to match most other arches and stick a comment in alloc_cwqs() for anyone else who triggers the assertion. Reported-by: Akira Takeuchi <takeuchi.akr@jp.panasonic.com> Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Mark Salter <msalter@redhat.com> Cc: Tejun Heo <tj@kernel.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
93 lines
2.1 KiB
ArmAsm
93 lines
2.1 KiB
ArmAsm
/* MN10300 Main kernel linker script
|
|
*
|
|
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public Licence
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the Licence, or (at your option) any later version.
|
|
*/
|
|
#define __VMLINUX_LDS__
|
|
#include <asm-generic/vmlinux.lds.h>
|
|
#include <asm/thread_info.h>
|
|
#include <asm/page.h>
|
|
|
|
OUTPUT_FORMAT("elf32-am33lin", "elf32-am33lin", "elf32-am33lin")
|
|
OUTPUT_ARCH(mn10300)
|
|
ENTRY(_start)
|
|
jiffies = jiffies_64;
|
|
#ifndef CONFIG_MN10300_CURRENT_IN_E2
|
|
current = __current;
|
|
#endif
|
|
SECTIONS
|
|
{
|
|
. = CONFIG_KERNEL_TEXT_ADDRESS;
|
|
/* read-only */
|
|
_stext = .;
|
|
_text = .; /* Text and read-only data */
|
|
.text : {
|
|
HEAD_TEXT
|
|
TEXT_TEXT
|
|
SCHED_TEXT
|
|
LOCK_TEXT
|
|
KPROBES_TEXT
|
|
*(.fixup)
|
|
*(.gnu.warning)
|
|
} = 0xcb
|
|
|
|
_etext = .; /* End of text section */
|
|
|
|
EXCEPTION_TABLE(16)
|
|
BUG_TABLE
|
|
|
|
RO_DATA(PAGE_SIZE)
|
|
|
|
/* writeable */
|
|
RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE)
|
|
_edata = .;
|
|
|
|
/* might get freed after init */
|
|
. = ALIGN(PAGE_SIZE);
|
|
.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
|
|
__smp_locks = .;
|
|
*(.smp_locks)
|
|
__smp_locks_end = .;
|
|
}
|
|
|
|
/* will be freed after init */
|
|
. = ALIGN(PAGE_SIZE); /* Init code and data */
|
|
__init_begin = .;
|
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
|
INIT_DATA_SECTION(16)
|
|
. = ALIGN(4);
|
|
__alt_instructions = .;
|
|
.altinstructions : { *(.altinstructions) }
|
|
__alt_instructions_end = .;
|
|
.altinstr_replacement : { *(.altinstr_replacement) }
|
|
/* .exit.text is discard at runtime, not link time, to deal with references
|
|
from .altinstructions and .eh_frame */
|
|
.exit.text : { EXIT_TEXT; }
|
|
.exit.data : { EXIT_DATA; }
|
|
|
|
PERCPU(PAGE_SIZE)
|
|
. = ALIGN(PAGE_SIZE);
|
|
__init_end = .;
|
|
/* freed after init ends here */
|
|
|
|
BSS_SECTION(0, PAGE_SIZE, 4)
|
|
|
|
_end = . ;
|
|
|
|
/* This is where the kernel creates the early boot page tables */
|
|
. = ALIGN(PAGE_SIZE);
|
|
pg0 = .;
|
|
|
|
STABS_DEBUG
|
|
|
|
DWARF_DEBUG
|
|
|
|
/* Sections to be discarded */
|
|
DISCARDS
|
|
}
|