+ nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi.patch added to -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled
     Subject: nmi_backtrace: do a local dump_stack() instead of a self-NMI
has been added to the -mm tree.  Its filename is
     nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi.patch

This patch should soon appear at
    http://ozlabs.org/~akpm/mmots/broken-out/nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi.patch
and later at
    http://ozlabs.org/~akpm/mmotm/broken-out/nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi.patch

Before you just go and hit "reply", please:
   a) Consider who else should be cc'ed
   b) Prefer to cc a suitable mailing list as well
   c) Ideally: find the original patch on the mailing list and do a
      reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/SubmitChecklist when testing your code ***

The -mm tree is included into linux-next and is updated
there every 3-4 working days

------------------------------------------------------
From: Chris Metcalf <cmetcalf@xxxxxxxxxxxx>
Subject: nmi_backtrace: do a local dump_stack() instead of a self-NMI

Currently on arm there is code that checks whether it should call
dump_stack() explicitly, to avoid trying to raise an NMI when the current
context is not preemptible by the backtrace IPI.  Similarly, the
forthcoming arch/tile support uses an IPI mechanism that does not support
generating an NMI to self.

Accordingly, move the code that guards this case into the generic
mechanism, and invoke it unconditionally whenever we want a backtrace of
the current cpu.  It seems plausible that in all cases, dump_stack() will
generate better information than generating a stack from the NMI handler. 
The register state will be missing, but that state is likely not
particularly helpful in any case.

Or, if we think it is helpful, we should be capturing and emitting the
current register state in all cases when regs == NULL is passed to
nmi_cpu_backtrace().

Link: http://lkml.kernel.org/r/1472487169-14923-3-git-send-email-cmetcalf@xxxxxxxxxxxx
Signed-off-by: Chris Metcalf <cmetcalf@xxxxxxxxxxxx>
Tested-by: Daniel Thompson <daniel.thompson@xxxxxxxxxx> [arm]
Reviewed-by: Petr Mladek <pmladek@xxxxxxxx>
Acked-by: Aaron Tomlin <atomlin@xxxxxxxxxx>
Cc: Rafael J. Wysocki" <rjw@xxxxxxxxxxxxx>
Cc: Russell King <linux@xxxxxxxxxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

 arch/arm/kernel/smp.c |    9 ---------
 lib/nmi_backtrace.c   |    9 +++++++++
 2 files changed, 9 insertions(+), 9 deletions(-)

diff -puN arch/arm/kernel/smp.c~nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi arch/arm/kernel/smp.c
--- a/arch/arm/kernel/smp.c~nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi
+++ a/arch/arm/kernel/smp.c
@@ -748,15 +748,6 @@ core_initcall(register_cpufreq_notifier)
 
 static void raise_nmi(cpumask_t *mask)
 {
-	/*
-	 * Generate the backtrace directly if we are running in a calling
-	 * context that is not preemptible by the backtrace IPI. Note
-	 * that nmi_cpu_backtrace() automatically removes the current cpu
-	 * from mask.
-	 */
-	if (cpumask_test_cpu(smp_processor_id(), mask) && irqs_disabled())
-		nmi_cpu_backtrace(NULL);
-
 	smp_cross_call(mask, IPI_CPU_BACKTRACE);
 }
 
diff -puN lib/nmi_backtrace.c~nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi lib/nmi_backtrace.c
--- a/lib/nmi_backtrace.c~nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi
+++ a/lib/nmi_backtrace.c
@@ -49,6 +49,15 @@ void nmi_trigger_cpumask_backtrace(const
 	if (exclude_self)
 		cpumask_clear_cpu(this_cpu, to_cpumask(backtrace_mask));
 
+	/*
+	 * Don't try to send an NMI to this cpu; it may work on some
+	 * architectures, but on others it may not, and we'll get
+	 * information at least as useful just by doing a dump_stack() here.
+	 * Note that nmi_cpu_backtrace(NULL) will clear the cpu bit.
+	 */
+	if (cpumask_test_cpu(this_cpu, to_cpumask(backtrace_mask)))
+		nmi_cpu_backtrace(NULL);
+
 	if (!cpumask_empty(to_cpumask(backtrace_mask))) {
 		pr_info("Sending NMI from CPU %d to CPUs %*pbl:\n",
 			this_cpu, nr_cpumask_bits, to_cpumask(backtrace_mask));
_

Patches currently in -mm which might be from cmetcalf@xxxxxxxxxxxx are

nmi_backtrace-add-more-trigger__cpu_backtrace-methods.patch
nmi_backtrace-do-a-local-dump_stack-instead-of-a-self-nmi.patch
arch-tile-adopt-the-new-nmi_backtrace-framework.patch
nmi_backtrace-generate-one-line-reports-for-idle-cpus.patch

--
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]
  Powered by Linux