|
@@ -196,6 +196,48 @@ static struct sysrq_key_op sysrq_showlocks_op = {
|
|
#define sysrq_showlocks_op (*(struct sysrq_key_op *)0)
|
|
#define sysrq_showlocks_op (*(struct sysrq_key_op *)0)
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#ifdef CONFIG_SMP
|
|
|
|
+static DEFINE_SPINLOCK(show_lock);
|
|
|
|
+
|
|
|
|
+static void showacpu(void *dummy)
|
|
|
|
+{
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
|
|
+ /* Idle CPUs have no interesting backtrace. */
|
|
|
|
+ if (idle_cpu(smp_processor_id()))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&show_lock, flags);
|
|
|
|
+ printk(KERN_INFO "CPU%d:\n", smp_processor_id());
|
|
|
|
+ show_stack(NULL, NULL);
|
|
|
|
+ spin_unlock_irqrestore(&show_lock, flags);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void sysrq_showregs_othercpus(struct work_struct *dummy)
|
|
|
|
+{
|
|
|
|
+ smp_call_function(showacpu, NULL, 0, 0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static DECLARE_WORK(sysrq_showallcpus, sysrq_showregs_othercpus);
|
|
|
|
+
|
|
|
|
+static void sysrq_handle_showallcpus(int key, struct tty_struct *tty)
|
|
|
|
+{
|
|
|
|
+ struct pt_regs *regs = get_irq_regs();
|
|
|
|
+ if (regs) {
|
|
|
|
+ printk(KERN_INFO "CPU%d:\n", smp_processor_id());
|
|
|
|
+ show_regs(regs);
|
|
|
|
+ }
|
|
|
|
+ schedule_work(&sysrq_showallcpus);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct sysrq_key_op sysrq_showallcpus_op = {
|
|
|
|
+ .handler = sysrq_handle_showallcpus,
|
|
|
|
+ .help_msg = "aLlcpus",
|
|
|
|
+ .action_msg = "Show backtrace of all active CPUs",
|
|
|
|
+ .enable_mask = SYSRQ_ENABLE_DUMP,
|
|
|
|
+};
|
|
|
|
+#endif
|
|
|
|
+
|
|
static void sysrq_handle_showregs(int key, struct tty_struct *tty)
|
|
static void sysrq_handle_showregs(int key, struct tty_struct *tty)
|
|
{
|
|
{
|
|
struct pt_regs *regs = get_irq_regs();
|
|
struct pt_regs *regs = get_irq_regs();
|
|
@@ -340,7 +382,11 @@ static struct sysrq_key_op *sysrq_key_table[36] = {
|
|
&sysrq_kill_op, /* i */
|
|
&sysrq_kill_op, /* i */
|
|
NULL, /* j */
|
|
NULL, /* j */
|
|
&sysrq_SAK_op, /* k */
|
|
&sysrq_SAK_op, /* k */
|
|
|
|
+#ifdef CONFIG_SMP
|
|
|
|
+ &sysrq_showallcpus_op, /* l */
|
|
|
|
+#else
|
|
NULL, /* l */
|
|
NULL, /* l */
|
|
|
|
+#endif
|
|
&sysrq_showmem_op, /* m */
|
|
&sysrq_showmem_op, /* m */
|
|
&sysrq_unrt_op, /* n */
|
|
&sysrq_unrt_op, /* n */
|
|
/* o: This will often be registered as 'Off' at init time */
|
|
/* o: This will often be registered as 'Off' at init time */
|