Patch: ARM show_trace_task and show_task cleanup
Linus,
(CC:'d to lkml in case someone wants to object to the show_task() cleanup; Alan has accepted it many -ac versions ago into his tree, and is happy for me to send it on).
The following patch adds ARM support for show_trace_task() and changes die() to display the instruction trace as ksymoops expects it (code line last).
In addition, it cleans up show_task so that the displayed data is aligned with the header that show_state displays:
1. We have some kernel tasks with more than 8 characters in their name.
2. Lazy-TLB state is shown at the end of each line, not in the middle of the PID lists.
arch/arm/kernel/traps.c +15 -1
@@ -20,6 +20,7 @@#include <linux/mm.h> #include <linux/spinlock.h> #include <linux/ptrace.h> +#include <linux/elf.h> #include <linux/init.h> #include <asm/atomic.h>
@@ -27,6 +28,7 @@#include <asm/pgtable.h> #include <asm/system.h> #include <asm/uaccess.h> +#include <asm/unistd.h> #include "ptrace.h"
@@ -143,6 +145,18 @@c_backtrace (fp,processor_mode (regs)); } +/* +* This is called from SysRq-T (show_task) to display the current +* call trace for each process. Very useful. +*/ +void show_trace_task (struct task_struct *tsk) +{ +if (tsk != current) { +unsigned int fp = tsk->thread.save->fp; +c_backtrace (fp,0x10 ); + } +} +spinlock_t die_lock =SPIN_LOCK_UNLOCKED ;/*
@@ -173,9 +187,9 @@ fs =get_fs ();set_fs (KERNEL_DS ); -dump_instr (regs);dump_stack (tsk, (unsigned long )(regs +1 ));dump_backtrace (regs, tsk); +dump_instr (regs);set_fs (fs); }
kernel/sched.c +8 -8
@@ -1104,7 +1104,7 @@int state;static const char * stat_nam[] = {"R" ,"S" ,"D" ,"Z" ,"T" ,"W" }; -printk ("%-8s " , p->comm); +printk ("%-13.13s " , p->comm); state = p->state ?ffz (~p->state) +1 :0 ;if (((unsigned ) state) <sizeof (stat_nam)/sizeof (char *))printk (stat_nam[state]);
@@ -1132,20 +1132,20 @@printk ("%5d " , p->p_cptr->pid); else printk(" "); -if (!p->mm) -printk (" (L-TLB) " ); -else -printk (" (NOTLB) " );if (p->p_ysptr)printk ("%7d" , p->p_ysptr->pid);else printk (" " );if (p->p_osptr) -printk (" %5d\n" , p->p_osptr->pid); +printk (" %5d" , p->p_osptr->pid); +else +printk (" " ); +if (!p->mm) +printk (" (L-TLB)\n" );else -printk ("\n" ); +printk (" (NOTLB)\n" ); -#if defined(CONFIG_X86 ) || defined(CONFIG_SPARC64 ) +#if defined(CONFIG_X86 ) || defined(CONFIG_SPARC64 ) || defined(CONFIG_ARM )/* This is very useful, but only works on x86 and sparc64 right now */ {extern void show_trace_task (struct task_struct *tsk);
--
Russell King ([email protected]) The developer of ARM Linux
http://www.arm.linux.org.uk/personal/aboutme.html
Quoted 3 lines · Russell King
The following patch adds ARM support for
show_trace_task()and changesdie()to display the instruction trace as ksymoops expects it (code line last).
Thanks.
Quoted 3 lines
kernel/sched.c +1
-1-#if defined(CONFIG_X86 ) || defined(CONFIG_SPARC64 ) +#if defined(CONFIG_X86 ) || defined(CONFIG_SPARC64 ) || defined(CONFIG_ARM )/* This is very useful, but only works on x86 and sparc64 right now */
<nitpick>Comment needs updating</nitpick>
Quoted 7 lines · Keith Owens
Quoted 3 lines · Russell King
(quoted diff) +1
-1-#if defined(CONFIG_X86) || defined(CONFIG_SPARC64) +#if defined(CONFIG_X86) || defined(CONFIG_SPARC64) || defined(CONFIG_ARM)/* This is very useful, but only works on x86 and sparc64 right now */
<nitpick>Comment needs updating</nitpick>
Here's a new patch to keep the nitpickers quiet. ;)
Linus,
Please disregard the previous patch if you haven't applied it already and apply this one instead; if you have applied it, then I'll wait for the next pre-patch and send a new diff.
arch/arm/kernel/traps.c +16 -2
@@ -20,6 +20,7 @@#include <linux/mm.h> #include <linux/spinlock.h> #include <linux/ptrace.h> +#include <linux/elf.h> #include <linux/init.h> #include <asm/atomic.h>
@@ -27,6 +28,7 @@#include <asm/pgtable.h> #include <asm/system.h> #include <asm/uaccess.h> +#include <asm/unistd.h> #include "ptrace.h"
@@ -143,12 +145,24 @@c_backtrace (fp,processor_mode (regs)); } +/* +* This is called from SysRq-T (show_task) to display the current +* call trace for each process. Very useful. +*/ +void show_trace_task (struct task_struct *tsk) +{ +if (tsk != current) { +unsigned int fp = tsk->thread.save->fp; +c_backtrace (fp,0x10 ); + } +} +spinlock_t die_lock =SPIN_LOCK_UNLOCKED ;/* * This function is protected against re-entrancy. */ -void die (const char *str,struct pt_regs *regs,int err) +NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) {struct task_struct *tsk = current;
@@ -173,9 +187,9 @@ fs =get_fs ();set_fs (KERNEL_DS ); -dump_instr (regs);dump_stack (tsk, (unsigned long )(regs +1 ));dump_backtrace (regs, tsk); +dump_instr (regs);set_fs (fs); }
kernel/sched.c +9 -9
@@ -1104,7 +1104,7 @@int state;static const char * stat_nam[] = {"R" ,"S" ,"D" ,"Z" ,"T" ,"W" }; -printk ("%-8s " , p->comm); +printk ("%-13.13s " , p->comm); state = p->state ?ffz (~p->state) +1 :0 ;if (((unsigned ) state) <sizeof (stat_nam)/sizeof (char *))printk (stat_nam[state]);
@@ -1132,21 +1132,21 @@printk ("%5d " , p->p_cptr->pid); else printk(" "); -if (!p->mm) -printk (" (L-TLB) " ); -else -printk (" (NOTLB) " );if (p->p_ysptr)printk ("%7d" , p->p_ysptr->pid);else printk (" " );if (p->p_osptr) -printk (" %5d\n" , p->p_osptr->pid); +printk (" %5d" , p->p_osptr->pid); +else +printk (" " ); +if (!p->mm) +printk (" (L-TLB)\n" );else -printk ("\n" ); +printk (" (NOTLB)\n" ); -#if defined(CONFIG_X86 ) || defined(CONFIG_SPARC64 ) -/* This is very useful, but only works on x86 and sparc64 right now */ +#if defined(CONFIG_X86 ) || defined(CONFIG_SPARC64 ) || defined(CONFIG_ARM ) +/* This is very useful, but only works on ARM, x86 and sparc64 right now */ {extern void show_trace_task (struct task_struct *tsk);show_trace_task (p);
--
Russell King ([email protected]) The developer of ARM Linux
http://www.arm.linux.org.uk/personal/aboutme.html