mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
9a01c3ed5c
Patch series "improvements to the nmi_backtrace code" v9. This patch series modifies the trigger_xxx_backtrace() NMI-based remote backtracing code to make it more flexible, and makes a few small improvements along the way. The motivation comes from the task isolation code, where there are scenarios where we want to be able to diagnose a case where some cpu is about to interrupt a task-isolated cpu. It can be helpful to see both where the interrupting cpu is, and also an approximation of where the cpu that is being interrupted is. The nmi_backtrace framework allows us to discover the stack of the interrupted cpu. I've tested that the change works as desired on tile, and build-tested x86, arm, mips, and sparc64. For x86 I confirmed that the generic cpuidle stuff as well as the architecture-specific routines are in the new cpuidle section. For arm, mips, and sparc I just build-tested it and made sure the generic cpuidle routines were in the new cpuidle section, but I didn't attempt to figure out which the platform-specific idle routines might be. That might be more usefully done by someone with platform experience in follow-up patches. This patch (of 4): Currently you can only request a backtrace of either all cpus, or all cpus but yourself. It can also be helpful to request a remote backtrace of a single cpu, and since we want that, the logical extension is to support a cpumask as the underlying primitive. This change modifies the existing lib/nmi_backtrace.c code to take a cpumask as its basic primitive, and modifies the linux/nmi.h code to use the new "cpumask" method instead. The existing clients of nmi_backtrace (arm and x86) are converted to using the new cpumask approach in this change. The other users of the backtracing API (sparc64 and mips) are converted to use the cpumask approach rather than the all/allbutself approach. The mips code ignored the "include_self" boolean but with this change it will now also dump a local backtrace if requested. Link: http://lkml.kernel.org/r/1472487169-14923-2-git-send-email-cmetcalf@mellanox.com Signed-off-by: Chris Metcalf <cmetcalf@mellanox.com> Tested-by: Daniel Thompson <daniel.thompson@linaro.org> [arm] Reviewed-by: Aaron Tomlin <atomlin@redhat.com> Reviewed-by: Petr Mladek <pmladek@suse.com> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Russell King <linux@arm.linux.org.uk> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@elte.hu> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: David Miller <davem@davemloft.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
59 lines
1.5 KiB
C
59 lines
1.5 KiB
C
/*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Copyright (C) 1994 by Waldorf GMBH, written by Ralf Baechle
|
|
* Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02, 03 by Ralf Baechle
|
|
*/
|
|
#ifndef _ASM_IRQ_H
|
|
#define _ASM_IRQ_H
|
|
|
|
#include <linux/linkage.h>
|
|
#include <linux/smp.h>
|
|
#include <linux/irqdomain.h>
|
|
|
|
#include <asm/mipsmtregs.h>
|
|
|
|
#include <irq.h>
|
|
|
|
#ifdef CONFIG_I8259
|
|
static inline int irq_canonicalize(int irq)
|
|
{
|
|
return ((irq == I8259A_IRQ_BASE + 2) ? I8259A_IRQ_BASE + 9 : irq);
|
|
}
|
|
#else
|
|
#define irq_canonicalize(irq) (irq) /* Sane hardware, sane code ... */
|
|
#endif
|
|
|
|
asmlinkage void plat_irq_dispatch(void);
|
|
|
|
extern void do_IRQ(unsigned int irq);
|
|
|
|
extern void arch_init_irq(void);
|
|
extern void spurious_interrupt(void);
|
|
|
|
extern int allocate_irqno(void);
|
|
extern void alloc_legacy_irqno(void);
|
|
extern void free_irqno(unsigned int irq);
|
|
|
|
/*
|
|
* Before R2 the timer and performance counter interrupts were both fixed to
|
|
* IE7. Since R2 their number has to be read from the c0_intctl register.
|
|
*/
|
|
#define CP0_LEGACY_COMPARE_IRQ 7
|
|
#define CP0_LEGACY_PERFCNT_IRQ 7
|
|
|
|
extern int cp0_compare_irq;
|
|
extern int cp0_compare_irq_shift;
|
|
extern int cp0_perfcount_irq;
|
|
extern int cp0_fdc_irq;
|
|
|
|
extern int get_c0_fdc_int(void);
|
|
|
|
void arch_trigger_cpumask_backtrace(const struct cpumask *mask,
|
|
bool exclude_self);
|
|
#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
|
|
|
|
#endif /* _ASM_IRQ_H */
|