mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 16:29:59 +00:00
![Petr Mladek](/assets/img/avatar_default.png)
printk() takes some locks and could not be used a safe way in NMI
context.
The chance of a deadlock is real especially when printing stacks from
all CPUs. This particular problem has been addressed on x86 by the
commit a9edc88093
("x86/nmi: Perform a safe NMI stack trace on all
CPUs").
The patchset brings two big advantages. First, it makes the NMI
backtraces safe on all architectures for free. Second, it makes all NMI
messages almost safe on all architectures (the temporary buffer is
limited. We still should keep the number of messages in NMI context at
minimum).
Note that there already are several messages printed in NMI context:
WARN_ON(in_nmi()), BUG_ON(in_nmi()), anything being printed out from MCE
handlers. These are not easy to avoid.
This patch reuses most of the code and makes it generic. It is useful
for all messages and architectures that support NMI.
The alternative printk_func is set when entering and is reseted when
leaving NMI context. It queues IRQ work to copy the messages into the
main ring buffer in a safe context.
__printk_nmi_flush() copies all available messages and reset the buffer.
Then we could use a simple cmpxchg operations to get synchronized with
writers. There is also used a spinlock to get synchronized with other
flushers.
We do not longer use seq_buf because it depends on external lock. It
would be hard to make all supported operations safe for a lockless use.
It would be confusing and error prone to make only some operations safe.
The code is put into separate printk/nmi.c as suggested by Steven
Rostedt. It needs a per-CPU buffer and is compiled only on
architectures that call nmi_enter(). This is achieved by the new
HAVE_NMI Kconfig flag.
The are MN10300 and Xtensa architectures. We need to clean up NMI
handling there first. Let's do it separately.
The patch is heavily based on the draft from Peter Zijlstra, see
https://lkml.org/lkml/2015/6/10/327
[arnd@arndb.de: printk-nmi: use %zu format string for size_t]
[akpm@linux-foundation.org: min_t->min - all types are size_t here]
Signed-off-by: Petr Mladek <pmladek@suse.com>
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Suggested-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Jan Kara <jack@suse.cz>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> [arm part]
Cc: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Jiri Kosina <jkosina@suse.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: David Miller <davem@davemloft.net>
Cc: Daniel Thompson <daniel.thompson@linaro.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
288 lines
5.9 KiB
Text
288 lines
5.9 KiB
Text
config AVR32
|
|
def_bool y
|
|
# With EXPERT=n, we get lots of stuff automatically selected
|
|
# that we usually don't need on AVR32.
|
|
select EXPERT
|
|
select HAVE_CLK
|
|
select HAVE_EXIT_THREAD
|
|
select HAVE_OPROFILE
|
|
select HAVE_KPROBES
|
|
select VIRT_TO_BUS
|
|
select GENERIC_IRQ_PROBE
|
|
select GENERIC_ATOMIC64
|
|
select HARDIRQS_SW_RESEND
|
|
select GENERIC_IRQ_SHOW
|
|
select ARCH_HAVE_CUSTOM_GPIO_H
|
|
select ARCH_WANT_IPC_PARSE_VERSION
|
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
|
select GENERIC_CLOCKEVENTS
|
|
select HAVE_MOD_ARCH_SPECIFIC
|
|
select MODULES_USE_ELF_RELA
|
|
select HAVE_NMI
|
|
help
|
|
AVR32 is a high-performance 32-bit RISC microprocessor core,
|
|
designed for cost-sensitive embedded applications, with particular
|
|
emphasis on low power consumption and high code density.
|
|
|
|
There is an AVR32 Linux project with a web page at
|
|
http://avr32linux.org/.
|
|
|
|
config STACKTRACE_SUPPORT
|
|
def_bool y
|
|
|
|
config LOCKDEP_SUPPORT
|
|
def_bool y
|
|
|
|
config TRACE_IRQFLAGS_SUPPORT
|
|
def_bool y
|
|
|
|
config RWSEM_GENERIC_SPINLOCK
|
|
def_bool y
|
|
|
|
config RWSEM_XCHGADD_ALGORITHM
|
|
def_bool n
|
|
|
|
config ARCH_HAS_ILOG2_U32
|
|
def_bool n
|
|
|
|
config ARCH_HAS_ILOG2_U64
|
|
def_bool n
|
|
|
|
config GENERIC_HWEIGHT
|
|
def_bool y
|
|
|
|
config GENERIC_CALIBRATE_DELAY
|
|
def_bool y
|
|
|
|
config GENERIC_BUG
|
|
def_bool y
|
|
depends on BUG
|
|
|
|
source "init/Kconfig"
|
|
|
|
source "kernel/Kconfig.freezer"
|
|
|
|
menu "System Type and features"
|
|
|
|
config SUBARCH_AVR32B
|
|
bool
|
|
config MMU
|
|
bool
|
|
config PERFORMANCE_COUNTERS
|
|
bool
|
|
|
|
config PLATFORM_AT32AP
|
|
bool
|
|
select SUBARCH_AVR32B
|
|
select MMU
|
|
select PERFORMANCE_COUNTERS
|
|
select GPIOLIB
|
|
select GENERIC_ALLOCATOR
|
|
select HAVE_FB_ATMEL
|
|
|
|
#
|
|
# CPU types
|
|
#
|
|
|
|
# AP7000 derivatives
|
|
config CPU_AT32AP700X
|
|
bool
|
|
select PLATFORM_AT32AP
|
|
config CPU_AT32AP7000
|
|
bool
|
|
select CPU_AT32AP700X
|
|
config CPU_AT32AP7001
|
|
bool
|
|
select CPU_AT32AP700X
|
|
config CPU_AT32AP7002
|
|
bool
|
|
select CPU_AT32AP700X
|
|
|
|
# AP700X boards
|
|
config BOARD_ATNGW100_COMMON
|
|
bool
|
|
select CPU_AT32AP7000
|
|
|
|
choice
|
|
prompt "AVR32 board type"
|
|
default BOARD_ATSTK1000
|
|
|
|
config BOARD_ATSTK1000
|
|
bool "ATSTK1000 evaluation board"
|
|
|
|
config BOARD_ATNGW100_MKI
|
|
bool "ATNGW100 Network Gateway"
|
|
select BOARD_ATNGW100_COMMON
|
|
|
|
config BOARD_ATNGW100_MKII
|
|
bool "ATNGW100 mkII Network Gateway"
|
|
select BOARD_ATNGW100_COMMON
|
|
|
|
config BOARD_HAMMERHEAD
|
|
bool "Hammerhead board"
|
|
select CPU_AT32AP7000
|
|
select USB_ARCH_HAS_HCD
|
|
help
|
|
The Hammerhead platform is built around an AVR32 32-bit microcontroller from Atmel.
|
|
It offers versatile peripherals, such as ethernet, usb device, usb host etc.
|
|
|
|
The board also incorporates a power supply and is a Power over Ethernet (PoE) Powered
|
|
Device (PD).
|
|
|
|
Additionally, a Cyclone III FPGA from Altera is integrated on the board. The FPGA is
|
|
mapped into the 32-bit AVR memory bus. The FPGA offers two DDR2 SDRAM interfaces, which
|
|
will cover even the most exceptional need of memory bandwidth. Together with the onboard
|
|
video decoder the board is ready for video processing.
|
|
|
|
For more information see: http://www.miromico.ch/index.php/hammerhead.html
|
|
|
|
config BOARD_FAVR_32
|
|
bool "Favr-32 LCD-board"
|
|
select CPU_AT32AP7000
|
|
|
|
config BOARD_MERISC
|
|
bool "Merisc board"
|
|
select CPU_AT32AP7000
|
|
help
|
|
Merisc is the family name for a range of AVR32-based boards.
|
|
|
|
The boards are designed to be used in a man-machine
|
|
interfacing environment, utilizing a touch-based graphical
|
|
user interface. They host a vast range of I/O peripherals as
|
|
well as a large SDRAM & Flash memory bank.
|
|
|
|
For more information see: http://www.martinsson.se/merisc
|
|
|
|
config BOARD_MIMC200
|
|
bool "MIMC200 CPU board"
|
|
select CPU_AT32AP7000
|
|
endchoice
|
|
|
|
source "arch/avr32/boards/atstk1000/Kconfig"
|
|
source "arch/avr32/boards/atngw100/Kconfig"
|
|
source "arch/avr32/boards/hammerhead/Kconfig"
|
|
source "arch/avr32/boards/favr-32/Kconfig"
|
|
source "arch/avr32/boards/merisc/Kconfig"
|
|
|
|
choice
|
|
prompt "Boot loader type"
|
|
default LOADER_U_BOOT
|
|
|
|
config LOADER_U_BOOT
|
|
bool "U-Boot (or similar) bootloader"
|
|
endchoice
|
|
|
|
source "arch/avr32/mach-at32ap/Kconfig"
|
|
|
|
config LOAD_ADDRESS
|
|
hex
|
|
default 0x10000000 if LOADER_U_BOOT=y && CPU_AT32AP700X=y
|
|
|
|
config ENTRY_ADDRESS
|
|
hex
|
|
default 0x90000000 if LOADER_U_BOOT=y && CPU_AT32AP700X=y
|
|
|
|
config PHYS_OFFSET
|
|
hex
|
|
default 0x10000000 if CPU_AT32AP700X=y
|
|
|
|
source "kernel/Kconfig.preempt"
|
|
|
|
config QUICKLIST
|
|
def_bool y
|
|
|
|
config ARCH_HAVE_MEMORY_PRESENT
|
|
def_bool n
|
|
|
|
config NEED_NODE_MEMMAP_SIZE
|
|
def_bool n
|
|
|
|
config ARCH_FLATMEM_ENABLE
|
|
def_bool y
|
|
|
|
config ARCH_DISCONTIGMEM_ENABLE
|
|
def_bool n
|
|
|
|
config ARCH_SPARSEMEM_ENABLE
|
|
def_bool n
|
|
|
|
config NODES_SHIFT
|
|
int
|
|
default "2"
|
|
depends on NEED_MULTIPLE_NODES
|
|
|
|
source "mm/Kconfig"
|
|
|
|
config OWNERSHIP_TRACE
|
|
bool "Ownership trace support"
|
|
default y
|
|
help
|
|
Say Y to generate an Ownership Trace message on every context switch,
|
|
enabling Nexus-compliant debuggers to keep track of the PID of the
|
|
currently executing task.
|
|
|
|
config NMI_DEBUGGING
|
|
bool "NMI Debugging"
|
|
default n
|
|
help
|
|
Say Y here and pass the nmi_debug command-line parameter to
|
|
the kernel to turn on NMI debugging. Depending on the value
|
|
of the nmi_debug option, various pieces of information will
|
|
be dumped to the console when a Non-Maskable Interrupt
|
|
happens.
|
|
|
|
# FPU emulation goes here
|
|
|
|
source "kernel/Kconfig.hz"
|
|
|
|
config CMDLINE
|
|
string "Default kernel command line"
|
|
default ""
|
|
help
|
|
If you don't have a boot loader capable of passing a command line string
|
|
to the kernel, you may specify one here. As a minimum, you should specify
|
|
the memory size and the root device (e.g., mem=8M, root=/dev/nfs).
|
|
|
|
endmenu
|
|
|
|
menu "Power management options"
|
|
|
|
source "kernel/power/Kconfig"
|
|
|
|
config ARCH_SUSPEND_POSSIBLE
|
|
def_bool y
|
|
|
|
menu "CPU Frequency scaling"
|
|
source "drivers/cpufreq/Kconfig"
|
|
endmenu
|
|
|
|
endmenu
|
|
|
|
menu "Bus options"
|
|
|
|
config PCI
|
|
bool
|
|
|
|
source "drivers/pci/Kconfig"
|
|
|
|
source "drivers/pcmcia/Kconfig"
|
|
|
|
endmenu
|
|
|
|
menu "Executable file formats"
|
|
source "fs/Kconfig.binfmt"
|
|
endmenu
|
|
|
|
source "net/Kconfig"
|
|
|
|
source "drivers/Kconfig"
|
|
|
|
source "fs/Kconfig"
|
|
|
|
source "arch/avr32/Kconfig.debug"
|
|
|
|
source "security/Kconfig"
|
|
|
|
source "crypto/Kconfig"
|
|
|
|
source "lib/Kconfig"
|