lib: Add backtrace_idle parameter to force backtrace of idle CPUs
authorPaul E. McKenney <paulmck@kernel.org>
Wed, 8 Jul 2020 23:25:43 +0000 (16:25 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 24 Aug 2020 21:24:25 +0000 (14:24 -0700)
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>
Documentation/admin-guide/kernel-parameters.txt
lib/nmi_backtrace.c

index bdc1f33..5e6d191 100644 (file)
                        and gids from such clients.  This is intended to ease
                        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
                        when a NMI is triggered.
                        Format: [state][,regs][,debounce][,die]
index 15ca78e..8abe187 100644 (file)
@@ -85,12 +85,16 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask,
        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)
 {
        int cpu = smp_processor_id();
 
        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",
                                cpu, (void *)instruction_pointer(regs));
                } else {