lib: Add backtrace_idle parameter to force backtrace of idle CPUs
Currently, the nmi_cpu_backtrace() declines to produce backtraces for idle CPUs. This is a good choice in the common case in which problems are caused only by non-idle CPUs. However, there are occasionally situations in which idle CPUs are helping to cause problems. This commit therefore adds an nmi_backtrace.backtrace_idle kernel boot parameter that causes nmi_cpu_backtrace() to dump stacks even of idle CPUs. Signed-off-by: Paul E. McKenney <paulmck@kernel.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: <linux-doc@vger.kernel.org>
This commit is contained in:
parent
9123e3a74e
commit
160c7ba346
@ -3073,6 +3073,10 @@
|
|||||||
and gids from such clients. This is intended to ease
|
and gids from such clients. This is intended to ease
|
||||||
migration from NFSv2/v3.
|
migration from NFSv2/v3.
|
||||||
|
|
||||||
|
nmi_backtrace.backtrace_idle [KNL]
|
||||||
|
Dump stacks even of idle CPUs in response to an
|
||||||
|
NMI stack-backtrace request.
|
||||||
|
|
||||||
nmi_debug= [KNL,SH] Specify one or more actions to take
|
nmi_debug= [KNL,SH] Specify one or more actions to take
|
||||||
when a NMI is triggered.
|
when a NMI is triggered.
|
||||||
Format: [state][,regs][,debounce][,die]
|
Format: [state][,regs][,debounce][,die]
|
||||||
|
@ -85,12 +85,16 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask,
|
|||||||
put_cpu();
|
put_cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dump stacks even for idle CPUs.
|
||||||
|
static bool backtrace_idle;
|
||||||
|
module_param(backtrace_idle, bool, 0644);
|
||||||
|
|
||||||
bool nmi_cpu_backtrace(struct pt_regs *regs)
|
bool nmi_cpu_backtrace(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int cpu = smp_processor_id();
|
int cpu = smp_processor_id();
|
||||||
|
|
||||||
if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) {
|
if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) {
|
||||||
if (regs && cpu_in_idle(instruction_pointer(regs))) {
|
if (!READ_ONCE(backtrace_idle) && regs && cpu_in_idle(instruction_pointer(regs))) {
|
||||||
pr_warn("NMI backtrace for cpu %d skipped: idling at %pS\n",
|
pr_warn("NMI backtrace for cpu %d skipped: idling at %pS\n",
|
||||||
cpu, (void *)instruction_pointer(regs));
|
cpu, (void *)instruction_pointer(regs));
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user