Add log level to show_stack()
Subsystems (34)
v3 cover Add log level to show_stack()
Changes to v3:
- Collected more architectual Acks and Reviewed-by
- Fixed compilation on sparc64
Changes to v2:
- Removed excessive pr_cont("\n") (nits by Senozhatsky)
- Leave backtrace debugging messages with pr_debug() (noted by Russell King and Will Deacon)
- Correct microblaze_unwind_inner() declaration (Thanks to Michal Simek and kbuild test robot)
- Fix copy'n'paste typo in show_stack_loglvl() for sparc (kbuild robot)
- Fix backtrace output on xtensa
(Thanks Max Filippov)
- Add loglevel to show_stack() on s390 (kbuild robot)
- Collected all Reviewed-by and Acked-by (thanks!)
v2: https://lore.kernel.org/linux-riscv/[email protected]/
v1: https://lore.kernel.org/linux-riscv/[email protected]/
Add log level argument to show_stack().
Done in three stages:
1. Introducing show_stack_loglvl() for every architecture
2. Migrating old users with an explicit log level
3. Renaming show_stack_loglvl() into show_stack()
Justification:
o It's a design mistake to move a business-logic decision into platform realization detail.
o I have currently two patches sets that would benefit from this work:
Removing console_loglevel jumps in sysrq driver [1]
Hung task warning before panic [2] - suggested by Tetsuo (but he probably didn't realise what it would involve).
o While doing (1), (2) the backtraces were adjusted to headers and other messages for each situation - so there won't be a situation when the backtrace is printed, but the headers are missing because they have lesser log level (or the reverse).
o As the result in (2) plays with console_loglevel for kdb are removed.
The least important for upstream, but maybe still worth to note that every company I've worked in so far had an off-list patch to print backtrace with the needed log level (but only for the architecture they cared about).
If you have other ideas how you will benefit from show_stack() with a log level - please, reply to this cover letter.
See also discussion on v1:
https://lore.kernel.org/linux-riscv/[email protected]/
Thanks,
Dmitry
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
[2]: https://lkml.kernel.org/r/[email protected]
Dmitry Safonov (50):
kallsyms/printk: Add loglvl to print_ip_sym()
alpha: Add show_stack_loglvl()
arc: Add show_stack_loglvl()
arm/asm: Add loglvl to c_backtrace()
arm: Add loglvl to unwind_backtrace()
arm: Add loglvl to dump_backtrace()
arm: Wire up dump_backtrace_{entry,stm}
arm: Add show_stack_loglvl()
arm64: Add loglvl to dump_backtrace()
arm64: Add show_stack_loglvl()
c6x: Add show_stack_loglvl()
csky: Add show_stack_loglvl()
h8300: Add show_stack_loglvl()
hexagon: Add show_stack_loglvl()
ia64: Pass log level as arg into ia64_do_show_stack()
ia64: Add show_stack_loglvl()
m68k: Add show_stack_loglvl()
microblaze: Add loglvl to microblaze_unwind_inner()
microblaze: Add loglvl to microblaze_unwind()
microblaze: Add show_stack_loglvl()
mips: Add show_stack_loglvl()
nds32: Add show_stack_loglvl()
nios2: Add show_stack_loglvl()
openrisc: Add show_stack_loglvl()
parisc: Add show_stack_loglvl()
powerpc: Add show_stack_loglvl()
riscv: Add show_stack_loglvl()
s390: Add show_stack_loglvl()
sh: Add loglvl to dump_mem()
sh: Remove needless printk()
sh: Add loglvl to printk_address()
sh: Add loglvl to show_trace()
sh: Add show_stack_loglvl()
sparc: Add show_stack_loglvl()
um/sysrq: Remove needless variable sp
um: Add show_stack_loglvl()
unicore32: Remove unused pmode argument in c_backtrace()
unicore32: Add loglvl to c_backtrace()
unicore32: Add show_stack_loglvl()
x86: Add missing const qualifiers for log_lvl
x86: Add show_stack_loglvl()
xtensa: Add loglvl to show_trace()
xtensa: Add show_stack_loglvl()
sysrq: Use show_stack_loglvl()
x86/amd_gart: Print stacktrace for a leak with KERN_ERR
power: Use show_stack_loglvl()
kdb: Don't play with console_loglevel
sched: Print stack trace with KERN_INFO
kernel: Use show_stack_loglvl()
kernel: Rename show_stack_loglvl() => show_stack()
arch/alpha/kernel/traps.c | 22 +++++++-------- arch/arc/include/asm/bug.h | 3 ++- arch/arc/kernel/stacktrace.c | 17 +++++++----- arch/arc/kernel/troubleshoot.c | 2 +- arch/arm/include/asm/bug.h | 3 ++- arch/arm/include/asm/traps.h | 3 ++- arch/arm/include/asm/unwind.h | 3 ++- arch/arm/kernel/traps.c | 39 +++++++++++++++------------ arch/arm/kernel/unwind.c | 5 ++-- arch/arm/lib/backtrace-clang.S | 9 +++++-- arch/arm/lib/backtrace.S | 14 +++++++--- arch/arm64/include/asm/stacktrace.h | 3 ++- arch/arm64/kernel/process.c | 2 +- arch/arm64/kernel/traps.c | 17 ++++++------ arch/c6x/kernel/traps.c | 16 ++++++----- arch/csky/kernel/dumpstack.c | 9 ++++--- arch/csky/kernel/ptrace.c | 4 +-- arch/h8300/kernel/traps.c | 12 ++++----- arch/hexagon/kernel/traps.c | 25 ++++++++--------- arch/ia64/include/asm/ptrace.h | 1 - arch/ia64/kernel/mca.c | 2 +- arch/ia64/kernel/process.c | 17 ++++++------ arch/m68k/kernel/traps.c | 13 ++++----- arch/microblaze/include/asm/unwind.h | 3 ++- arch/microblaze/kernel/stacktrace.c | 4 +-- arch/microblaze/kernel/traps.c | 12 ++++----- arch/microblaze/kernel/unwind.c | 40 +++++++++++++++++----------- arch/mips/kernel/traps.c | 35 ++++++++++++------------ arch/nds32/kernel/traps.c | 15 ++++++----- arch/nios2/kernel/traps.c | 17 ++++++------ arch/openrisc/kernel/traps.c | 12 +++++---- arch/parisc/kernel/traps.c | 24 ++++++++--------- arch/powerpc/kernel/process.c | 15 ++++++----- arch/powerpc/kernel/stacktrace.c | 2 +- arch/riscv/kernel/stacktrace.c | 9 ++++--- arch/s390/kernel/dumpstack.c | 13 ++++----- arch/sh/include/asm/kdebug.h | 6 +++-- arch/sh/include/asm/processor_32.h | 2 +- arch/sh/kernel/dumpstack.c | 36 ++++++++++++------------- arch/sh/kernel/process_32.c | 2 +- arch/sh/kernel/process_64.c | 3 +-- arch/sh/kernel/traps.c | 4 +-- arch/sh/mm/fault.c | 2 +- arch/sparc/kernel/process_32.c | 10 +++---- arch/sparc/kernel/process_64.c | 2 +- arch/sparc/kernel/traps_64.c | 9 ++++--- arch/um/drivers/mconsole_kern.c | 2 +- arch/um/kernel/sysrq.c | 23 ++++++++-------- arch/unicore32/kernel/setup.h | 2 +- arch/unicore32/kernel/traps.c | 34 +++++++++++------------ arch/unicore32/lib/backtrace.S | 24 +++++++++++------ arch/x86/include/asm/stacktrace.h | 2 +- arch/x86/kernel/amd_gart_64.c | 2 +- arch/x86/kernel/dumpstack.c | 9 ++++--- arch/xtensa/kernel/traps.c | 22 ++++++++------- drivers/base/power/main.c | 2 +- drivers/tty/sysrq.c | 2 +- include/linux/kallsyms.h | 4 +-- include/linux/sched/debug.h | 3 ++- kernel/debug/kdb/kdb_bt.c | 15 ++++++----- kernel/locking/lockdep.c | 4 +-- kernel/locking/rtmutex-debug.c | 2 +- kernel/sched/core.c | 8 +++--- kernel/trace/ftrace.c | 8 +++--- lib/dump_stack.c | 2 +- tools/include/linux/kallsyms.h | 2 +- 66 files changed, 375 insertions(+), 315 deletions(-)
Signature · 1 line
2.26.0
PATCH v3 1/50 kallsyms/printk: Add loglvl to print_ip_sym()
print_ip_sym() needs to have a log level parameter to comply with other parts being printed. Otherwise, half of the expected backtrace would be printed and other may be missing with some logging level.
The following callee(s) are using now the adjusted log level:
- microblaze/unwind: the same level as headers & userspace unwind. Note that pr_debug()'s there are for debugging the unwinder itself.
- nds32/traps: symbol addresses are printed with the same log level as backtrace headers.
- lockdep: ip for locking issues is printed with the same log level as other part of the warning.
- sched: ip where preemption was disabled is printed as error like the rest part of the message.
- ftrace: bug reports are now consistent in the log level being used.
--- arch/microblaze/kernel/unwind.c | 2 +- arch/mips/kernel/traps.c | 4 ++-- arch/nds32/kernel/traps.c | 4 ++-- arch/riscv/kernel/stacktrace.c | 2 +- include/linux/kallsyms.h | 4 ++-- kernel/locking/lockdep.c | 4 ++-- kernel/sched/core.c | 6 ++---- kernel/trace/ftrace.c | 8 ++++---- tools/include/linux/kallsyms.h | 2 +- 9 files changed, 17 insertions(+), 19 deletions(-)
arch/microblaze/kernel/unwind.c +1 -1
@@ -254,7 +254,7 @@ static void microblaze_unwind_inner(struct task_struct *task, task->comm);break ; }else -print_ip_sym (pc); +print_ip_sym (KERN_INFO , pc); }/* Stop when we reach anything not part of the kernel */
arch/mips/kernel/traps.c +2 -2
@@ -123,7 +123,7 @@ static void show_raw_backtrace(unsigned long reg29)break ; }if (__kernel_text_address (addr)) -print_ip_sym (addr); +print_ip_sym (KERN_DEFAULT , addr); }printk ("\n" ); }
@@ -153,7 +153,7 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs) }printk ("Call Trace:\n" );do { -print_ip_sym (pc); +print_ip_sym (KERN_DEFAULT , pc); pc =unwind_stack (task, &sp, pc, &ra); }while (pc);pr_cont ("\n" );
arch/nds32/kernel/traps.c +2 -2
@@ -108,7 +108,7 @@ static void __dump(struct task_struct *tsk, unsigned long *base_reg)if (__kernel_text_address (ret_addr)) { ret_addr =ftrace_graph_ret_addr ( tsk, &graph, ret_addr,NULL ); -print_ip_sym (ret_addr); +print_ip_sym (KERN_EMERG , ret_addr); }if (--cnt <0 )break ;
@@ -124,7 +124,7 @@ static void __dump(struct task_struct *tsk, unsigned long *base_reg) ret_addr =ftrace_graph_ret_addr ( tsk, &graph, ret_addr,NULL ); -print_ip_sym (ret_addr); +print_ip_sym (KERN_EMERG , ret_addr); }if (--cnt <0 )break ;
arch/riscv/kernel/stacktrace.c +1 -1
@@ -99,7 +99,7 @@ static void notrace walk_stackframe(struct task_struct *task,static bool print_trace_address (unsigned long pc,void *arg) { -print_ip_sym (pc); +print_ip_sym (KERN_DEFAULT , pc);return false; }
include/linux/kallsyms.h +2 -2
@@ -165,9 +165,9 @@ static inline int kallsyms_show_value(void)#endif /*CONFIG_KALLSYMS*/ -static inline void print_ip_sym (unsigned long ip) +static inline void print_ip_sym (const char *loglvl,unsigned long ip) { -printk ("[<%px>] %pS\n" , (void *) ip, (void *) ip); +printk ("%s[<%px>] %pS\n" , loglvl, (void *) ip, (void *) ip); }#endif /*_LINUX_KALLSYMS_H*/
kernel/locking/lockdep.c +2 -2
@@ -4399,7 +4399,7 @@ static void print_unlock_imbalance_bug(struct task_struct *curr, curr->comm, task_pid_nr(curr));print_lockdep_cache (lock);pr_cont (") at:\n" ); -print_ip_sym (ip); +print_ip_sym (KERN_WARNING , ip);pr_warn ("but there are no more locks to release!\n" );pr_warn ("\nother info that might help us debug this:\n" );lockdep_print_held_locks (curr);
@@ -5050,7 +5050,7 @@ static void print_lock_contention_bug(struct task_struct *curr, curr->comm, task_pid_nr(curr));print_lockdep_cache (lock);pr_cont (") at:\n" ); -print_ip_sym (ip); +print_ip_sym (KERN_WARNING , ip);pr_warn ("but there are no locks held!\n" );pr_warn ("\nother info that might help us debug this:\n" );lockdep_print_held_locks (curr);
kernel/sched/core.c +2 -4
@@ -3864,8 +3864,7 @@ static noinline void __schedule_bug(struct task_struct *prev)if (IS_ENABLED (CONFIG_DEBUG_PREEMPT ) &&in_atomic_preempt_off ()) {pr_err ("Preemption disabled at:" ); -print_ip_sym (preempt_disable_ip); -pr_cont ("\n" ); +print_ip_sym (KERN_ERR , preempt_disable_ip); }if (panic_on_warn)panic ("scheduling while atomic\n" );
@@ -6800,8 +6799,7 @@ void ___might_sleep(const char *file, int line, int preempt_offset)if (IS_ENABLED (CONFIG_DEBUG_PREEMPT ) && !preempt_count_equals (preempt_offset)) {pr_err ("Preemption disabled at:" ); -print_ip_sym (preempt_disable_ip); -pr_cont ("\n" ); +print_ip_sym (KERN_ERR , preempt_disable_ip); }dump_stack ();add_taint (TAINT_WARN ,LOCKDEP_STILL_OK );
kernel/trace/ftrace.c +4 -4
@@ -2031,12 +2031,12 @@ void ftrace_bug(int failed, struct dyn_ftrace *rec)case -EFAULT :FTRACE_WARN_ON_ONCE (1 );pr_info ("ftrace faulted on modifying " ); -print_ip_sym (ip); +print_ip_sym (KERN_INFO , ip);break ;case -EINVAL :FTRACE_WARN_ON_ONCE (1 );pr_info ("ftrace failed to modify " ); -print_ip_sym (ip); +print_ip_sym (KERN_INFO , ip);print_ip_ins (" actual: " , (unsigned char *)ip);pr_cont ("\n" );if (ftrace_expected) {
@@ -2047,12 +2047,12 @@ void ftrace_bug(int failed, struct dyn_ftrace *rec)case -EPERM :FTRACE_WARN_ON_ONCE (1 );pr_info ("ftrace faulted on writing " ); -print_ip_sym (ip); +print_ip_sym (KERN_INFO , ip);break ;default :FTRACE_WARN_ON_ONCE (1 );pr_info ("ftrace faulted on unknown error " ); -print_ip_sym (ip); +print_ip_sym (KERN_INFO , ip); }print_bug_type ();if (rec) {
tools/include/linux/kallsyms.h +1 -1
@@ -20,7 +20,7 @@ static inline const char *kallsyms_lookup(unsigned long addr,#include <execinfo.h> #include <stdlib.h> -static inline void print_ip_sym (unsigned long ip) +static inline void print_ip_sym (const char *loglvl,unsigned long ip) {char **name;
Signature · 1 line
2.26.0
Re: [PATCHv3 01/50] kallsyms/printk: Add loglvl to print_ip_sym()
Quoted 3 lines · Dmitry Safonov
print_ip_sym()needs to have a log level parameter to comply with other parts being printed. Otherwise, half of the expected backtrace would be printed and other may be missing with some logging level.
I'd rather create another extension to %ps that also emits the [<address>] along with the symbol lookup and retire print_ip_sym altogether.
Something like:
--- lib/vsprintf.c | 4 ++++ 1 file changed, 4 insertions(+)
lib/vsprintf.c +4 -0
@@ -2072,6 +2072,8 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,* - 'S' For symbolic direct pointers (or function descriptors) with offset * - 's' For symbolic direct pointers (or function descriptors) without offset * - '[Ss]R' as above with __builtin_extract_return_addr() translation +* - '[Ss]B' [<address>] and symbolic direct pointers as above +* (was used previously used as print_ip_sym) * - '[Ff]' %pf and %pF were obsoleted and later removed in favor of * %ps and %pS. Be careful when re-using these specifiers. * - 'B' For backtraced symbolic direct pointers with offset
@@ -2183,6 +2185,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,case 'S' :case 's' : ptr =dereference_symbol_descriptor (ptr); +if (fmt[1 ] =='B' ) + buf +=vsprintf (buf, end,"[<%px>] " , ptr);/* Fallthrough */ case 'B' :return symbol_string (buf, end, ptr, spec, fmt);
Re: [PATCHv3 01/50] kallsyms/printk: Add loglvl to print_ip_sym()
Hi Joe,
Quoted 8 lines · Joe Perches
Quoted 3 lines · Dmitry Safonov
print_ip_sym()needs to have a log level parameter to comply with other parts being printed. Otherwise, half of the expected backtrace would be printed and other may be missing with some logging level.I'd rather create another extension to %ps that also emits the [<address>] along with the symbol lookup and retire
print_ip_symaltogether.
Makes sense.
Would you mind if I'll do it on the top of these patches? [not to mix new printk-format with patches those add loglvl parameter]
Quoted 22 lines
Something like:
--- lib/vsprintf.c | 4 ++++ 1 file changed, 4 insertions(+)lib/vsprintf.c +2
-0@@ -2072,6 +2072,8 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,* - 'S' For symbolic direct pointers (or function descriptors) with offset * - 's' For symbolic direct pointers (or function descriptors) without offset * - '[Ss]R' as above with __builtin_extract_return_addr() translation +* - '[Ss]B' [<address>] and symbolic direct pointers as above +* (was used previously used as print_ip_sym) * - '[Ff]' %pf and %pF were obsoleted and later removed in favor of * %ps and %pS. Be careful when re-using these specifiers. * - 'B' For backtraced symbolic direct pointers with offset
lib/vsprintf.c char *pointer(const char *fmt, char *buf, char *end, void *ptr, · line 2192
Quoted 8 lines
lib/vsprintf.c +2
-0@@ -2183,6 +2185,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,case 'S' :case 's' : ptr =dereference_symbol_descriptor (ptr); +if (fmt[1 ] =='B' ) + buf +=vsprintf (buf, end,"[<%px>] " , ptr);/* Fallthrough */ case 'B' :return symbol_string (buf, end, ptr, spec, fmt);
Thanks,
Dmitry
Re: [PATCHv3 01/50] kallsyms/printk: Add loglvl to print_ip_sym()
Quoted 1 line · Dmitry Safonov
Hi Joe,
Hi Dmitry.
Quoted 6 lines · Joe Perches
Quoted 5 lines · Dmitry Safonov
Quoted 3 lines
print_ip_sym()needs to have a log level parameter to comply with other parts being printed. Otherwise, half of the expected backtrace would be printed and other may be missing with some logging level.
Quoted 7 lines
Quoted 3 lines
I'd rather create another extension to %ps that also emits the [<address>] along with the symbol lookup and retire
print_ip_symaltogether.Makes sense.
Would you mind if I'll do it on the top of these patches? [not to mix new printk-format with patches those add loglvl parameter]
Of course not, but the proposal below doesn't compile and I've been playing with a slightly different implementation.
I'll post it in a few days.
PATCH v3 2/50 alpha: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Ivan Kokshaysky <[email protected]>
Cc: Matt Turner <[email protected]>
Cc: Richard Henderson <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/alpha/kernel/traps.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
arch/alpha/kernel/traps.c +17 -11
@@ -121,10 +121,10 @@ dik_show_code(unsigned int *pc) }static void -dik_show_trace (unsigned long *sp) +dik_show_trace (unsigned long *sp,const char *loglvl) {long i =0 ; -printk ("Trace:\n" ); +printk ("%sTrace:\n" , loglvl);while (0x1ff8 & (unsigned long ) sp) {extern char _stext[], _etext[];unsigned long tmp = *sp;
@@ -133,24 +133,25 @@ dik_show_trace(unsigned long *sp)continue ;if (tmp >= (unsigned long ) &_etext)continue ; -printk ("[<%lx>] %pSR\n" , tmp, (void *)tmp); +printk ("%s[<%lx>] %pSR\n" , loglvl, tmp, (void *)tmp);if (i >40 ) { -printk (" ..." ); +printk ("%s ..." , loglvl);break ; } } -printk ("\n" ); +printk ("%s\n" , loglvl); }static int kstack_depth_to_print =24 ; -void show_stack (struct task_struct *task,unsigned long *sp) +void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl) {unsigned long *stack;int i;/* -* debugging aid: "show_stack(NULL);" prints the +* debugging aid: "show_stack(NULL, NULL, KERN_EMERG);" prints the * back trace for this cpu. */ if (sp==NULL )
@@ -163,14 +164,19 @@ void show_stack(struct task_struct *task, unsigned long *sp)if ((i %4 ) ==0 ) {if (i)pr_cont ("\n" ); -printk (" " ); +printk ("%s " , loglvl); }else {pr_cont (" " ); }pr_cont ("%016lx" , *stack++); }pr_cont ("\n" ); -dik_show_trace (sp); +dik_show_trace (sp, loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *sp) +{ +show_stack_loglvl (task, sp,KERN_DEFAULT ); }void
@@ -184,7 +190,7 @@ die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)printk ("%s(%d): %s %ld\n" , current->comm,task_pid_nr (current), str, err);dik_show_regs (regs, r9_15);add_taint (TAINT_DIE ,LOCKDEP_NOW_UNRELIABLE ); -dik_show_trace ((unsigned long *)(regs+1 )); +dik_show_trace ((unsigned long *)(regs+1 ),KERN_DEFAULT );dik_show_code ((unsigned int *)regs->pc);if (test_and_set_thread_flag (TIF_DIE_IF_KERNEL )) {
@@ -625,7 +631,7 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,printk ("gp = %016lx sp = %p\n" , regs->gp, regs+1 );dik_show_code ((unsigned int *)pc); -dik_show_trace ((unsigned long *)(regs+1 )); +dik_show_trace ((unsigned long *)(regs+1 ),KERN_DEFAULT );if (test_and_set_thread_flag (TIF_DIE_IF_KERNEL )) {printk ("die_if_kernel recursion detected.\n" );
Signature · 1 line
2.26.0
PATCH v3 3/50 arc: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
As a good side-effect header "Stack Trace:" is now printed with the same log level as the rest of backtrace.
Cc: Vineet Gupta <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/arc/include/asm/bug.h | 3 ++- arch/arc/kernel/stacktrace.c | 21 +++++++++++++++------ arch/arc/kernel/troubleshoot.c | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-)
arch/arc/include/asm/bug.h +2 -1
@@ -13,7 +13,8 @@struct task_struct ;void show_regs (struct pt_regs *regs); -void show_stacktrace (struct task_struct *tsk,struct pt_regs *regs); +void show_stacktrace (struct task_struct *tsk,struct pt_regs *regs, +const char *loglvl);void show_kernel_fault_diag (const char *str,struct pt_regs *regs,unsigned long address);void die (const char *str,struct pt_regs *regs,unsigned long address);
arch/arc/kernel/stacktrace.c +15 -6
@@ -158,9 +158,11 @@ arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs,/* Call-back which plugs into unwinding core to dump the stack in * case of panic/OOPs/BUG etc */ -static int __print_sym (unsigned int address,void *unused) +static int __print_sym (unsigned int address,void *arg) { -printk (" %pS\n" , (void *)address); +const char *loglvl = arg; + +printk ("%s %pS\n" , loglvl, (void *)address);return 0 ; }
@@ -217,17 +219,24 @@ static int __get_first_nonsched(unsigned int address, void *unused)*------------------------------------------------------------------------- */ -noinline void show_stacktrace(struct task_struct *tsk, struct pt_regs *regs) +noinline void show_stacktrace(struct task_struct *tsk, struct pt_regs *regs, +const char *loglvl) { -pr_info ("\nStack Trace:\n" ); -arc_unwind_core (tsk, regs, __print_sym,NULL ); +printk ("%s\nStack Trace:\n" , loglvl); +arc_unwind_core (tsk, regs, __print_sym, (void *)loglvl); }EXPORT_SYMBOL (show_stacktrace);/* Expected by sched Code */ +void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, +const char *loglvl) +{ +show_stacktrace (tsk,NULL , loglvl); +} +void show_stack (struct task_struct *tsk,unsigned long *sp) { -show_stacktrace (tsk,NULL ); +show_stack_loglvl (tsk, sp,KERN_DEFAULT ); }/* Another API expected by schedular, shows up in "ps" as Wait Channel
arch/arc/kernel/troubleshoot.c +1 -1
@@ -242,5 +242,5 @@ void show_kernel_fault_diag(const char *str, struct pt_regs *regs,/* Show stack trace if this Fatality happened in kernel mode */ if (!user_mode (regs)) -show_stacktrace (current, regs); +show_stacktrace (current, regs,KERN_DEFAULT ); }
Signature · 1 line
2.26.0
PATCH v3 4/50 arm/asm: Add loglvl to c_backtrace()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to c_backtrace() as a preparation for introducing show_stack_loglvl().
Cc: Russell King <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: [email protected]
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/arm/include/asm/bug.h | 3 ++- arch/arm/include/asm/traps.h | 3 ++- arch/arm/kernel/traps.c | 9 +++++---- arch/arm/kernel/unwind.c | 2 +- arch/arm/lib/backtrace-clang.S | 9 +++++++-- arch/arm/lib/backtrace.S | 14 ++++++++++---- 6 files changed, 27 insertions(+), 13 deletions(-)
arch/arm/include/asm/bug.h +2 -1
@@ -82,7 +82,8 @@ void hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), int sig, int code, const char *name); -extern asmlinkage void c_backtrace(unsigned long fp, int pmode); +extern asmlinkage void c_backtrace(unsigned long fp, int pmode, +const char *loglvl);struct mm_struct ;void show_pte (const char *lvl,struct mm_struct *mm,unsigned long addr);
arch/arm/include/asm/traps.h +2 -1
@@ -29,7 +29,8 @@ static inline int __in_irqentry_text(unsigned long ptr) }extern void __init early_trap_init (void *); -extern void dump_backtrace_entry (unsigned long where,unsigned long from,unsigned long frame); +extern void dump_backtrace_entry (unsigned long where,unsigned long from, +unsigned long frame,const char *loglvl);extern void ptrace_break (struct pt_regs *regs);extern void *vectors_page;
arch/arm/kernel/traps.c +5 -4
@@ -62,7 +62,8 @@ __setup("user_debug=", user_debug_setup);static void dump_mem (const char *,const char *,unsigned long ,unsigned long ); -void dump_backtrace_entry (unsigned long where,unsigned long from,unsigned long frame) +void dump_backtrace_entry (unsigned long where,unsigned long from, +unsigned long frame,const char *loglvl) {unsigned long end = frame +4 +sizeof (struct pt_regs );
@@ -76,7 +77,7 @@ void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned longdump_mem ("" ,"Exception stack" , frame +4 , end); } -void dump_backtrace_stm (u32 *stack,u32 instruction) +void dump_backtrace_stm (u32 *stack,u32 instruction,const char *loglvl) {char str[80 ], *p;unsigned int x;
@@ -238,7 +239,7 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)pr_cont ("\n" );if (ok) - c_backtrace(fp, mode); + c_backtrace(fp, mode, NULL); }#endif
@@ -666,7 +667,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)dump_instr ("" , regs);if (user_mode (regs)) {__show_regs (regs); -c_backtrace (frame_pointer (regs),processor_mode (regs)); +c_backtrace (frame_pointer (regs),processor_mode (regs),NULL ); } }#endif
arch/arm/kernel/unwind.c +1 -1
@@ -493,7 +493,7 @@ void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk) urc =unwind_frame (&frame);if (urc <0 )break ; -dump_backtrace_entry (where, frame.pc, frame.sp -4 ); +dump_backtrace_entry (where, frame.pc, frame.sp -4 ,NULL ); } }
arch/arm/lib/backtrace-clang.S +7 -2
@@ -17,6 +17,7 @@ #define sv_pc r6 #define mask r7 #define sv_lr r8 +#define loglvl r9 ENTRY(c_backtrace)
@@ -99,6 +100,7 @@ ENDPROC(c_backtrace) @ to ensure 8 byte alignment movs frame, r0 @ if frame pointer is zero beq no_frame @ we have no stack frames + mov loglvl, r2 tst r1, #0x10 @ 26 or 32-bit mode? moveq mask, #0xfc000003 movne mask, #0 @ mask for 32-bit
@@ -167,6 +169,7 @@ finished_setup: mov r1, sv_lr mov r2, frame bic r1, r1, mask @ mask PC/LR for the mode + mov r3, loglvl bl dump_backtrace_entry /*
@@ -183,6 +186,7 @@ finished_setup: ldr r0, [frame] @ locals are stored in @ the preceding frame subeq r0, r0, #4 + mov r2, loglvl bleq dump_backtrace_stm @ dump saved registers /*
@@ -196,7 +200,8 @@ finished_setup: bhi for_each_frame 1006: adr r0, .Lbad - mov r1, frame + mov r1, loglvl + mov r2, frame bl printk no_frame: ldmfd sp!, {r4 - r9, fp, pc} ENDPROC(c_backtrace)
@@ -209,7 +214,7 @@ ENDPROC(c_backtrace) .long 1005b, 1006b .popsection -.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n" +.Lbad: .asciz "%sBacktrace aborted due to bad frame pointer <%p>\n" .align .Lopcode: .word 0xe92d4800 >> 11 @ stmfd sp!, {... fp, lr} .word 0x0b000000 @ bl if these bits are set
arch/arm/lib/backtrace.S +10 -4
@@ -18,6 +18,7 @@ #define sv_pc r6 #define mask r7 #define offset r8 +#define loglvl r9 ENTRY(c_backtrace)
@@ -25,9 +26,10 @@ ENTRY(c_backtrace) ret lr ENDPROC(c_backtrace) #else - stmfd sp!, {r4 - r8, lr} @ Save an extra register so we have a location... + stmfd sp!, {r4 - r9, lr} @ Save an extra register so we have a location... movs frame, r0 @ if frame pointer is zero beq no_frame @ we have no stack frames + mov loglvl, r2 tst r1, #0x10 @ 26 or 32-bit mode? ARM( moveq mask, #0xfc000003 )
@@ -73,6 +75,7 @@ for_each_frame: tst frame, mask @ Check for address exceptions ldr r1, [frame, #-4] @ get saved lr mov r2, frame bic r1, r1, mask @ mask PC/LR for the mode + mov r3, loglvl bl dump_backtrace_entry ldr r1, [sv_pc, #-4] @ if stmfd sp!, {args} exists,
@@ -80,12 +83,14 @@ for_each_frame: tst frame, mask @ Check for address exceptions teq r3, r1, lsr #11 ldreq r0, [frame, #-8] @ get sp subeq r0, r0, #4 @ point at the last arg + mov r2, loglvl bleq dump_backtrace_stm @ dump saved registers 1004: ldr r1, [sv_pc, #0] @ if stmfd sp!, {..., fp, ip, lr, pc} ldr r3, .Ldsi @ instruction exists, teq r3, r1, lsr #11 subeq r0, frame, #16 + mov r2, loglvl bleq dump_backtrace_stm @ dump saved registers teq sv_fp, #0 @ zero saved fp means
@@ -96,9 +101,10 @@ for_each_frame: tst frame, mask @ Check for address exceptions bhi for_each_frame 1006: adr r0, .Lbad - mov r1, frame + mov r1, loglvl + mov r2, frame bl printk -no_frame: ldmfd sp!, {r4 - r8, pc} +no_frame: ldmfd sp!, {r4 - r9, pc} ENDPROC(c_backtrace) .pushsection __ex_table,"a"
@@ -109,7 +115,7 @@ ENDPROC(c_backtrace) .long 1004b, 1006b .popsection -.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n" +.Lbad: .asciz "%sBacktrace aborted due to bad frame pointer <%p>\n" .align .Ldsi: .word 0xe92dd800 >> 11 @ stmfd sp!, {... fp, ip, lr, pc} .word 0xe92d0000 >> 11 @ stmfd sp!, {}
Signature · 7 lines
2.26.0 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 5/50 arm: Add loglvl to unwind_backtrace()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to unwind_backtrace() as a preparation for introducing show_stack_loglvl().
As a good side-effect arm_syscall() is now printing errors with the same log level as the backtrace.
Cc: Russell King <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: [email protected]
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/arm/include/asm/unwind.h | 3 ++- arch/arm/kernel/traps.c | 6 +++--- arch/arm/kernel/unwind.c | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-)
arch/arm/include/asm/unwind.h +2 -1
@@ -36,7 +36,8 @@ extern struct unwind_table *unwind_table_add(unsigned long start,unsigned long text_addr, unsigned long text_size);extern void unwind_table_del (struct unwind_table *tab); -extern void unwind_backtrace (struct pt_regs *regs,struct task_struct *tsk); +extern void unwind_backtrace (struct pt_regs *regs,struct task_struct *tsk, +const char *loglvl);#endif /* !__ASSEMBLY__ */
arch/arm/kernel/traps.c +3 -3
@@ -204,7 +204,7 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)#ifdef CONFIG_ARM_UNWIND static inline void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk) { -unwind_backtrace (regs, tsk); +unwind_backtrace (regs, tsk,KERN_DEFAULT ); }#else static void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk)
@@ -664,10 +664,10 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)if (user_debug &UDBG_SYSCALL ) {pr_err ("[%d] %s: arm syscall %d\n" ,task_pid_nr (current), current->comm, no); -dump_instr ("" , regs); +dump_instr (KERN_ERR , regs);if (user_mode (regs)) {__show_regs (regs); -c_backtrace (frame_pointer (regs),processor_mode (regs),NULL ); +c_backtrace (frame_pointer (regs),processor_mode (regs),KERN_ERR ); } }#endif
arch/arm/kernel/unwind.c +3 -2
@@ -455,7 +455,8 @@ int unwind_frame(struct stackframe *frame)return URC_OK ; } -void unwind_backtrace (struct pt_regs *regs,struct task_struct *tsk) +void unwind_backtrace (struct pt_regs *regs,struct task_struct *tsk, +const char *loglvl) {struct stackframe frame;
@@ -493,7 +494,7 @@ void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk) urc =unwind_frame (&frame);if (urc <0 )break ; -dump_backtrace_entry (where, frame.pc, frame.sp -4 ,NULL ); +dump_backtrace_entry (where, frame.pc, frame.sp -4 , loglvl); } }
Signature · 1 line
2.26.0
PATCH v3 6/50 arm: Add loglvl to dump_backtrace()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to dump_backtrace() as a preparation for introducing show_stack_loglvl().
As a good side-effect __die() now prints not only "Stack:" header with KERN_EMERG, but the backtrace itself.
Cc: Russell King <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: [email protected]
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/arm/kernel/traps.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
arch/arm/kernel/traps.c +9 -7
@@ -202,17 +202,19 @@ static void dump_instr(const char *lvl, struct pt_regs *regs) }#ifdef CONFIG_ARM_UNWIND -static inline void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk) +static inline void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk, +const char *loglvl) { -unwind_backtrace (regs, tsk,KERN_DEFAULT ); +unwind_backtrace (regs, tsk, loglvl); }#else -static void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk) +static void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk, +const char *loglvl) {unsigned int fp, mode;int ok =1 ; -printk ("Backtrace: " ); +printk ("%sBacktrace: " , loglvl);if (!tsk) tsk = current;
@@ -239,13 +241,13 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)pr_cont ("\n" );if (ok) - c_backtrace(fp, mode, NULL); + c_backtrace(fp, mode, loglvl); }#endif void show_stack (struct task_struct *tsk,unsigned long *sp) { -dump_backtrace (NULL , tsk); +dump_backtrace (NULL , tsk,KERN_DEFAULT );barrier (); }
@@ -289,7 +291,7 @@ static int __die(const char *str, int err, struct pt_regs *regs)if (!user_mode (regs) ||in_interrupt ()) {dump_mem (KERN_EMERG ,"Stack: " , regs->ARM_sp,THREAD_SIZE + (unsigned long )task_stack_page (tsk)); -dump_backtrace (regs, tsk); +dump_backtrace (regs, tsk,KERN_EMERG );dump_instr (KERN_EMERG , regs); }
Signature · 7 lines
2.26.0 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 7/50 arm: Wire up dump_backtrace_{entry,stm}
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Now that c_backtrace() always emits correct loglvl, use it for printing.
Cc: Russell King <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: [email protected]
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/arm/kernel/traps.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
arch/arm/kernel/traps.c +7 -5
@@ -68,13 +68,15 @@ void dump_backtrace_entry(unsigned long where, unsigned long from,unsigned long end = frame +4 +sizeof (struct pt_regs );#ifdef CONFIG_KALLSYMS -printk ("[<%08lx>] (%ps) from [<%08lx>] (%pS)\n" , where, (void *)where, from, (void *)from); +printk ("%s[<%08lx>] (%ps) from [<%08lx>] (%pS)\n" , + loglvl, where, (void *)where, from, (void *)from);#else -printk ("Function entered at [<%08lx>] from [<%08lx>]\n" , where, from); +printk ("%sFunction entered at [<%08lx>] from [<%08lx>]\n" , + loglvl, where, from);#endif if (in_entry_text (from) && end <=ALIGN (frame,THREAD_SIZE )) -dump_mem ("" ,"Exception stack" , frame +4 , end); +dump_mem (loglvl,"Exception stack" , frame +4 , end); }void dump_backtrace_stm (u32 *stack,u32 instruction,const char *loglvl)
@@ -89,12 +91,12 @@ void dump_backtrace_stm(u32 *stack, u32 instruction, const char *loglvl)if (++x ==6 ) { x =0 ; p = str; -printk ("%s\n" , str); +printk ("%s%s\n" , loglvl, str); } } }if (p != str) -printk ("%s\n" , str); +printk ("%s%s\n" , loglvl, str); }#ifndef CONFIG_ARM_UNWIND
Signature · 7 lines
2.26.0 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 8/50 arm: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Russell King <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: [email protected]
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/arm/kernel/traps.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/arm/kernel/traps.c +8 -2
@@ -247,12 +247,18 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk, }#endif -void show_stack (struct task_struct *tsk,unsigned long *sp) +void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, +const char *loglvl) { -dump_backtrace (NULL , tsk,KERN_DEFAULT ); +dump_backtrace (NULL , tsk, loglvl);barrier (); } +void show_stack (struct task_struct *tsk,unsigned long *sp) +{ +show_stack_loglvl (tsk, sp,KERN_DEFAULT ); +} +#ifdef CONFIG_PREEMPT #define S_PREEMPT " PREEMPT"#elif defined(CONFIG_PREEMPT_RT )
Signature · 1 line
2.26.0
PATCH v3 9/50 arm64: Add loglvl to dump_backtrace()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to dump_backtrace() as a preparation for introducing show_stack_loglvl().
Cc: Catalin Marinas <[email protected]>
Cc: Russell King <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/arm64/include/asm/stacktrace.h | 3 ++- arch/arm64/kernel/process.c | 2 +- arch/arm64/kernel/traps.c | 15 ++++++++------- 3 files changed, 11 insertions(+), 9 deletions(-)
arch/arm64/include/asm/stacktrace.h +2 -1
@@ -64,7 +64,8 @@ struct stackframe {extern int unwind_frame (struct task_struct *tsk,struct stackframe *frame);extern void walk_stackframe (struct task_struct *tsk,struct stackframe *frame,int (*fn)(struct stackframe *,void *),void *data); -extern void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk); +extern void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk, +const char *loglvl); DECLARE_PER_CPU(unsigned long *, irq_stack_ptr);
arch/arm64/kernel/process.c +1 -1
@@ -291,7 +291,7 @@ void __show_regs(struct pt_regs *regs)void show_regs (struct pt_regs * regs) {__show_regs (regs); -dump_backtrace (regs,NULL ); +dump_backtrace (regs,NULL ,KERN_DEFAULT ); }static void tls_thread_flush (void )
arch/arm64/kernel/traps.c +8 -7
@@ -53,9 +53,9 @@ static const char *handler[]= {int show_unhandled_signals =0 ; -static void dump_backtrace_entry (unsigned long where) +static void dump_backtrace_entry (unsigned long where,const char *loglvl) { -printk (" %pS\n" , (void *)where); +printk ("%s %pS\n" , loglvl, (void *)where); }static void dump_kernel_instr (const char *lvl,struct pt_regs *regs)
@@ -83,7 +83,8 @@ static void dump_kernel_instr(const char *lvl, struct pt_regs *regs)printk ("%sCode: %s\n" , lvl, str); } -void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk) +void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk, +const char *loglvl) {struct stackframe frame;int skip =0 ;
@@ -115,11 +116,11 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) thread_saved_pc(tsk)); } -printk ("Call trace:\n" ); +printk ("%sCall trace:\n" , loglvl); do { /* skip until specified stack frame */ if (!skip) { - dump_backtrace_entry(frame.pc); + dump_backtrace_entry(frame.pc, loglvl); } else if (frame.fp == regs->regs[29]) { skip = 0; /*
@@ -129,7 +130,7 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)* at which an exception has taken place, use regs->pc * instead. */ -dump_backtrace_entry (regs->pc); +dump_backtrace_entry (regs->pc, loglvl); } }while (!unwind_frame (tsk, &frame));
@@ -138,7 +139,7 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)void show_stack (struct task_struct *tsk,unsigned long *sp) { -dump_backtrace (NULL , tsk); +dump_backtrace (NULL , tsk,KERN_DEFAULT );barrier (); }
Signature · 7 lines
2.26.0 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 10/50 arm64: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Catalin Marinas <[email protected]>
Cc: Russell King <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/arm64/kernel/traps.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/arm64/kernel/traps.c +8 -2
@@ -137,12 +137,18 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,put_task_stack (tsk); } -void show_stack (struct task_struct *tsk,unsigned long *sp) +void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, +const char *loglvl) { -dump_backtrace (NULL , tsk,KERN_DEFAULT ); +dump_backtrace (NULL , tsk, loglvl);barrier (); } +void show_stack (struct task_struct *tsk,unsigned long *sp) +{ +show_stack_loglvl (tsk, sp,KERN_DEFAULT ); +} +#ifdef CONFIG_PREEMPT #define S_PREEMPT " PREEMPT"#elif defined(CONFIG_PREEMPT_RT )
Signature · 1 line
2.26.0
PATCH v3 11/50 c6x: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Aurelien Jacquiot <[email protected]>
Cc: Mark Salter <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/c6x/kernel/traps.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
arch/c6x/kernel/traps.c +14 -7
@@ -344,12 +344,13 @@ asmlinkage int process_exception(struct pt_regs *regs)static int kstack_depth_to_print =48 ; -static void show_trace (unsigned long *stack,unsigned long *endstack) +static void show_trace (unsigned long *stack,unsigned long *endstack, +const char *loglvl) {unsigned long addr;int i; -pr_debug ("Call trace:" ); +printk ("%sCall trace:" , loglvl); i =0 ;while (stack +1 <= endstack) { addr = *stack++;
@@ -364,16 +365,17 @@ static void show_trace(unsigned long *stack, unsigned long *endstack)if (__kernel_text_address (addr)) {#ifndef CONFIG_KALLSYMS if (i %5 ==0 ) -pr_debug ("\n " ); +printk ("%s\n " , loglvl);#endif -pr_debug (" [<%08lx>] %pS\n" , addr, (void *)addr); +printk ("%s [<%08lx>] %pS\n" , loglvl, addr, (void *)addr); i++; } } -pr_debug ("\n" ); +printk ("%s\n" , loglvl); } -void show_stack (struct task_struct *task,unsigned long *stack) +void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +const char *loglvl) {unsigned long *p, *endstack;int i;
@@ -398,7 +400,12 @@ void show_stack(struct task_struct *task, unsigned long *stack)pr_cont (" %08lx" , *p++); }pr_cont ("\n" ); -show_trace (stack, endstack); +show_trace (stack, endstack, loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *stack) +{ +show_stack_loglvl (task, stack,KERN_DEBUG ); }int is_valid_bugaddr (unsigned long addr)
Signature · 1 line
2.26.0
Re: [PATCHv3 11/50] c6x: Add show_stack_loglvl()
Quoted 4 lines · Dmitry Safonov
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
[]
arch/c6x/kernel/traps.c
Quoted 1 line
arch/c6x/kernel/traps.c +0
-0
[]
arch/c6x/kernel/traps.c asmlinkage int process_exception(struct pt_regs *regs) · line 353
Quoted 13 lines
arch/c6x/kernel/traps.c +3
-2@@ -344,12 +344,13 @@ asmlinkage int process_exception(struct pt_regs *regs)static int kstack_depth_to_print =48 ; -static void show_trace (unsigned long *stack,unsigned long *endstack) +static void show_trace (unsigned long *stack,unsigned long *endstack, +const char *loglvl) {unsigned long addr;int i; -pr_debug ("Call trace:" ); +printk ("%sCall trace:" , loglvl);
These are not equivalent transforms as pr_debug is compiled to nothing unless DEBUG is defined or CONFIG_DYNAMIC_DEBUG is enabled.
Perhaps all the conversions should be checked for these "not the same" object code changes.
Re: [PATCHv3 11/50] c6x: Add show_stack_loglvl()
Quoted 19 lines · Joe Perches
Quoted 4 lines · Dmitry Safonov
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).[]
arch/c6x/kernel/traps.c
Quoted 1 line
arch/c6x/kernel/traps.c +0
-0[]
Quoted 11 lines
arch/c6x/kernel/traps.c +2
-1@@ -344,12 +344,13 @@ asmlinkage int process_exception(struct pt_regs *regs)static int kstack_depth_to_print =48 ; -static void show_trace (unsigned long *stack,unsigned long *endstack) +static void show_trace (unsigned long *stack,unsigned long *endstack, +const char *loglvl) {unsigned long addr;int i;
Quoted 6 lines
arch/c6x/kernel/traps.c asmlinkage int process_exception(struct pt_regs *regs) · line 353
Quoted 2 lines
arch/c6x/kernel/traps.c +1
-1-pr_debug ("Call trace:" ); +printk ("%sCall trace:" , loglvl);These are not equivalent transforms as
pr_debugis compiled to nothing unless DEBUG is defined orCONFIG_DYNAMIC_DEBUGis enabled.
I guess this user is expecting pr_debug() as unconditional printk(KERN_DEBUG), for show_trace() and show_stack() will become waste of code if pr_debug() prints nothing. If this user wants pr_debug() to be conditional, #ifdef'ing these functions is the better.
Quoted 4 lines
Perhaps all the conversions should be checked for these "not the same" object code changes.
Re: [PATCHv3 11/50] c6x: Add show_stack_loglvl()
Quoted 27 lines · Tetsuo Handa
Quoted 19 lines · Joe Perches
Quoted 4 lines · Dmitry Safonov
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).[]
arch/c6x/kernel/traps.c
Quoted 1 line
arch/c6x/kernel/traps.c +0
-0[]
Quoted 11 lines
arch/c6x/kernel/traps.c +2
-1@@ -344,12 +344,13 @@ asmlinkage int process_exception(struct pt_regs *regs)static int kstack_depth_to_print =48 ; -static void show_trace (unsigned long *stack,unsigned long *endstack) +static void show_trace (unsigned long *stack,unsigned long *endstack, +const char *loglvl) {unsigned long addr;int i;Quoted 6 lines
arch/c6x/kernel/traps.c asmlinkage int process_exception(struct pt_regs *regs) · line 353
Quoted 2 lines
arch/c6x/kernel/traps.c +1
-1-pr_debug ("Call trace:" ); +printk ("%sCall trace:" , loglvl);These are not equivalent transforms as
pr_debugis compiled to nothing unless DEBUG is defined orCONFIG_DYNAMIC_DEBUGis enabled.
Quoted 3 lines
I guess this user is expecting
pr_debug()as unconditionalprintk(KERN_DEBUG), forshow_trace()andshow_stack()will become waste of code ifpr_debug()prints nothing. If this user wantspr_debug()to be conditional, #ifdef'ing these functions is the better.
Agree.
Quoted 2 lines
Quoted 2 lines
Perhaps all the conversions should be checked for these "not the same" object code changes.
I've checked other architectures - it seems only c6x was printing backtraces with pr_debug().
Is there a user for hiding all backtraces?
If there is, I think it's better to ifdef-out show_stack() under a new config HIDE_BACKTRACES or something.
Thanks,
Dmitry
PATCH v3 12/50 csky: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Guo Ren <[email protected]>
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/csky/kernel/dumpstack.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
arch/csky/kernel/dumpstack.c +10 -4
@@ -5,7 +5,7 @@int kstack_depth_to_print =48 ; -void show_trace (unsigned long *stack) +static void show_trace (unsigned long *stack,const char *loglvl) {unsigned long *stack_end;unsigned long *stack_start;
@@ -17,7 +17,7 @@ void show_trace(unsigned long *stack) stack_end = (unsigned long *) (addr +THREAD_SIZE ); fp = stack; -pr_info ("\nCall Trace:" ); +printk ("%s\nCall Trace:" , loglvl);while (fp > stack_start && fp < stack_end) {#ifdef CONFIG_STACKTRACE
@@ -32,7 +32,8 @@ void show_trace(unsigned long *stack)pr_cont ("\n" ); } -void show_stack (struct task_struct *task,unsigned long *stack) +void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +const char *loglvl) {if (!stack) {if (task)
@@ -45,5 +46,10 @@ void show_stack(struct task_struct *task, unsigned long *stack)#endif } -show_trace (stack); +show_trace (stack, loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *stack) +{ +show_stack_loglvl (task, stack,KERN_INFO ); }
Signature · 1 line
2.26.0
Andrew Morton
maintainerRe: [PATCHv3 12/50] csky: Add show_stack_loglvl()
Quoted 12 lines · On Sat, 18 Apr 2020 21:19:06 +0100 Dmitry Safonov <[email protected]> wrote:
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising
console_loglevelwhile printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where theprintk()was deferred.
Quoted 6 lines
Introducing log-level parameter and
KERN_UNSUPPRESSED[1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.Introduce
show_stack_loglvl(), that eventually will substituteshow_stack().
The csky code has changed a lot in linux-next due to 18c07d23da5a ("csky: Fixup calltrace panic"). I redid this patch as below. Can we please review and test?
From: Dmitry Safonov <[email protected]>
Subject: csky: add show_stack_loglvl()
Currently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
---
arch/csky/kernel/stacktrace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
arch/csky/kernel/stacktrace.c renamed from arch/csky/kernel/stacktrace.c~csky-add-show_stack_loglvl +9 -2
@@ -91,14 +91,21 @@ static void notrace walk_stackframe(strustatic bool print_trace_address (unsigned long pc,void *arg) { -print_ip_sym (pc); +print_ip_sym ((const char *)arg, pc);return false; } +void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl) +{ +pr_cont ("Call Trace:\n" ); +walk_stackframe (task,NULL , print_trace_address, (void *)loglvl); +} +void show_stack (struct task_struct *task,unsigned long *sp) {pr_cont ("Call Trace:\n" ); -walk_stackframe (task,NULL , print_trace_address,NULL ); +walk_stackframe (task,NULL , print_trace_address,KERN_INFO ); }static bool save_wchan (unsigned long pc,void *arg)
_
Re: [PATCHv3 12/50] csky: Add show_stack_loglvl()
Hi Andrew,
Quoted 18 lines · Andrew Morton
Quoted 16 lines · On Sat, 18 Apr 2020 21:19:06 +0100 Dmitry Safonov <[email protected]> wrote:
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising
console_loglevelwhile printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where theprintk()was deferred.Introducing log-level parameter and
KERN_UNSUPPRESSED[1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Quoted 6 lines
Quoted 2 lines
Introduce
show_stack_loglvl(), that eventually will substituteshow_stack().The csky code has changed a lot in linux-next due to
18c07d23da5a("csky: Fixup calltrace panic"). I redid this patch as below. Can we please review and test?
The result looks good to me, thanks for the rebase!
Thanks,
Dmitry
PATCH v3 13/50 h8300: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Yoshinori Sato <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/h8300/kernel/traps.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
arch/h8300/kernel/traps.c +12 -6
@@ -115,7 +115,8 @@ void die(const char *str, struct pt_regs *fp, unsigned long err)static int kstack_depth_to_print =24 ; -void show_stack (struct task_struct *task,unsigned long *esp) +void show_stack_loglvl (struct task_struct *task,unsigned long *esp, +const char *loglvl) {unsigned long *stack, addr;int i;
@@ -125,17 +126,17 @@ void show_stack(struct task_struct *task, unsigned long *esp) stack = esp; -pr_info ("Stack from %08lx:" , (unsigned long )stack); +printk ("%sStack from %08lx:" , loglvl, (unsigned long )stack);for (i =0 ; i < kstack_depth_to_print; i++) {if (((unsigned long )stack & (THREAD_SIZE -1 )) >=THREAD_SIZE -4 )break ;if (i %8 ==0 ) -pr_info (" " ); +printk ("%s " , loglvl);pr_cont (" %08lx" , *stack++); } -pr_info ("\nCall Trace:\n" ); +printk ("%s\nCall Trace:\n" , loglvl); i =0 ; stack = esp;while (((unsigned long )stack & (THREAD_SIZE -1 )) <THREAD_SIZE -4 ) {
@@ -150,10 +151,15 @@ void show_stack(struct task_struct *task, unsigned long *esp)*/ if (check_kernel_text (addr)) {if (i %4 ==0 ) -pr_info (" " ); +printk ("%s " , loglvl);pr_cont (" [<%08lx>]" , addr); i++; } } -pr_info ("\n" ); +printk ("%s\n" , loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *esp) +{ +show_stack_loglvl (task, esp,KERN_INFO ); }
Signature · 1 line
2.26.0
PATCH v3 14/50 hexagon: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
As a good side-effect die() now prints the stacktrace with KERN_EMERG aligned with other messages.
Cc: Brian Cain <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/hexagon/kernel/traps.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-)
arch/hexagon/kernel/traps.c +17 -14
@@ -79,7 +79,7 @@ static const char *ex_name(int ex) }static void do_show_stack (struct task_struct *task,unsigned long *fp, -unsigned long ip) +unsigned long ip,const char *loglvl) {int kstack_depth_to_print =24 ;unsigned long offset, size;
@@ -93,9 +93,8 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp,if (task ==NULL ) task = current; -printk (KERN_INFO "CPU#%d, %s/%d, Call Trace:\n" , -raw_smp_processor_id (), task->comm, -task_pid_nr (task)); +printk ("%sCPU#%d, %s/%d, Call Trace:\n" , loglvl,raw_smp_processor_id (), + task->comm,task_pid_nr (task));if (fp ==NULL ) {if (task == current) {
@@ -108,7 +107,7 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp, }if ((((unsigned long ) fp) &0x3 ) || ((unsigned long ) fp <0x1000 )) { -printk (KERN_INFO "-- Corrupt frame pointer %p\n" , fp); +printk ("%s-- Corrupt frame pointer %p\n" , loglvl, fp);return ; }
@@ -125,8 +124,7 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp, name =kallsyms_lookup (ip, &size, &offset, &modname, tmpstr); -printk (KERN_INFO "[%p] 0x%lx: %s + 0x%lx" , fp, ip, name, - offset); +printk ("%s[%p] 0x%lx: %s + 0x%lx" , loglvl, fp, ip, name, offset);if (((unsigned long ) fp < low) || (high < (unsigned long ) fp))printk (KERN_CONT " (FP out of bounds!)" );if (modname)
@@ -136,8 +134,7 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp, newfp = (unsigned long *) *fp;if (((unsigned long ) newfp) &0x3 ) { -printk (KERN_INFO "-- Corrupt frame pointer %p\n" , - newfp); +printk ("%s-- Corrupt frame pointer %p\n" , loglvl, newfp);break ; }
@@ -147,7 +144,7 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp, + 8);if (regs->syscall_nr !=-1 ) { -printk (KERN_INFO "-- trap0 -- syscall_nr: %ld" , +printk ("%s-- trap0 -- syscall_nr: %ld" , loglvl, regs->syscall_nr);printk (KERN_CONT " psp: %lx elr: %lx\n" ,pt_psp (regs),pt_elr (regs));
@@ -155,7 +152,7 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp, }else {/* really want to see more ... */ kstack_depth_to_print +=6 ; -printk (KERN_INFO "-- %s (0x%lx) badva: %lx\n" , +printk ("%s-- %s (0x%lx) badva: %lx\n" , loglvl,ex_name (pt_cause (regs)),pt_cause (regs),pt_badva (regs)); }
@@ -178,10 +175,16 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp, } } -void show_stack (struct task_struct *task,unsigned long *fp) +void show_stack_loglvl (struct task_struct *task,unsigned long *fp, +const char *loglvl) {/* Saved link reg is one word above FP */ -do_show_stack (task, fp,0 ); +do_show_stack (task, fp,0 , loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *fp) +{ +show_stack_loglvl (task, fp,0 ,KERN_INFO ); }int die (const char *str,struct pt_regs *regs,long err)
@@ -207,7 +210,7 @@ int die(const char *str, struct pt_regs *regs, long err)print_modules ();show_regs (regs); -do_show_stack (current, ®s->r30,pt_elr (regs)); +do_show_stack (current, ®s->r30,pt_elr (regs),KERN_EMERG );bust_spinlocks (0 );add_taint (TAINT_DIE ,LOCKDEP_NOW_UNRELIABLE );
Signature · 1 line
2.26.0
PATCH v3 15/50 ia64: Pass log level as arg into ia64_do_show_stack()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to ia64_do_show_stack() as a preparation to introduce show_stack_loglvl().
Also, make ia64_do_show_stack() static as it's not used outside.
Cc: Fenghua Yu <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/ia64/include/asm/ptrace.h | 1 - arch/ia64/kernel/process.c | 13 +++++++------ 2 files changed, 7 insertions(+), 7 deletions(-)
arch/ia64/include/asm/ptrace.h +0 -1
@@ -114,7 +114,6 @@ static inline long regs_return_value(struct pt_regs *regs)struct task_struct ;/* forward decl */ struct unw_frame_info ;/* forward decl */ -extern void ia64_do_show_stack (struct unw_frame_info *,void *);extern unsigned long ia64_get_user_rbs_end (struct task_struct *,struct pt_regs *,unsigned long *); extern long ia64_peek (struct task_struct *, struct switch_stack *, unsigned long,
arch/ia64/kernel/process.c +7 -6
@@ -64,12 +64,13 @@ EXPORT_SYMBOL(boot_option_idle_override);void (*pm_power_off) (void );EXPORT_SYMBOL (pm_power_off); -void +static void ia64_do_show_stack (struct unw_frame_info *info,void *arg) {unsigned long ip, sp, bsp; +const char *loglvl = arg; -printk ("\nCall Trace:\n" ); +printk ("%s\nCall Trace:\n" , loglvl); do { unw_get_ip(info, &ip); if (ip = 0)
@@ -77,9 +78,9 @@ ia64_do_show_stack (struct unw_frame_info *info, void *arg)unw_get_sp (info, &sp);unw_get_bsp (info, &bsp); -printk (" [<%016lx>] %pS\n" +printk ("%s [<%016lx>] %pS\n" " sp=%016lx bsp=%016lx\n" , - ip, (void *)ip, sp, bsp); + loglvl, ip, (void *)ip, sp, bsp); }while (unw_unwind (info) >=0 ); }
@@ -87,12 +88,12 @@ void show_stack (struct task_struct *task, unsigned long *sp) {if (!task) -unw_init_running (ia64_do_show_stack,NULL ); +unw_init_running (ia64_do_show_stack, (void *)KERN_DEFAULT );else {struct unw_frame_info info;unw_init_from_blocked_task (&info, task); -ia64_do_show_stack (&info,NULL ); +ia64_do_show_stack (&info, (void *)KERN_DEFAULT ); } }
Signature · 1 line
2.26.0
PATCH v3 16/50 ia64: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Fenghua Yu <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/ia64/kernel/process.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
arch/ia64/kernel/process.c +10 -3
@@ -85,18 +85,25 @@ ia64_do_show_stack (struct unw_frame_info *info, void *arg) }void -show_stack (struct task_struct *task,unsigned long *sp) +show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl) {if (!task) -unw_init_running (ia64_do_show_stack, (void *)KERN_DEFAULT ); +unw_init_running (ia64_do_show_stack, (void *)loglvl);else {struct unw_frame_info info;unw_init_from_blocked_task (&info, task); -ia64_do_show_stack (&info, (void *)KERN_DEFAULT ); +ia64_do_show_stack (&info, (void *)loglvl); } } +void +show_stack (struct task_struct *task,unsigned long *sp) +{ +show_stack_loglvl (task, sp,KERN_DEFAULT ); +} +void show_regs (struct pt_regs *regs) {
Signature · 1 line
2.26.0
PATCH v3 17/50 m68k: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Geert Uytterhoeven <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/m68k/kernel/traps.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
arch/m68k/kernel/traps.c +11 -5
@@ -811,13 +811,13 @@ asmlinkage void buserr_c(struct frame *fp)static int kstack_depth_to_print =48 ; -void show_trace (unsigned long *stack) +static void show_trace (unsigned long *stack,const char *loglvl) {unsigned long *endstack;unsigned long addr;int i; -pr_info ("Call Trace:" ); +printk ("%sCall Trace:" , loglvl); addr = (unsigned long )stack +THREAD_SIZE -1 ; endstack = (unsigned long *)(addr & -THREAD_SIZE ); i =0 ;
@@ -935,7 +935,8 @@ void show_registers(struct pt_regs *regs)pr_cont ("\n" ); } -void show_stack (struct task_struct *task,unsigned long *stack) +void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +const char *loglvl) {unsigned long *p;unsigned long *endstack;
@@ -949,7 +950,7 @@ void show_stack(struct task_struct *task, unsigned long *stack) } endstack = (unsigned long *)(((unsigned long )stack +THREAD_SIZE -1 ) & -THREAD_SIZE ); -pr_info ("Stack from %08lx:" , (unsigned long )stack); +printk ("%sStack from %08lx:" , loglvl, (unsigned long )stack); p = stack;for (i =0 ; i < kstack_depth_to_print; i++) {if (p +1 > endstack)
@@ -959,7 +960,12 @@ void show_stack(struct task_struct *task, unsigned long *stack)pr_cont (" %08lx" , *p++); }pr_cont ("\n" ); -show_trace (stack); +show_trace (stack, loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *stack) +{ +show_stack_loglvl (task, stack,KERN_INFO ); }/*
Signature · 1 line
2.26.0
PATCH v3 18/50 microblaze: Add loglvl to microblaze_unwind_inner()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to microblaze_unwind_inner() as a preparation for introducing show_stack_loglvl().
Cc: Michal Simek <[email protected]>
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/microblaze/kernel/unwind.c | 38 ++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 15 deletions(-)
arch/microblaze/kernel/unwind.c +23 -15
@@ -154,7 +154,8 @@ static int lookup_prev_stack_frame(unsigned long fp, unsigned long pc,static void microblaze_unwind_inner (struct task_struct *task,unsigned long pc,unsigned long fp,unsigned long leaf_return, -struct stack_trace *trace); +struct stack_trace *trace, +const char *loglvl);/** * unwind_trap - Unwind through a system trap, that stored previous state
@@ -162,16 +163,18 @@ static void microblaze_unwind_inner(struct task_struct *task,*/ #ifdef CONFIG_MMU static inline void unwind_trap (struct task_struct *task,unsigned long pc, -unsigned long fp,struct stack_trace *trace) +unsigned long fp,struct stack_trace *trace, +const char *loglvl) {/* To be implemented */ }#else static inline void unwind_trap (struct task_struct *task,unsigned long pc, -unsigned long fp,struct stack_trace *trace) +unsigned long fp,struct stack_trace *trace, +const char *loglvl) {const struct pt_regs *regs = (const struct pt_regs *) fp; -microblaze_unwind_inner (task, regs->pc, regs->r1, regs->r15, trace); +microblaze_unwind_inner (task, regs->pc, regs->r1, regs->r15, trace, loglvl); }#endif
@@ -184,11 +187,13 @@ static inline void unwind_trap(struct task_struct *task, unsigned long pc,* the caller's return address. * @trace : Where to store stack backtrace (PC values). * NULL == print backtrace to kernel log +* @loglvl : Used for printk log level if (trace == NULL). */ static void microblaze_unwind_inner (struct task_struct *task,unsigned long pc,unsigned long fp,unsigned long leaf_return, -struct stack_trace *trace) +struct stack_trace *trace, +const char *loglvl) {int ofs =0 ;
@@ -214,11 +219,11 @@ static void microblaze_unwind_inner(struct task_struct *task,const struct pt_regs *regs = (const struct pt_regs *) fp;#endif -pr_info ("HW EXCEPTION\n" ); +printk ("%sHW EXCEPTION\n" , loglvl);#ifndef CONFIG_MMU microblaze_unwind_inner (task, regs->r17 -4 , fp +EX_HANDLER_STACK_SIZ , - regs->r15, trace); + regs->r15, trace, loglvl);#endif return ; }
@@ -228,8 +233,8 @@ static void microblaze_unwind_inner(struct task_struct *task,if ((return_to >= handler->start_addr) && (return_to <= handler->end_addr)) {if (!trace) -pr_info ("%s\n" , handler->trap_name); -unwind_trap (task, pc, fp, trace); +printk ("%s%s\n" , loglvl, handler->trap_name); +unwind_trap (task, pc, fp, trace, loglvl);return ; } }
@@ -248,13 +253,13 @@ static void microblaze_unwind_inner(struct task_struct *task, }else {/* Have we reached userland? */ if (unlikely (pc ==task_pt_regs (task)->pc)) { -pr_info ("[<%p>] PID %lu [%s]\n" , - (void *) pc, +printk ("%s[<%p>] PID %lu [%s]\n" , + loglvl, (void *) pc, (unsigned long ) task->pid, task->comm);break ; }else -print_ip_sym (KERN_INFO , pc); +print_ip_sym (loglvl, pc); }/* Stop when we reach anything not part of the kernel */
@@ -285,11 +290,13 @@ static void microblaze_unwind_inner(struct task_struct *task,*/ void microblaze_unwind (struct task_struct *task,struct stack_trace *trace) { +const char *loglvl =KERN_INFO ; +if (task) {if (task == current) {const struct pt_regs *regs =task_pt_regs (task);microblaze_unwind_inner (task, regs->pc, regs->r1, - regs->r15, trace); + regs->r15, trace, loglvl); }else {struct thread_info *thread_info = (struct thread_info *)(task->stack);
@@ -299,7 +306,8 @@ void microblaze_unwind(struct task_struct *task, struct stack_trace *trace)microblaze_unwind_inner (task, (unsigned long ) &_switch_to, cpu_context->r1, - cpu_context->r15, trace); + cpu_context->r15, + trace, loglvl); } }else {unsigned long pc, fp;
@@ -314,7 +322,7 @@ void microblaze_unwind(struct task_struct *task, struct stack_trace *trace) );/* Since we are not a leaf function, use leaf_return = 0 */ -microblaze_unwind_inner (current, pc, fp,0 , trace); +microblaze_unwind_inner (current, pc, fp,0 , trace, loglvl); } }
Signature · 1 line
2.26.0
PATCH v3 19/50 microblaze: Add loglvl to microblaze_unwind()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level parameter to microblaze_unwind() as a preparation to add show_stack_loglvl().
Cc: Michal Simek <[email protected]>
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/microblaze/include/asm/unwind.h | 3 ++- arch/microblaze/kernel/stacktrace.c | 4 ++-- arch/microblaze/kernel/traps.c | 2 +- arch/microblaze/kernel/unwind.c | 6 +++--- 4 files changed, 8 insertions(+), 7 deletions(-)
arch/microblaze/include/asm/unwind.h +2 -1
@@ -20,7 +20,8 @@ extern struct trap_handler_info microblaze_trap_handlers;extern const char _hw_exception_handler;extern const char ex_handler_unhandled; -void microblaze_unwind (struct task_struct *task,struct stack_trace *trace); +void microblaze_unwind (struct task_struct *task,struct stack_trace *trace, +const char *loglvl);#endif /* __MICROBLAZE_UNWIND_H */
arch/microblaze/kernel/stacktrace.c +2 -2
@@ -20,12 +20,12 @@ void save_stack_trace(struct stack_trace *trace) {/* Exclude our helper functions from the trace*/ trace->skip +=2 ; -microblaze_unwind (NULL , trace); +microblaze_unwind (NULL , trace,"" ); }EXPORT_SYMBOL_GPL (save_stack_trace);void save_stack_trace_tsk (struct task_struct *tsk,struct stack_trace *trace) { -microblaze_unwind (tsk, trace); +microblaze_unwind (tsk, trace,"" ); }EXPORT_SYMBOL_GPL (save_stack_trace_tsk);
arch/microblaze/kernel/traps.c +1 -1
@@ -68,7 +68,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)print_hex_dump (KERN_INFO ,"" ,DUMP_PREFIX_ADDRESS ,32 ,4 , (void *)fp, words_to_show <<2 ,0 );pr_info ("\n\nCall Trace:\n" ); -microblaze_unwind (task,NULL ); +microblaze_unwind (task,NULL ,KERN_INFO );pr_info ("\n" );if (!task)
arch/microblaze/kernel/unwind.c +3 -3
@@ -287,11 +287,11 @@ static void microblaze_unwind_inner(struct task_struct *task,* @task : Task whose stack we are to unwind (NULL == current) * @trace : Where to store stack backtrace (PC values). * NULL == print backtrace to kernel log +* @loglvl : Used for printk log level if (trace == NULL). */ -void microblaze_unwind (struct task_struct *task,struct stack_trace *trace) +void microblaze_unwind (struct task_struct *task,struct stack_trace *trace, +const char *loglvl) { -const char *loglvl =KERN_INFO ; -if (task) {if (task == current) {const struct pt_regs *regs =task_pt_regs (task);
Signature · 1 line
2.26.0
PATCH v3 20/50 microblaze: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Michal Simek <[email protected]>
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/microblaze/kernel/traps.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
arch/microblaze/kernel/traps.c +12 -6
@@ -31,7 +31,8 @@ static int __init kstack_setup(char *s) }__setup ("kstack=" , kstack_setup); -void show_stack (struct task_struct *task,unsigned long *sp) +void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl) {unsigned long words_to_show;u32 fp = (u32 ) sp;
@@ -50,7 +51,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)if (kstack_depth_to_print && (words_to_show > kstack_depth_to_print)) words_to_show = kstack_depth_to_print; -pr_info ("Kernel Stack:\n" ); +printk ("%sKernel Stack:\n" , loglvl);/* * Make the first line an 'odd' size if necessary to get
@@ -65,14 +66,19 @@ void show_stack(struct task_struct *task, unsigned long *sp) words_to_show -= line1_words; } } -print_hex_dump (KERN_INFO ,"" ,DUMP_PREFIX_ADDRESS ,32 ,4 , (void *)fp, +print_hex_dump (loglvl,"" ,DUMP_PREFIX_ADDRESS ,32 ,4 , (void *)fp, words_to_show <<2 ,0 ); -pr_info ("\n\nCall Trace:\n" ); -microblaze_unwind (task,NULL ,KERN_INFO ); -pr_info ("\n" ); +printk ("%s\n\nCall Trace:\n" , loglvl); +microblaze_unwind (task,NULL , loglvl); +printk ("%s\n" , loglvl);if (!task) task = current;debug_show_held_locks (task); } + +void show_stack (struct task_struct *task,unsigned long *sp) +{ +show_stack_loglvl (task, sp,KERN_INFO ); +}
Signature · 1 line
2.26.0
PATCH v3 21/50 mips: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: James Hogan <[email protected]>
Cc: Paul Burton <[email protected]>
Cc: Ralf Baechle <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/mips/kernel/traps.c | 41 +++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-)
arch/mips/kernel/traps.c +24 -17
@@ -106,26 +106,26 @@ void (*board_bind_eic_interrupt)(int irq, int regset);void (*board_ebase_setup)(void );void (*board_cache_error_setup)(void ); -static void show_raw_backtrace (unsigned long reg29) +static void show_raw_backtrace (unsigned long reg29,const char *loglvl) {unsigned long *sp = (unsigned long *)(reg29 & ~3 );unsigned long addr; -printk ("Call Trace:" ); +printk ("%sCall Trace:" , loglvl);#ifdef CONFIG_KALLSYMS -printk ("\n" ); +printk ("%s\n" , loglvl);#endif while (!kstack_end (sp)) {unsigned long __user *p = (unsigned long __user *)(unsigned long )sp++;if (__get_user (addr, p)) { -printk (" (Bad stack address)" ); +printk ("%s (Bad stack address)" , loglvl);break ; }if (__kernel_text_address (addr)) -print_ip_sym (KERN_DEFAULT , addr); +print_ip_sym (loglvl, addr); } -printk ("\n" ); +printk ("%s\n" , loglvl); }#ifdef CONFIG_KALLSYMS
@@ -138,7 +138,8 @@ static int __init set_raw_show_trace(char *str)__setup ("raw_show_trace" , set_raw_show_trace);#endif -static void show_backtrace (struct task_struct *task,const struct pt_regs *regs) +static void show_backtrace (struct task_struct *task,const struct pt_regs *regs, +const char *loglvl) {unsigned long sp = regs->regs[29 ];unsigned long ra = regs->regs[31 ];
@@ -148,12 +149,12 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs) task = current;if (raw_show_trace ||user_mode (regs) || !__kernel_text_address (pc)) { -show_raw_backtrace (sp); +show_raw_backtrace (sp, loglvl);return ; } -printk ("Call Trace:\n" ); +printk ("%sCall Trace:\n" , loglvl);do { -print_ip_sym (KERN_DEFAULT , pc); +print_ip_sym (loglvl, pc); pc =unwind_stack (task, &sp, pc, &ra); }while (pc);pr_cont ("\n" );
@@ -164,19 +165,19 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs)* with at least a bit of error checking ... */ static void show_stacktrace (struct task_struct *task, -const struct pt_regs *regs) +const struct pt_regs *regs,const char *loglvl) {const int field =2 *sizeof (unsigned long );long stackdata;int i;unsigned long __user *sp = (unsigned long __user *)regs->regs[29 ]; -printk ("Stack :" ); +printk ("%sStack :" , loglvl); i =0 ;while ((unsigned long ) sp & (PAGE_SIZE -1 )) {if (i && ((i % (64 / field)) ==0 )) {pr_cont ("\n" ); -printk (" " ); +printk ("%s " , loglvl); }if (i >39 ) {pr_cont (" ..." );
@@ -192,10 +193,11 @@ static void show_stacktrace(struct task_struct *task, i++; }pr_cont ("\n" ); -show_backtrace (task, regs); +show_backtrace (task, regs, loglvl); } -void show_stack (struct task_struct *task,unsigned long *sp) +void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl) {struct pt_regs regs;mm_segment_t old_fs =get_fs ();
@@ -219,10 +221,15 @@ void show_stack(struct task_struct *task, unsigned long *sp)* the stack in the kernel (not user) address space. */ set_fs (KERNEL_DS ); -show_stacktrace (task, ®s); +show_stacktrace (task, ®s, loglvl);set_fs (old_fs); } +void show_stack (struct task_struct *task,unsigned long *sp) +{ + show_stack_loglvl(task, sp, KERN_DEFAULT) +} +static void show_code (unsigned int __user *pc) {long i;
@@ -371,7 +378,7 @@ void show_registers(struct pt_regs *regs)if (!user_mode (regs))/* Necessary for getting the correct stack content */ set_fs (KERNEL_DS ); -show_stacktrace (current, regs); +show_stacktrace (current, regs,KERN_DEFAULT );show_code ((unsigned int __user *) regs->cp0_epc);printk ("\n" );set_fs (old_fs);
Signature · 1 line
2.26.0
PATCH v3 22/50 nds32: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Greentime Hu <[email protected]>
Cc: Vincent Chen <[email protected]>
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/nds32/kernel/traps.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
arch/nds32/kernel/traps.c +14 -7
@@ -97,18 +97,19 @@ static void dump_instr(struct pt_regs *regs) }#define LOOP_TIMES (100) -static void __dump (struct task_struct *tsk,unsigned long *base_reg) +static void __dump (struct task_struct *tsk,unsigned long *base_reg, +const char *loglvl) {unsigned long ret_addr;int cnt =LOOP_TIMES , graph =0 ; -pr_emerg ("Call Trace:\n" ); +printk ("%sCall Trace:\n" , loglvl);if (!IS_ENABLED (CONFIG_FRAME_POINTER )) {while (!kstack_end (base_reg)) { ret_addr = *base_reg++;if (__kernel_text_address (ret_addr)) { ret_addr =ftrace_graph_ret_addr ( tsk, &graph, ret_addr,NULL ); -print_ip_sym (KERN_EMERG , ret_addr); +print_ip_sym (loglvl, ret_addr); }if (--cnt <0 )break ;
@@ -124,17 +125,18 @@ static void __dump(struct task_struct *tsk, unsigned long *base_reg) ret_addr =ftrace_graph_ret_addr ( tsk, &graph, ret_addr,NULL ); -print_ip_sym (KERN_EMERG , ret_addr); +print_ip_sym (loglvl, ret_addr); }if (--cnt <0 )break ; base_reg = (unsigned long *)next_fp; } } -pr_emerg ("\n" ); +printk ("%s\n" , loglvl); } -void show_stack (struct task_struct *tsk,unsigned long *sp) +void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, +const char *loglvl) {unsigned long *base_reg;
@@ -151,10 +153,15 @@ void show_stack(struct task_struct *tsk, unsigned long *sp)else __asm__ __volatile__("\tori\t%0, $fp, #0\n" :"=r" (base_reg)); } -__dump (tsk, base_reg); +__dump (tsk, base_reg, loglvl);barrier (); } +void show_stack (struct task_struct *tsk,unsigned long *sp) +{ +show_stack_loglvl (tsk, sp,KERN_EMERG ); +} +DEFINE_SPINLOCK (die_lock);/*
Signature · 1 line
2.26.0
PATCH v3 23/50 nios2: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Ley Foon Tan <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/nios2/kernel/traps.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-)
arch/nios2/kernel/traps.c +15 -8
@@ -52,12 +52,14 @@ void _exception(int signo, struct pt_regs *regs, int code, unsigned long addr) }/* -* The show_stack is an external API which we do not use ourselves. +* The show_stack(), show_stack_loglvl() are external API +* which we do not use ourselves. */ int kstack_depth_to_print =48 ; -void show_stack (struct task_struct *task,unsigned long *stack) +void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +const char *loglvl) {unsigned long *endstack, addr;int i;
@@ -72,16 +74,16 @@ void show_stack(struct task_struct *task, unsigned long *stack) addr = (unsigned long ) stack; endstack = (unsigned long *)PAGE_ALIGN (addr); -pr_emerg ("Stack from %08lx:" , (unsigned long )stack); +printk ("%sStack from %08lx:" , loglvl, (unsigned long )stack);for (i =0 ; i < kstack_depth_to_print; i++) {if (stack +1 > endstack)break ;if (i %8 ==0 ) -pr_emerg ("\n " ); -pr_emerg (" %08lx" , *stack++); +printk ("%s\n " , loglvl); +printk ("%s %08lx" , loglvl, *stack++); } -pr_emerg ("\nCall Trace:" ); +printk ("%s\nCall Trace:" , loglvl); i =0 ;while (stack +1 <= endstack) { addr = *stack++;
@@ -97,11 +99,16 @@ void show_stack(struct task_struct *task, unsigned long *stack) (addr <= (unsigned long) _etext))) {if (i %4 ==0 )pr_emerg ("\n " ); -pr_emerg (" [<%08lx>]" , addr); +printk ("%s [<%08lx>]" , loglvl, addr); i++; } } -pr_emerg ("\n" ); +printk ("%s\n" , loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *stack) +{ +show_stack_loglvl (task, stack,KERN_EMERG ); }void __init trap_init (void )
Signature · 1 line
2.26.0
PATCH v3 24/50 openrisc: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Jonas Bonn <[email protected]>
Cc: Stafford Horne <[email protected]>
Cc: Stefan Kristiansson <[email protected]>
Cc: openrisc at lists.librecores.org
[1]: https://lore.kernel.org/lkml/20190528002412.1625-1-dima at arista.com/T/#u
--- arch/openrisc/kernel/traps.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
arch/openrisc/kernel/traps.c +12 -4
@@ -41,18 +41,26 @@ unsigned long __user *lwa_addr;void print_trace (void *data,unsigned long addr,int reliable) { -pr_emerg ("[<%p>] %s%pS\n" , (void *) addr, reliable ?"" :"? " , +const char *loglvl = data; + +printk ("%s[<%p>] %s%pS\n" , loglvl, (void *) addr, reliable ?"" :"? " , (void *) addr); }/* displays a short stack trace */ -void show_stack (struct task_struct *task,unsigned long *esp) +void show_stack_loglvl (struct task_struct *task,unsigned long *esp, +const char *loglvl) {if (esp ==NULL ) esp = (unsigned long *)&esp; -pr_emerg ("Call trace:\n" ); -unwind_stack (NULL , esp, print_trace); +printk ("%sCall trace:\n" , loglvl); +unwind_stack ((void *)loglvl, esp, print_trace); +} + +void show_stack (struct task_struct *task,unsigned long *esp) +{ +show_stack_loglvl (task, esp,KERN_EMERG ); }void show_registers (struct pt_regs *regs)
Signature · 1 line
2.26.0
Re: [PATCHv3 24/50] openrisc: Add show_stack_loglvl()
Quoted 2 lines · Dmitry Safonov
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with
Instead of realization I would say "Implementation".
Quoted 10 lines
lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising
console_loglevelwhile printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where theprintk()was deferred.
Quoted 6 lines
Introducing log-level parameter and
KERN_UNSUPPRESSED[1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.Introduce
show_stack_loglvl(), that eventually will substituteshow_stack().
Will you do the work to replace show_stack(), when is that planned?
Other than that small comment this looks fine.
Quoted 6 lines
Cc: Jonas Bonn <[email protected]>
Cc: Stafford Horne <[email protected]>
Cc: Stefan Kristiansson <[email protected]>
Cc: openrisc at lists.librecores.org
[1]: https://lore.kernel.org/lkml/20190528002412.1625-1-dima at arista.com/T/#uSigned-off-by Dmitry Safonov <[email protected]>
Re: [PATCHv3 24/50] openrisc: Add show_stack_loglvl()
Quoted 16 lines · Stafford Horne
Quoted 2 lines · Dmitry Safonov
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed withInstead of realization I would say "Implementation".
Quoted 10 lines
lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising
console_loglevelwhile printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where theprintk()was deferred.
Quoted 8 lines
Quoted 6 lines
Introducing log-level parameter and
KERN_UNSUPPRESSED[1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.Introduce
show_stack_loglvl(), that eventually will substituteshow_stack().Will you do the work to replace
show_stack(), when is that planned?
In the patch 50/50 from the series:
https://lore.kernel.org/lkml/20200418201944.482088-51-dima at arista.com/
Quoted 4 lines
Other than that small comment this looks fine.
Acked-by Stafford Horne <[email protected]>
Thank you,
Dmitry
PATCH v3 25/50 parisc: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Helge Deller <[email protected]>
Cc: "James E.J. Bottomley" <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/parisc/kernel/traps.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
arch/parisc/kernel/traps.c +17 -11
@@ -49,7 +49,7 @@#include "../math-emu/math-emu.h" /* for handle_fpe() */ static void parisc_show_stack (struct task_struct *task, -struct pt_regs *regs); +struct pt_regs *regs,const char *loglvl);static int printbinary (char *buf,unsigned long x,int nbits) {
@@ -155,7 +155,7 @@ void show_regs(struct pt_regs *regs)printk ("%s IAOQ[1]: %pS\n" , level, (void *) regs->iaoq[1 ]);printk ("%s RP(r2): %pS\n" , level, (void *) regs->gr[2 ]); -parisc_show_stack (current, regs); +parisc_show_stack (current, regs,KERN_DEFAULT ); } }
@@ -170,37 +170,43 @@ static DEFINE_RATELIMIT_STATE(_hppa_rs, } -static void do_show_stack (struct unwind_frame_info *info) +static void do_show_stack (struct unwind_frame_info *info,const char *loglvl) {int i =1 ; -printk (KERN_CRIT "Backtrace:\n" ); +printk ("%sBacktrace:\n" , loglvl);while (i <=MAX_UNWIND_ENTRIES ) {if (unwind_once (info) <0 || info->ip ==0 )break ;if (__kernel_text_address (info->ip)) { -printk (KERN_CRIT " [<" RFMT ">] %pS\n" , - info->ip, (void *) info->ip); +printk ("%s [<" RFMT ">] %pS\n" , + loglvl, info->ip, (void *) info->ip); i++; } } -printk (KERN_CRIT "\n" ); +printk ("%s\n" , loglvl); }static void parisc_show_stack (struct task_struct *task, -struct pt_regs *regs) +struct pt_regs *regs,const char *loglvl) {struct unwind_frame_info info;unwind_frame_init_task (&info, task, regs); -do_show_stack (&info); +do_show_stack (&info, loglvl); +} + +void show_stack_loglvl (struct task_struct *t,unsigned long *sp, +const char *loglvl) +{ +parisc_show_stack (t,NULL , loglvl); }void show_stack (struct task_struct *t,unsigned long *sp) { -parisc_show_stack (t,NULL ); + show_stack_loglvl(t, sp, KERN_CRIT) }int is_valid_bugaddr (unsigned long iaoq)
@@ -446,7 +452,7 @@ void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long o/* show_stack(NULL, (unsigned long *)regs->gr[30]); */ struct unwind_frame_info info;unwind_frame_init (&info, current, regs); -do_show_stack (&info); +do_show_stack (&info,KERN_CRIT ); }printk ("\n" );
Signature · 1 line
2.26.0
Re: [PATCHv3 25/50] parisc: Add show_stack_loglvl()
Quoted 19 lines · Dmitry Safonov
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising
console_loglevelwhile printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where theprintk()was deferred.Introducing log-level parameter and
KERN_UNSUPPRESSED[1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.Introduce
show_stack_loglvl(), that eventually will substituteshow_stack().
Quoted 8 lines
Cc: Helge Deller <[email protected]>
Cc: "James E.J. Bottomley" <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#uSigned-off-by Dmitry Safonov <[email protected]>--- arch/parisc/kernel/traps.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
Thanks!
Helge
Quoted 85 lines
arch/parisc/kernel/traps.c +17
-11@@ -49,7 +49,7 @@#include "../math-emu/math-emu.h" /* for handle_fpe() */ static void parisc_show_stack (struct task_struct *task, -struct pt_regs *regs); +struct pt_regs *regs,const char *loglvl);static int printbinary (char *buf,unsigned long x,int nbits) {@@ -155,7 +155,7 @@ void show_regs(struct pt_regs *regs)printk ("%s IAOQ[1]: %pS\n" , level, (void *) regs->iaoq[1 ]);printk ("%s RP(r2): %pS\n" , level, (void *) regs->gr[2 ]); -parisc_show_stack (current, regs); +parisc_show_stack (current, regs,KERN_DEFAULT ); } }@@ -170,37 +170,43 @@ static DEFINE_RATELIMIT_STATE(_hppa_rs, } -static void do_show_stack (struct unwind_frame_info *info) +static void do_show_stack (struct unwind_frame_info *info,const char *loglvl) {int i =1 ; -printk (KERN_CRIT "Backtrace:\n" ); +printk ("%sBacktrace:\n" , loglvl);while (i <=MAX_UNWIND_ENTRIES ) {if (unwind_once (info) <0 || info->ip ==0 )break ;if (__kernel_text_address (info->ip)) { -printk (KERN_CRIT " [<" RFMT ">] %pS\n" , - info->ip, (void *) info->ip); +printk ("%s [<" RFMT ">] %pS\n" , + loglvl, info->ip, (void *) info->ip); i++; } } -printk (KERN_CRIT "\n" ); +printk ("%s\n" , loglvl); }static void parisc_show_stack (struct task_struct *task, -struct pt_regs *regs) +struct pt_regs *regs,const char *loglvl) {struct unwind_frame_info info;unwind_frame_init_task (&info, task, regs); -do_show_stack (&info); +do_show_stack (&info, loglvl); +} + +void show_stack_loglvl (struct task_struct *t,unsigned long *sp, +const char *loglvl) +{ +parisc_show_stack (t,NULL , loglvl); }void show_stack (struct task_struct *t,unsigned long *sp) { -parisc_show_stack (t,NULL ); + show_stack_loglvl(t, sp, KERN_CRIT) }int is_valid_bugaddr (unsigned long iaoq)@@ -446,7 +452,7 @@ void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long o/* show_stack(NULL, (unsigned long *)regs->gr[30]); */ struct unwind_frame_info info;unwind_frame_init (&info, current, regs); -do_show_stack (&info); +do_show_stack (&info,KERN_CRIT ); }printk ("\n" );
PATCH v3 26/50 powerpc: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/powerpc/kernel/process.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
arch/powerpc/kernel/process.c +13 -5
@@ -2068,7 +2068,8 @@ unsigned long get_wchan(struct task_struct *p)static int kstack_depth_to_print =CONFIG_PRINT_STACK_DEPTH ; -void show_stack (struct task_struct *tsk,unsigned long *stack) +void show_stack_loglvl (struct task_struct *tsk,unsigned long *stack, +const char *loglvl) {unsigned long sp, ip, lr, newsp;int count =0 ;
@@ -2093,7 +2094,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) } lr =0 ; -printk ("Call Trace:\n" ); +printk ("%sCall Trace:\n" , loglvl); do { if (!validate_sp(sp, tsk, STACK_FRAME_OVERHEAD)) break;
@@ -2102,7 +2103,8 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) newsp = stack[0 ]; ip = stack[STACK_FRAME_LR_SAVE ];if (!firstframe || ip != lr) { -printk ("[" REG "] [" REG "] %pS" , sp, ip, (void *)ip); +printk ("%s[" REG "] [" REG "] %pS" , + loglvl, sp, ip, (void *)ip);#ifdef CONFIG_FUNCTION_GRAPH_TRACER ret_addr =ftrace_graph_ret_addr (current, &ftrace_idx, ip, stack);
@@ -2124,8 +2126,9 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)struct pt_regs *regs = (struct pt_regs *) (sp +STACK_FRAME_OVERHEAD ); lr = regs->link; -printk ("--- interrupt: %lx at %pS\n LR = %pS\n" , - regs->trap, (void *)regs->nip, (void *)lr); +printk ("%s--- interrupt: %lx at %pS\n LR = %pS\n" , + loglvl, regs->trap, + (void *)regs->nip, (void *)lr); firstframe =1 ; }
@@ -2135,6 +2138,11 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)put_task_stack (tsk); } +void show_stack (struct task_struct *tsk,unsigned long *stack) +{ +show_stack_loglvl (tsk, stack,KERN_DEFAULT ); +} +#ifdef CONFIG_PPC64 /* Called with hard IRQs off */ void notrace __ppc64_runlatch_on(void)
Signature · 1 line
2.26.0
PATCH v3 27/50 riscv: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Albert Ou <[email protected]>
Cc: Palmer Dabbelt <[email protected]>
Cc: Paul Walmsley <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/riscv/kernel/stacktrace.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
arch/riscv/kernel/stacktrace.c +10 -3
@@ -99,16 +99,23 @@ static void notrace walk_stackframe(struct task_struct *task,static bool print_trace_address (unsigned long pc,void *arg) { -print_ip_sym (KERN_DEFAULT , pc); +const char *loglvl = arg; + +print_ip_sym (loglvl, pc);return false; } -void show_stack (struct task_struct *task,unsigned long *sp) +void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl) {pr_cont ("Call Trace:\n" ); -walk_stackframe (task,NULL , print_trace_address,NULL ); +walk_stackframe (task,NULL , print_trace_address, (void *)loglvl); } +void show_stack (struct task_struct *task,unsigned long *sp) +{ +show_stack_loglvl (task, sp,KERN_DEFAULT ); +}static bool save_wchan (unsigned long pc,void *arg) {
Signature · 1 line
2.26.0
PATCH v3 28/50 s390: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Christian Borntraeger <[email protected]>
Cc: Heiko Carstens <[email protected]>
Cc: Vasily Gorbik <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/s390/kernel/dumpstack.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
arch/s390/kernel/dumpstack.c +11 -5
@@ -126,18 +126,24 @@ int get_stack_info(unsigned long sp, struct task_struct *task,return -EINVAL ; } -void show_stack (struct task_struct *task,unsigned long *stack) +void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +const char *loglvl) {struct unwind_state state; -printk ("Call Trace:\n" ); +printk ("%sCall Trace:\n" , loglvl);unwind_for_each_frame (&state, task,NULL , (unsigned long ) stack) -printk (state.reliable ?" [<%016lx>] %pSR \n" : -"([<%016lx>] %pSR)\n" , - state.ip, (void *) state.ip); +printk (state.reliable ?"%s [<%016lx>] %pSR \n" : +"%s([<%016lx>] %pSR)\n" , + loglvl, state.ip, (void *) state.ip);debug_show_held_locks (task ? : current); } +void show_stack (struct task_struct *task,unsigned long *stack) +{ +show_stack_loglvl (task, stack,KERN_DEFAULT ); +} +static void show_last_breaking_event (struct pt_regs *regs) {printk ("Last Breaking-Event-Address:\n" );
Signature · 1 line
2.26.0
PATCH v3 29/50 sh: Add loglvl to dump_mem()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to dump_mem() as a preparation to introduce show_stack_loglvl().
Cc: Rich Felker <[email protected]>
Cc: Yoshinori Sato <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/sh/include/asm/kdebug.h | 3 ++- arch/sh/kernel/dumpstack.c | 17 +++++++++-------- arch/sh/kernel/traps.c | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-)
arch/sh/include/asm/kdebug.h +2 -1
@@ -13,6 +13,7 @@ enum die_val {/* arch/sh/kernel/dumpstack.c */ extern void printk_address (unsigned long address,int reliable); -extern void dump_mem (const char *str,unsigned long bottom,unsigned long top); +extern void dump_mem (const char *str,const char *loglvl, +unsigned long bottom,unsigned long top);#endif /* __ASM_SH_KDEBUG_H */
arch/sh/kernel/dumpstack.c +9 -8
@@ -16,30 +16,31 @@#include <asm/unwinder.h> #include <asm/stacktrace.h> -void dump_mem (const char *str,unsigned long bottom,unsigned long top) +void dump_mem (const char *str,const char *loglvl, +unsigned long bottom,unsigned long top) {unsigned long p;int i; -printk ("%s(0x%08lx to 0x%08lx)\n" , str, bottom, top); +printk ("%s%s(0x%08lx to 0x%08lx)\n" , loglvl, str, bottom, top);for (p = bottom & ~31 ; p < top; ) { -printk ("%04lx: " , p &0xffff ); +printk ("%s%04lx: " , loglvl, p &0xffff );for (i =0 ; i <8 ; i++, p +=4 ) {unsigned int val;if (p < bottom || p >= top) -printk (" " ); +printk ("%s " , loglvl);else {if (__get_user (val, (unsigned int __user *)p)) { -printk ("\n" ); +printk ("%s\n" , loglvl);return ; } -printk ("%08x " , val); +printk ("%s%08x " , loglvl, val); } } -printk ("\n" ); +printk ("%s\n" , loglvl); } }
@@ -156,7 +157,7 @@ void show_stack(struct task_struct *tsk, unsigned long *sp) sp = (unsigned long *)tsk->thread.sp; stack = (unsigned long )sp; -dump_mem ("Stack: " , stack,THREAD_SIZE + +dump_mem ("Stack: " ,KERN_DEFAULT , stack,THREAD_SIZE + (unsigned long )task_stack_page (tsk));show_trace (tsk, sp,NULL ); }
arch/sh/kernel/traps.c +2 -2
@@ -38,8 +38,8 @@ void die(const char *str, struct pt_regs *regs, long err) task_pid_nr(current), task_stack_page(current) + 1);if (!user_mode (regs) ||in_interrupt ()) -dump_mem ("Stack: " , regs->regs[15 ],THREAD_SIZE + - (unsigned long )task_stack_page (current)); +dump_mem ("Stack: " ,KERN_DEFAULT , regs->regs[15 ], +THREAD_SIZE + (unsigned long )task_stack_page (current));notify_die (DIE_OOPS , str, regs, err,255 ,SIGSEGV );
Signature · 1 line
2.26.0
PATCH v3 30/50 sh: Remove needless printk()
In reply to Dmitry SafonovCurrently `data' is always an empty line "".
No need for additional printk() call.
--- arch/sh/kernel/dumpstack.c | 1 - 1 file changed, 1 deletion(-)
arch/sh/kernel/dumpstack.c +0 -1
@@ -118,7 +118,6 @@ static int print_trace_stack(void *data, char *name)*/ static void print_trace_address (void *data,unsigned long addr,int reliable) { -printk ("%s" , (char *)data);printk_address (addr, reliable); }
Signature · 1 line
2.26.0
PATCH v3 31/50 sh: Add loglvl to printk_address()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to printk_address() as a preparation to introduce show_stack_loglvl().
As a good side-effect show_fault_oops() now prints the address with KERN_EMREG as the rest of output, making sure there won't be situation where "PC: " is printed without actual address.
Cc: Rich Felker <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/sh/include/asm/kdebug.h | 3 ++- arch/sh/kernel/dumpstack.c | 6 +++--- arch/sh/mm/fault.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-)
arch/sh/include/asm/kdebug.h +2 -1
@@ -12,7 +12,8 @@ enum die_val { };/* arch/sh/kernel/dumpstack.c */ -extern void printk_address (unsigned long address,int reliable); +extern void printk_address (unsigned long address,int reliable, +const char *loglvl);extern void dump_mem (const char *str,const char *loglvl,unsigned long bottom,unsigned long top);
arch/sh/kernel/dumpstack.c +3 -3
@@ -44,9 +44,9 @@ void dump_mem(const char *str, const char *loglvl, } } -void printk_address (unsigned long address,int reliable) +void printk_address (unsigned long address,int reliable,const char *loglvl) { -printk (" [<%p>] %s%pS\n" , (void *) address, +printk ("%s [<%p>] %s%pS\n" , loglvl, (void *) address, reliable ?"" :"? " , (void *) address); }
@@ -118,7 +118,7 @@ static int print_trace_stack(void *data, char *name)*/ static void print_trace_address (void *data,unsigned long addr,int reliable) { -printk_address (addr, reliable); +printk_address (addr, reliable, (char *)data); }static const struct stacktrace_ops print_trace_ops = {
arch/sh/mm/fault.c +1 -1
@@ -196,7 +196,7 @@ show_fault_oops(struct pt_regs *regs, unsigned long address)printk (KERN_CONT " at %08lx\n" , address);printk (KERN_ALERT "PC:" ); -printk_address (regs->pc,1 ); +printk_address (regs->pc,1 ,KERN_ALERT );show_pte (NULL , address); }
Signature · 1 line
2.26.0
Andrew Morton
maintainerRe: [PATCHv3 31/50] sh: Add loglvl to printk_address()
Quoted 40 lines · On Sat, 18 Apr 2020 21:19:25 +0100 Dmitry Safonov <[email protected]> wrote:
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising
console_loglevelwhile printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where theprintk()was deferred.Introducing log-level parameter and
KERN_UNSUPPRESSED[1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.Add log level argument to
printk_address()as a preparation to introduceshow_stack_loglvl().As a good side-effect
show_fault_oops()now prints the address withKERN_EMREGas the rest of output, making sure there won't be situation where "PC: " is printed without actual address.arch/sh/include/asm/kdebug.h +2
-1@@ -12,7 +12,8 @@ enum die_val { };/* arch/sh/kernel/dumpstack.c */ -extern void printk_address (unsigned long address,int reliable); +extern void printk_address (unsigned long address,int reliable, +const char *loglvl);extern void dump_mem (const char *str,const char *loglvl,unsigned long bottom,unsigned long top);
arch/sh/mm/fault.c show_fault_oops(struct pt_regs *regs, unsigned long address) · line 200
Quoted 6 lines
arch/sh/mm/fault.c +1
-1@@ -196,7 +196,7 @@ show_fault_oops(struct pt_regs *regs, unsigned long address)printk (KERN_CONT " at %08lx\n" , address);printk (KERN_ALERT "PC:" ); -printk_address (regs->pc,1 ); +printk_address (regs->pc,1 ,KERN_ALERT );
It would be more intuitive to do
printk_address(KERN_ALERT, regs->pc, 1);
because the loglevel always comes first.
I guess it doesn't matter much, as sh seems to be rather dead.
Re: [PATCHv3 31/50] sh: Add loglvl to printk_address()
Quoted 1 line · Andrew Morton
I guess it doesn't matter much, as sh seems to be rather dead.
The j-core guys are using it.
Rob
Rich Felker
maintainerRe: [PATCHv3 31/50] sh: Add loglvl to printk_address()
Quoted 4 lines · Rob Landley
Quoted 1 line · Andrew Morton
I guess it doesn't matter much, as sh seems to be rather dead.
The j-core guys are using it.
Yes. There are also Debian/SH folks using classic SH4.
Rich
PATCH v3 32/50 sh: Add loglvl to show_trace()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level parameter to show_trace() as a preparation to introduce show_stack_loglvl().
Cc: Rich Felker <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/sh/include/asm/processor_32.h | 2 +- arch/sh/kernel/dumpstack.c | 10 +++++----- arch/sh/kernel/process_32.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-)
arch/sh/include/asm/processor_32.h +1 -1
@@ -171,7 +171,7 @@ static __inline__ void enable_fpu(void)#define thread_saved_pc (tsk) (tsk->thread.pc)void show_trace (struct task_struct *tsk,unsigned long *sp, -struct pt_regs *regs); +struct pt_regs *regs,const char *loglvl);#ifdef CONFIG_DUMP_CODE void show_code (struct pt_regs *regs);
arch/sh/kernel/dumpstack.c +5 -5
@@ -127,16 +127,16 @@ static const struct stacktrace_ops print_trace_ops = { };void show_trace (struct task_struct *tsk,unsigned long *sp, -struct pt_regs *regs) +struct pt_regs *regs,const char *loglvl) {if (regs &&user_mode (regs))return ; -printk ("\nCall trace:\n" ); +printk ("%s\nCall trace:\n" , loglvl); -unwind_stack (tsk, regs, sp, &print_trace_ops,"" ); +unwind_stack (tsk, regs, sp, &print_trace_ops, (void *)loglvl); -printk ("\n" ); +printk ("%s\n" , loglvl);if (!tsk) tsk = current;
@@ -158,5 +158,5 @@ void show_stack(struct task_struct *tsk, unsigned long *sp) stack = (unsigned long )sp;dump_mem ("Stack: " ,KERN_DEFAULT , stack,THREAD_SIZE + (unsigned long )task_stack_page (tsk)); -show_trace (tsk, sp,NULL ); +show_trace (tsk, sp,NULL ,KERN_DEFAULT ); }
arch/sh/kernel/process_32.c +1 -1
@@ -59,7 +59,7 @@ void show_regs(struct pt_regs * regs)printk ("MACH: %08lx MACL: %08lx GBR : %08lx PR : %08lx\n" , regs->mach, regs->macl, regs->gbr, regs->pr); -show_trace (NULL , (unsigned long *)regs->regs[15 ], regs); +show_trace (NULL , (unsigned long *)regs->regs[15 ], regs,KERN_DEFAULT );show_code (regs); }
Signature · 1 line
2.26.0
PATCH v3 33/50 sh: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Rich Felker <[email protected]>
Cc: Yoshinori Sato <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/sh/kernel/dumpstack.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
arch/sh/kernel/dumpstack.c +9 -3
@@ -144,7 +144,8 @@ void show_trace(struct task_struct *tsk, unsigned long *sp,debug_show_held_locks (tsk); } -void show_stack (struct task_struct *tsk,unsigned long *sp) +void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, +const char *loglvl) {unsigned long stack;
@@ -156,7 +157,12 @@ void show_stack(struct task_struct *tsk, unsigned long *sp) sp = (unsigned long *)tsk->thread.sp; stack = (unsigned long )sp; -dump_mem ("Stack: " ,KERN_DEFAULT , stack,THREAD_SIZE + +dump_mem ("Stack: " , loglvl, stack,THREAD_SIZE + (unsigned long )task_stack_page (tsk)); -show_trace (tsk, sp,NULL ,KERN_DEFAULT ); +show_trace (tsk, sp,NULL , loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *sp) +{ +show_stack_loglvl (task, sp,KERN_DEFAULT ); }
Signature · 1 line
2.26.0
PATCH v3 34/50 sparc: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: "David S. Miller" <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/sparc/kernel/process_32.c | 17 ++++++++++++----- arch/sparc/kernel/traps_64.c | 15 +++++++++++---- 2 files changed, 23 insertions(+), 9 deletions(-)
arch/sparc/kernel/process_32.c +12 -5
@@ -145,10 +145,12 @@ void show_regs(struct pt_regs *r) }/* -* The show_stack is an external API which we do not use ourselves. +* The show_stack(), show_stack_loglvl() are external APIs which +* we do not use ourselves. * The oops is printed in die_if_kernel. */ -void show_stack (struct task_struct *tsk,unsigned long *_ksp) +void show_stack_loglvl (struct task_struct *tsk,unsigned long *_ksp, +const char *loglvl) {unsigned long pc, fp;unsigned long task_base;
@@ -170,11 +172,16 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)break ; rw = (struct reg_window32 *) fp; pc = rw->ins[7 ]; -printk ("[%08lx : " , pc); -printk ("%pS ] " , (void *) pc); +printk ("%s[%08lx : " , loglvl, pc); +printk ("%s%pS ] " , loglvl, (void *) pc); fp = rw->ins[6 ]; }while (++count <16 ); -printk ("\n" ); +printk ("%s\n" , loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *sp) +{ +show_stack_loglvl (task, sp,KERN_DEFAULT ); }/*
arch/sparc/kernel/traps_64.c +11 -4
@@ -18,6 +18,7 @@#include <linux/smp.h> #include <linux/mm.h> #include <linux/init.h> +#include <linux/kallsyms.h> #include <linux/kdebug.h> #include <linux/ftrace.h> #include <linux/reboot.h>
@@ -2452,7 +2453,8 @@ static void user_instruction_dump(unsigned int __user *pc)printk ("\n" ); } -void show_stack (struct task_struct *tsk,unsigned long *_ksp) +void show_stack_loglvl (struct task_struct *tsk,unsigned long *_ksp, +const char *loglvl) {unsigned long fp, ksp;struct thread_info *tp;
@@ -2476,7 +2478,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) fp = ksp +STACK_BIAS ; -printk ("Call Trace:\n" ); +printk ("%sCall Trace:\n" , loglvl); do { struct sparc_stackf *sf; struct pt_regs *regs;
@@ -2497,14 +2499,14 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) fp = (unsigned long )sf->fp +STACK_BIAS ; } -printk (" [%016lx] %pS\n" , pc, (void *) pc); +print_ip_sym (loglvl, pc);#ifdef CONFIG_FUNCTION_GRAPH_TRACER if ((pc +8UL ) = (unsigned long ) &return_to_handler) {struct ftrace_ret_stack *ret_stack; ret_stack =ftrace_graph_get_ret_stack (tsk, graph);if (ret_stack) { pc = ret_stack->ret; -printk (" [%016lx] %pS\n" , pc, (void *) pc); +print_ip_sym (loglvl, pc); graph++; } }
@@ -2512,6 +2514,11 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) }while (++count <16 ); } +void show_stack (struct task_struct *tsk,unsigned long *_ksp) +{ +show_stack_loglvl (task, sp,KERN_DEFAULT ); +} +static inline struct reg_window *kernel_stack_up (struct reg_window *rw) {unsigned long fp = rw->ins[6 ];
Signature · 1 line
2.26.0
PATCH v3 35/50 um/sysrq: Remove needless variable sp
In reply to Dmitry Safonov`sp' is a needless excercise here.
--- arch/um/kernel/sysrq.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
arch/um/kernel/sysrq.c +1 -3
@@ -27,7 +27,6 @@ static const struct stacktrace_ops stackops = {void show_stack (struct task_struct *task,unsigned long *stack) { -unsigned long *sp = stack;struct pt_regs *segv_regs = current->thread.segv_regs;int i;
@@ -38,10 +37,9 @@ void show_stack(struct task_struct *task, unsigned long *stack) }if (!stack) - sp =get_stack_pointer (task, segv_regs); + stack =get_stack_pointer (task, segv_regs);pr_info ("Stack:\n" ); - stack = sp;for (i =0 ; i <3 *STACKSLOTS_PER_LINE ; i++) {if (kstack_end (stack))break ;
Signature · 1 line
2.26.0
PATCH v3 36/50 um: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Anton Ivanov <[email protected]>
Cc: Jeff Dike <[email protected]>
Cc: Richard Weinberger <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/um/kernel/sysrq.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)
arch/um/kernel/sysrq.c +16 -8
@@ -17,7 +17,9 @@static void _print_addr (void *data,unsigned long address,int reliable) { -pr_info (" [<%08lx>] %s%pS\n" , address, reliable ?"" :"? " , +const char *loglvl = data; + +printk ("%s [<%08lx>] %s%pS\n" , loglvl, address, reliable ?"" :"? " , (void *)address); }
@@ -25,7 +27,8 @@ static const struct stacktrace_ops stackops = { .address = _print_addr }; -void show_stack (struct task_struct *task,unsigned long *stack) +void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +const char *loglvl) {struct pt_regs *segv_regs = current->thread.segv_regs;int i;
@@ -39,17 +42,22 @@ void show_stack(struct task_struct *task, unsigned long *stack)if (!stack) stack =get_stack_pointer (task, segv_regs); -pr_info ("Stack:\n" ); +printk ("%sStack:\n" , loglvl);for (i =0 ; i <3 *STACKSLOTS_PER_LINE ; i++) {if (kstack_end (stack))break ;if (i && ((i %STACKSLOTS_PER_LINE ) ==0 )) -pr_cont ("\n" ); +printk ("%s\n" , loglvl);pr_cont (" %08lx" , *stack++); } -pr_cont ("\n" ); +printk ("%s\n" , loglvl); + +printk ("%sCall Trace:\n" , loglvl); +dump_trace (current, &stackops, (void *)loglvl); +printk ("%s\n" , loglvl); +} -pr_info ("Call Trace:\n" ); -dump_trace (current, &stackops,NULL ); -pr_info ("\n" ); +void show_stack (struct task_struct *task,unsigned long *stack) +{ +show_stack_loglvl (task, stack,KERN_INFO ); }
Signature · 1 line
2.26.0
PATCH v3 37/50 unicore32: Remove unused pmode argument in c_backtrace()
In reply to Dmitry SafonovThe pmode parameter isn't used in assembly - remove it. Second argument will be reused for printk() log level.
--- arch/unicore32/kernel/setup.h | 2 +- arch/unicore32/kernel/traps.c | 14 +++++--------- 2 files changed, 6 insertions(+), 10 deletions(-)
arch/unicore32/kernel/setup.h +1 -1
@@ -29,7 +29,7 @@ extern void kernel_thread_helper(void);extern void __init early_signal_init (void ); extern asmlinkage void __backtrace(void); -extern asmlinkage void c_backtrace(unsigned long fp, int pmode); +extern asmlinkage void c_backtrace(unsigned long fp);extern void __show_regs (struct pt_regs *);
arch/unicore32/kernel/traps.c +5 -9
@@ -137,7 +137,7 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)static void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk) { -unsigned int fp, mode; +unsigned int fp;int ok =1 ;printk (KERN_DEFAULT "Backtrace: " );
@@ -145,16 +145,12 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)if (!tsk) tsk = current; -if (regs) { +if (regs) fp = regs->UCreg_fp; - mode =processor_mode (regs); - }else if (tsk != current) { +else if (tsk != current) fp =thread_saved_fp (tsk); - mode =0x10 ; - }else { +else asm("mov %0, fp" :"=r" (fp) : :"cc" ); - mode =0x10 ; - }if (!fp) {printk ("no frame pointer" );
@@ -167,7 +163,7 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)printk ("\n" );if (ok) -c_backtrace (fp, mode); +c_backtrace (fp); }void show_stack (struct task_struct *tsk,unsigned long *sp)
Signature · 1 line
2.26.0
PATCH v3 38/50 unicore32: Add loglvl to c_backtrace()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level parameter to c_backtrace() as a preparation for introducing show_stack_loglvl()
Cc: Guan Xuetao <[email protected]>
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/unicore32/kernel/setup.h | 2 +- arch/unicore32/kernel/traps.c | 2 +- arch/unicore32/lib/backtrace.S | 24 ++++++++++++++++-------- 3 files changed, 18 insertions(+), 10 deletions(-)
arch/unicore32/kernel/setup.h +1 -1
@@ -29,7 +29,7 @@ extern void kernel_thread_helper(void);extern void __init early_signal_init (void ); extern asmlinkage void __backtrace(void); -extern asmlinkage void c_backtrace(unsigned long fp); +extern asmlinkage void c_backtrace(unsigned long fp, const char *loglvl);extern void __show_regs (struct pt_regs *);
arch/unicore32/kernel/traps.c +1 -1
@@ -163,7 +163,7 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)printk ("\n" );if (ok) -c_backtrace (fp); +c_backtrace (fp,KERN_DEFAULT ); }void show_stack (struct task_struct *tsk,unsigned long *sp)
arch/unicore32/lib/backtrace.S +16 -8
@@ -16,6 +16,7 @@ #define sv_fp v5 #define sv_pc v6 #define offset v8 +#define loglvl v9 ENTRY(__backtrace) mov r0, fp
@@ -27,10 +28,11 @@ ENTRY(c_backtrace) ENDPROC(__backtrace) ENDPROC(c_backtrace) #else - stm.w (v4 - v8, lr), [sp-] @ Save an extra register + stm.w (v4 - v10, lr), [sp-] @ Save an extra register @ so we have a location... mov.a frame, r0 @ if frame pointer is zero beq no_frame @ we have no stack frames + mov loglvl, r1 1: stm.w (pc), [sp-] @ calculate offset of PC stored ldw.w r0, [sp]+, #4 @ by stmfd for this CPU
@@ -95,9 +97,10 @@ for_each_frame: bua for_each_frame 1006: adr r0, .Lbad - mov r1, frame + mov r1, loglvl + mov r2, frame b.l printk -no_frame: ldm.w (v4 - v8, pc), [sp]+ +no_frame: ldm.w (v4 - v10, pc), [sp]+ ENDPROC(__backtrace) ENDPROC(c_backtrace)
@@ -128,8 +131,11 @@ ENDPROC(c_backtrace) add v7, v7, #1 cxor.a v7, #6 cmoveq v7, #1 - cmoveq r1, #'\n' - cmovne r1, #' ' + bne 201f + adr r0, .Lcr + mov r1, loglvl + b.l printk +201: ldw.w r3, [stack]+, #-4 mov r2, reg csub.a r2, #8
@@ -141,18 +147,20 @@ ENDPROC(c_backtrace) add r2, r2, #0x10 @ so r2 need add 16 201: adr r0, .Lfp + mov r1, loglvl b.l printk 2: sub.a reg, reg, #1 bns 1b cxor.a v7, #0 beq 201f adr r0, .Lcr + mov r1, loglvl b.l printk 201: ldm.w (instr, reg, stack, v7, pc), [sp]+ -.Lfp: .asciz "%cr%d:%08x" -.Lcr: .asciz "\n" -.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n" +.Lfp: .asciz "%sr%d:%08x " +.Lcr: .asciz "%s\n" +.Lbad: .asciz "%sBacktrace aborted due to bad frame pointer <%p>\n" .align .Ldsi: .word 0x92eec000 >> 14 @ stm.w sp, (... fp, ip, lr, pc) .word 0x92e10000 >> 14 @ stm.w sp, ()
Signature · 1 line
2.26.0
PATCH v3 39/50 unicore32: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
As a nice side-effect - print backtrace in __die() with the same log level as the rest of function.
Cc: Guan Xuetao <[email protected]>
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/unicore32/kernel/traps.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-)
arch/unicore32/kernel/traps.c +17 -10
@@ -135,12 +135,13 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)set_fs (fs); } -static void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk) +static void dump_backtrace (struct pt_regs *regs,struct task_struct *tsk, +const char *loglvl) {unsigned int fp;int ok =1 ; -printk (KERN_DEFAULT "Backtrace: " ); +printk ("%sBacktrace: " , loglvl);if (!tsk) tsk = current;
@@ -153,25 +154,31 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) asm("mov %0, fp" :"=r" (fp) : :"cc" );if (!fp) { -printk ("no frame pointer" ); +printk ("%sno frame pointer" , loglvl); ok =0 ; }else if (verify_stack (fp)) { -printk ("invalid frame pointer 0x%08x" , fp); +printk ("%sinvalid frame pointer 0x%08x" , loglvl, fp); ok =0 ; }else if (fp < (unsigned long )end_of_stack (tsk)) -printk ("frame pointer underflow" ); -printk ("\n" ); +printk ("%sframe pointer underflow" , loglvl); +printk ("%s\n" , loglvl);if (ok) -c_backtrace (fp,KERN_DEFAULT ); +c_backtrace (fp, loglvl); } -void show_stack (struct task_struct *tsk,unsigned long *sp) +void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, +const char *loglvl) { -dump_backtrace (NULL , tsk); +dump_backtrace (NULL , tsk, loglvl);barrier (); } +void show_stack (struct task_struct *tsk,unsigned long *sp) +{ + show_stack_loglvl(tsk, sp, KERN_DEFAULT) +} +static int __die (const char *str,int err,struct thread_info *thread,struct pt_regs *regs) {
@@ -196,7 +203,7 @@ static int __die(const char *str, int err, struct thread_info *thread,if (!user_mode (regs) ||in_interrupt ()) {dump_mem (KERN_EMERG ,"Stack: " , regs->UCreg_sp,THREAD_SIZE + (unsigned long )task_stack_page (tsk)); -dump_backtrace (regs, tsk); +dump_backtrace (regs, tsk,KERN_EMERG );dump_instr (KERN_EMERG , regs); }
Signature · 1 line
2.26.0
PATCH v3 40/50 x86: Add missing const qualifiers for log_lvl
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Keep log_lvl const show_trace_log_lvl() and printk_stack_address() as the new generic show_stack_loglvl() wants to have a proper const qualifier.
And gcc rightfully produces warnings in case it's not keept:arch/x86/kernel/dumpstack.c: In function ‘show_stack’:arch/x86/kernel/dumpstack.c:294:37: warning: passing argument 4 of ‘show_trace_log_lv ’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
294 | show_trace_log_lvl(task, NULL, sp, loglvl);
| ^~~~~~arch/x86/kernel/dumpstack.c:163:32: note: expected ‘char *’ but argument is of type ‘const char *’
163 | unsigned long *stack, char *log_lvl)
| ~~~~~~^~~~~~~
Cc: Borislav Petkov <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/x86/include/asm/stacktrace.h | 2 +- arch/x86/kernel/dumpstack.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/x86/include/asm/stacktrace.h +1 -1
@@ -87,7 +87,7 @@ get_stack_pointer(struct task_struct *task, struct pt_regs *regs) }void show_trace_log_lvl (struct task_struct *task,struct pt_regs *regs, -unsigned long *stack,char *log_lvl); +unsigned long *stack,const char *log_lvl);/* The form of the top of the frame on the stack */ struct stack_frame {
arch/x86/kernel/dumpstack.c +2 -2
@@ -65,7 +65,7 @@ bool in_entry_stack(unsigned long *stack, struct stack_info *info) }static void printk_stack_address (unsigned long address,int reliable, -char *log_lvl) +const char *log_lvl) {touch_nmi_watchdog ();printk ("%s %s%pB\n" , log_lvl, reliable ?"" :"? " , (void *)address);
@@ -160,7 +160,7 @@ static void show_regs_if_on_stack(struct stack_info *info, struct pt_regs *regs, }void show_trace_log_lvl (struct task_struct *task,struct pt_regs *regs, -unsigned long *stack,char *log_lvl) +unsigned long *stack,const char *log_lvl) {struct unwind_state state;struct stack_info stack_info = {0 };
Signature · 1 line
2.26.0
PATCH v3 41/50 x86: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Borislav Petkov <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/x86/kernel/dumpstack.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/x86/kernel/dumpstack.c +8 -2
@@ -279,7 +279,8 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, } } -void show_stack (struct task_struct *task,unsigned long *sp) +void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl) { task = task ? : current;
@@ -290,7 +291,12 @@ void show_stack(struct task_struct *task, unsigned long *sp)if (!sp && task == current) sp =get_stack_pointer (current,NULL ); -show_trace_log_lvl (task,NULL , sp,KERN_DEFAULT ); +show_trace_log_lvl (task,NULL , sp, loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *sp) +{ +show_stack_loglvl (task, sp,KERN_DEFAULT ); }void show_stack_regs (struct pt_regs *regs)
Signature · 1 line
2.26.0
PATCH v3 42/50 xtensa: Add loglvl to show_trace()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Add log level argument to show_trace() as a preparation for introducing show_stack_loglvl().
Cc: Chris Zankel <[email protected]>
Cc: Max Filippov <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/xtensa/kernel/traps.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
arch/xtensa/kernel/traps.c +9 -5
@@ -479,18 +479,22 @@ void show_regs(struct pt_regs * regs)static int show_trace_cb (struct stackframe *frame,void *data) { +const char *loglvl = data; +if (kernel_text_address (frame->pc)) -pr_cont (" [<%08lx>] %pB\n" , frame->pc, (void *)frame->pc); +printk ("%s [<%08lx>] %pB\n" , + loglvl, frame->pc, (void *)frame->pc);return 0 ; } -void show_trace (struct task_struct *task,unsigned long *sp) +static void show_trace (struct task_struct *task,unsigned long *sp, +const char *loglvl) {if (!sp) sp =stack_pointer (task); -pr_info ("Call Trace:\n" ); -walk_stackframe (sp, show_trace_cb,NULL ); +printk ("%sCall Trace:\n" , loglvl); +walk_stackframe (sp, show_trace_cb, (void *)loglvl); }#define STACK_DUMP_ENTRY_SIZE 4
@@ -511,7 +515,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)print_hex_dump (KERN_INFO ," " ,DUMP_PREFIX_NONE ,STACK_DUMP_LINE_SIZE ,STACK_DUMP_ENTRY_SIZE , sp, len, false); -show_trace (task, sp); +show_trace (task, stack,KERN_INFO ); }DEFINE_SPINLOCK (die_lock);
Signature · 1 line
2.26.0
Re: [PATCHv3 42/50] xtensa: Add loglvl to show_trace()
Hi,
Quoted 47 lines · Dmitry Safonov
Currently, the log-level of
show_stack()depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising
console_loglevelwhile printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where theprintk()was deferred.Introducing log-level parameter and
KERN_UNSUPPRESSED[1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.Add log level argument to
show_trace()as a preparation for introducingshow_stack_loglvl().Cc: Chris Zankel <[email protected]>
Cc: Max Filippov <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#uSigned-off-by Dmitry Safonov <[email protected]>--- arch/xtensa/kernel/traps.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)arch/xtensa/kernel/traps.c +4
-3-void show_trace (struct task_struct *task,unsigned long *sp) +static void show_trace (struct task_struct *task,unsigned long *sp, +const char *loglvl) {if (!sp) sp =stack_pointer (task); -pr_info ("Call Trace:\n" ); -walk_stackframe (sp, show_trace_cb,NULL ); +printk ("%sCall Trace:\n" , loglvl); +walk_stackframe (sp, show_trace_cb, (void *)loglvl); }#define STACK_DUMP_ENTRY_SIZE 4
arch/xtensa/kernel/traps.c void show_stack(struct task_struct *task, unsigned long *sp) · line 518
Quoted 5 lines
arch/xtensa/kernel/traps.c +1
-1@@ -511,7 +515,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)print_hex_dump (KERN_INFO ," " ,DUMP_PREFIX_NONE ,STACK_DUMP_LINE_SIZE ,STACK_DUMP_ENTRY_SIZE , sp, len, false); -show_trace (task, sp); +show_trace (task, stack,KERN_INFO );
it should have been
show_trace(task, sp, KERN_INFO);
Andrew, can you fold the following patch as a fixup please:
arch/xtensa/kernel/traps.c +1 -1
@@ -515,7 +515,7 @@ void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl)print_hex_dump (loglvl," " ,DUMP_PREFIX_NONE ,STACK_DUMP_LINE_SIZE ,STACK_DUMP_ENTRY_SIZE , sp, len, false); -show_trace (task, stack, loglvl); +show_trace (task, sp, loglvl); }DEFINE_SPINLOCK (die_lock);
Signature · 5 lines
2.26.1 -- 2.26.1
Quoted 6 lines
arch/xtensa/kernel/traps.c +0
-0}DEFINE_SPINLOCK (die_lock);Signature · 1 line
2.26.0
Signature · 2 lines
Sincerely yours, Mike.
Re: [PATCHv3 42/50] xtensa: Add loglvl to show_trace()
Hi Mike,
On 5/11/20 8:45 PM, Mike Rapoport wrote:
[..]
Quoted 10 lines
Review void show_stack(struct task_struct *task, unsigned long *sp) · line 518
Quoted 6 lines
(quoted diff) +1
-1@@ -511,7 +515,7 @@ void show_stack(struct task_struct *task, unsigned long *sp) print_hex_dump(KERN_INFO, " ", DUMP_PREFIX_NONE, STACK_DUMP_LINE_SIZE, STACK_DUMP_ENTRY_SIZE, sp, len, false); - show_trace(task, sp); + show_trace(task, stack, KERN_INFO);it should have been
show_trace(task, sp, KERN_INFO);
Thank you for noticing it!
Quoted 10 lines
Andrew, can you fold the following patch as a fixup please:
arch/xtensa/kernel/traps.c +0
-0
arch/xtensa/kernel/traps.c void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl) · line 521
Quoted 8 lines
arch/xtensa/kernel/traps.c +1
-1@@ -515,7 +515,7 @@ void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl)print_hex_dump (loglvl," " ,DUMP_PREFIX_NONE ,STACK_DUMP_LINE_SIZE ,STACK_DUMP_ENTRY_SIZE , sp, len, false); -show_trace (task, stack, loglvl); +show_trace (task, sp, loglvl); }DEFINE_SPINLOCK (die_lock);
Thanks,
Dmitry
PATCH v3 43/50 xtensa: Add show_stack_loglvl()
In reply to Dmitry SafonovCurrently, the log-level of show_stack() depends on a platform realization. It creates situations where the headers are printed with lower log level or higher than the stacktrace (depending on a platform or user).
Furthermore, it forces the logic decision from user to an architecture side. In result, some users as sysrq/kdb/etc are doing tricks with temporary rising console_loglevel while printing their messages. And in result it not only may print unwanted messages from other CPUs, but also omit printing at all in the unlucky case where the printk() was deferred.
Introducing log-level parameter and KERN_UNSUPPRESSED [1] seems an easier approach than introducing more printk buffers. Also, it will consolidate printings with headers.
Introduce show_stack_loglvl(), that eventually will substitute show_stack().
Cc: Chris Zankel <[email protected]>
Cc: Max Filippov <[email protected]>
Cc: [email protected]
[1]: https://lore.kernel.org/lkml/[email protected]/T/#u
--- arch/xtensa/kernel/traps.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
arch/xtensa/kernel/traps.c +10 -4
@@ -501,7 +501,8 @@ static void show_trace(struct task_struct *task, unsigned long *sp,#define STACK_DUMP_LINE_SIZE 32static size_t kstack_depth_to_print =CONFIG_PRINT_STACK_DEPTH ; -void show_stack (struct task_struct *task,unsigned long *sp) +void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl) {size_t len;
@@ -511,11 +512,16 @@ void show_stack(struct task_struct *task, unsigned long *sp) len =min ((-(size_t )sp) & (THREAD_SIZE -STACK_DUMP_ENTRY_SIZE ), kstack_depth_to_print *STACK_DUMP_ENTRY_SIZE ); -pr_info ("Stack:\n" ); -print_hex_dump (KERN_INFO ," " ,DUMP_PREFIX_NONE , +printk ("%sStack:\n" , loglvl); +print_hex_dump (loglvl," " ,DUMP_PREFIX_NONE ,STACK_DUMP_LINE_SIZE ,STACK_DUMP_ENTRY_SIZE , sp, len, false); -show_trace (task, stack,KERN_INFO ); +show_trace (task, stack, loglvl); +} + +void show_stack (struct task_struct *task,unsigned long *sp) +{ +show_stack_loglvl (task, sp,KERN_INFO ); }DEFINE_SPINLOCK (die_lock);
Signature · 1 line
2.26.0
PATCH v3 44/50 sysrq: Use show_stack_loglvl()
In reply to Dmitry SafonovShow the stack trace on a CPU with the same log level as "CPU%d" header.
--- drivers/tty/sysrq.c | 2 +- include/linux/sched/debug.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/tty/sysrq.c +1 -1
@@ -232,7 +232,7 @@ static void showacpu(void *dummy)raw_spin_lock_irqsave (&show_lock, flags);pr_info ("CPU%d:\n" ,smp_processor_id ()); -show_stack (NULL ,NULL ); +show_stack_loglvl (NULL ,NULL ,KERN_INFO );raw_spin_unlock_irqrestore (&show_lock, flags); }
include/linux/sched/debug.h +2 -0
@@ -31,6 +31,8 @@ extern void show_regs(struct pt_regs *);* trace (or NULL if the entire call-chain of the task should be shown). */ extern void show_stack (struct task_struct *task,unsigned long *sp); +extern void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +const char *loglvl);extern void sched_show_task (struct task_struct *p);
Signature · 1 line
2.26.0
PATCH v3 45/50 x86/amd_gart: Print stacktrace for a leak with KERN_ERR
In reply to Dmitry SafonovIt's under CONFIG_IOMMU_LEAK option which is enabled by debug config. Likely the backtrace is worth to be seen - so aligning with log level of error message in iommu_full().
--- arch/x86/kernel/amd_gart_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/amd_gart_64.c +1 -1
@@ -159,7 +159,7 @@ static void dump_leak(void)return ; dump =1 ; -show_stack (NULL ,NULL ); +show_stack_loglvl (NULL ,NULL ,KERN_ERR ); debug_dma_dump_mappings(NULL); }#endif
Signature · 1 line
2.26.0
PATCH v3 46/50 power: Use show_stack_loglvl()
In reply to Dmitry SafonovAligning with other watchdog messages just before panic - use KERN_EMERG.
--- drivers/base/power/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/power/main.c +1 -1
@@ -519,7 +519,7 @@ static void dpm_watchdog_handler(struct timer_list *t)struct dpm_watchdog *wd =from_timer (wd, t, timer);dev_emerg (wd->dev,"**** DPM device timeout ****\n" ); -show_stack (wd->tsk,NULL ); +show_stack_loglvl (wd->tsk,NULL ,KERN_EMERG );panic ("%s %s: unrecoverable failure\n" ,dev_driver_string (wd->dev),dev_name (wd->dev)); }
Signature · 1 line
2.26.0
PATCH v3 47/50 kdb: Don't play with console_loglevel
In reply to Dmitry SafonovPrint the stack trace with KERN_EMERG - it should be always visible.
Playing with console_loglevel is a bad idea as there may be more messages printed than wanted. Also the stack trace might be not printed at all if printk() was deferred and console_loglevel was raised back before the trace got flushed.
Unfortunately, after rebasing on commit 2277b492582d ("kdb: Fix stack crawling on 'running' CPUs that aren't the master"), kdb_show_stack() uses now kdb_dump_stack_on_cpu(), which for now won't be converted as it uses dump_stack() instead of show_stack().
Convert for now the branch that uses show_stack() and remove console_loglevel exercise from that case.
--- kernel/debug/kdb/kdb_bt.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
kernel/debug/kdb/kdb_bt.c +8 -7
@@ -21,17 +21,18 @@static void kdb_show_stack (struct task_struct *p,void *addr) { -int old_lvl = console_loglevel; - - console_loglevel =CONSOLE_LOGLEVEL_MOTORMOUTH ; kdb_trap_printk++; -if (!addr &&kdb_task_has_cpu (p)) +if (!addr &&kdb_task_has_cpu (p)) { +int old_lvl = console_loglevel; + + console_loglevel =CONSOLE_LOGLEVEL_MOTORMOUTH ;kdb_dump_stack_on_cpu (kdb_process_cpu (p)); -else -show_stack (p, addr); + console_loglevel = old_lvl; + }else { +show_stack_loglvl (p, addr,KERN_EMERG ); + } - console_loglevel = old_lvl; kdb_trap_printk--; }
Signature · 1 line
2.26.0
PATCH v3 48/50 sched: Print stack trace with KERN_INFO
In reply to Dmitry SafonovAligning with other messages printed in sched_show_task() - use KERN_INFO to print the backtrace.
--- kernel/sched/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/core.c +1 -1
@@ -5957,7 +5957,7 @@ void sched_show_task(struct task_struct *p) (unsigned long)task_thread_info(p)->flags);print_worker_info (KERN_INFO , p); -show_stack (p,NULL ); +show_stack_loglvl (p,NULL ,KERN_INFO );put_task_stack (p); }EXPORT_SYMBOL_GPL (sched_show_task);
Signature · 1 line
2.26.0
PATCH v3 49/50 kernel: Use show_stack_loglvl()
In reply to Dmitry SafonovAlign the last users of show_stack() by KERN_DEFAULT as the surrounding headers/messages.
--- kernel/locking/rtmutex-debug.c | 2 +- lib/dump_stack.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
kernel/locking/rtmutex-debug.c +1 -1
@@ -125,7 +125,7 @@ void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter)printk ("\n%s/%d's [blocked] stackdump:\n\n" , task->comm,task_pid_nr (task)); -show_stack (task,NULL ); +show_stack_loglvl (task,NULL ,KERN_DEFAULT );printk ("\n%s/%d's [current] stackdump:\n\n" , current->comm,task_pid_nr (current));dump_stack ();
lib/dump_stack.c +1 -1
@@ -74,7 +74,7 @@ void show_regs_print_info(const char *log_lvl)static void __dump_stack (void ) {dump_stack_print_info (KERN_DEFAULT ); -show_stack (NULL ,NULL ); +show_stack_loglvl (NULL ,NULL ,KERN_DEFAULT ); }/**
Signature · 1 line
2.26.0
PATCH v3 50/50 kernel: Rename show_stack_loglvl() => show_stack()
In reply to Dmitry SafonovNow the last users of show_stack() got converted to use an explicit log level, show_stack_loglvl() can drop it's redundant suffix and become once again well known show_stack().
--- arch/alpha/kernel/traps.c | 8 +------- arch/arc/kernel/stacktrace.c | 8 +------- arch/arm/kernel/traps.c | 8 +------- arch/arm64/kernel/traps.c | 8 +------- arch/c6x/kernel/traps.c | 7 +------ arch/csky/kernel/dumpstack.c | 7 +------ arch/csky/kernel/ptrace.c | 4 ++-- arch/h8300/kernel/traps.c | 8 +------- arch/hexagon/kernel/traps.c | 8 +------- arch/ia64/kernel/mca.c | 2 +- arch/ia64/kernel/process.c | 11 ++--------- arch/m68k/kernel/traps.c | 11 +++-------- arch/microblaze/kernel/traps.c | 8 +------- arch/mips/kernel/traps.c | 8 +------- arch/nds32/kernel/traps.c | 8 +------- arch/nios2/kernel/traps.c | 12 +++--------- arch/openrisc/kernel/traps.c | 10 ++-------- arch/parisc/kernel/traps.c | 8 +------- arch/powerpc/kernel/process.c | 11 +++-------- arch/powerpc/kernel/stacktrace.c | 2 +- arch/riscv/kernel/stacktrace.c | 8 +------- arch/s390/kernel/dumpstack.c | 9 ++------- arch/sh/kernel/dumpstack.c | 8 +------- arch/sh/kernel/process_64.c | 3 +-- arch/sparc/kernel/process_32.c | 11 ++--------- arch/sparc/kernel/process_64.c | 2 +- arch/sparc/kernel/traps_64.c | 8 +------- arch/um/drivers/mconsole_kern.c | 2 +- arch/um/kernel/sysrq.c | 7 +------ arch/unicore32/kernel/traps.c | 7 +------ arch/x86/kernel/amd_gart_64.c | 2 +- arch/x86/kernel/dumpstack.c | 7 +------ arch/xtensa/kernel/traps.c | 10 ++-------- drivers/base/power/main.c | 2 +- drivers/tty/sysrq.c | 2 +- include/linux/sched/debug.h | 5 ++--- kernel/debug/kdb/kdb_bt.c | 2 +- kernel/locking/rtmutex-debug.c | 2 +- kernel/sched/core.c | 2 +- lib/dump_stack.c | 2 +- 40 files changed, 53 insertions(+), 205 deletions(-)
arch/alpha/kernel/traps.c +1 -7
@@ -144,8 +144,7 @@ dik_show_trace(unsigned long *sp, const char *loglvl)static int kstack_depth_to_print =24 ; -void show_stack_loglvl (struct task_struct *task,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *sp,const char *loglvl) {unsigned long *stack;int i;
@@ -174,11 +173,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *sp,dik_show_trace (sp, loglvl); } -void show_stack (struct task_struct *task,unsigned long *sp) -{ -show_stack_loglvl (task, sp,KERN_DEFAULT ); -} -void die_if_kernel (char * str,struct pt_regs *regs,long err,unsigned long *r9_15) {
arch/arc/kernel/stacktrace.c +1 -7
@@ -228,17 +228,11 @@ noinline void show_stacktrace(struct task_struct *tsk, struct pt_regs *regs,EXPORT_SYMBOL (show_stacktrace);/* Expected by sched Code */ -void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *tsk,unsigned long *sp,const char *loglvl) {show_stacktrace (tsk,NULL , loglvl); } -void show_stack (struct task_struct *tsk,unsigned long *sp) -{ -show_stack_loglvl (tsk, sp,KERN_DEFAULT ); -} -/* Another API expected by schedular, shows up in "ps" as Wait Channel * Of course just returning schedule( ) would be pointless so unwind until * the function is not in schedular code
arch/arm/kernel/traps.c +1 -7
@@ -247,18 +247,12 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk, }#endif -void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *tsk,unsigned long *sp,const char *loglvl) {dump_backtrace (NULL , tsk, loglvl);barrier (); } -void show_stack (struct task_struct *tsk,unsigned long *sp) -{ -show_stack_loglvl (tsk, sp,KERN_DEFAULT ); -} -#ifdef CONFIG_PREEMPT #define S_PREEMPT " PREEMPT"#elif defined(CONFIG_PREEMPT_RT )
arch/arm64/kernel/traps.c +1 -7
@@ -137,18 +137,12 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,put_task_stack (tsk); } -void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *tsk,unsigned long *sp,const char *loglvl) {dump_backtrace (NULL , tsk, loglvl);barrier (); } -void show_stack (struct task_struct *tsk,unsigned long *sp) -{ -show_stack_loglvl (tsk, sp,KERN_DEFAULT ); -} -#ifdef CONFIG_PREEMPT #define S_PREEMPT " PREEMPT"#elif defined(CONFIG_PREEMPT_RT )
arch/c6x/kernel/traps.c +1 -6
@@ -374,7 +374,7 @@ static void show_trace(unsigned long *stack, unsigned long *endstack,printk ("%s\n" , loglvl); } -void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +void show_stack (struct task_struct *task,unsigned long *stack,const char *loglvl) {unsigned long *p, *endstack;
@@ -403,11 +403,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *stack,show_trace (stack, endstack, loglvl); } -void show_stack (struct task_struct *task,unsigned long *stack) -{ -show_stack_loglvl (task, stack,KERN_DEBUG ); -} -int is_valid_bugaddr (unsigned long addr) {return __kernel_text_address (addr);
arch/csky/kernel/dumpstack.c +1 -6
@@ -32,7 +32,7 @@ static void show_trace(unsigned long *stack, const char *loglvl)pr_cont ("\n" ); } -void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +void show_stack (struct task_struct *task,unsigned long *stack,const char *loglvl) {if (!stack) {
@@ -48,8 +48,3 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *stack,show_trace (stack, loglvl); } - -void show_stack (struct task_struct *task,unsigned long *stack) -{ -show_stack_loglvl (task, stack,KERN_INFO ); -}
arch/csky/kernel/ptrace.c +2 -2
@@ -338,7 +338,7 @@ asmlinkage void syscall_trace_exit(struct pt_regs *regs)trace_sys_exit (regs,syscall_get_return_value (current, regs)); } -extern void show_stack (struct task_struct *task,unsigned long *stack); +extern void show_stack (struct task_struct *task,unsigned long *stack,const char *loglvl);void show_regs (struct pt_regs *fp) {unsigned long *sp;
@@ -414,6 +414,6 @@ void show_regs(struct pt_regs *fp) }pr_cont ("\n" ); -show_stack (NULL , (unsigned long *)fp->regs[4 ]); +show_stack (NULL , (unsigned long *)fp->regs[4 ],KERN_INFO );return ; }
arch/h8300/kernel/traps.c +1 -7
@@ -115,8 +115,7 @@ void die(const char *str, struct pt_regs *fp, unsigned long err)static int kstack_depth_to_print =24 ; -void show_stack_loglvl (struct task_struct *task,unsigned long *esp, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *esp,const char *loglvl) {unsigned long *stack, addr;int i;
@@ -158,8 +157,3 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *esp, }printk ("%s\n" , loglvl); } - -void show_stack (struct task_struct *task,unsigned long *esp) -{ -show_stack_loglvl (task, esp,KERN_INFO ); -}
arch/hexagon/kernel/traps.c +1 -7
@@ -175,18 +175,12 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp, } } -void show_stack_loglvl (struct task_struct *task,unsigned long *fp, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *fp,const char *loglvl) {/* Saved link reg is one word above FP */ do_show_stack (task, fp,0 , loglvl); } -void show_stack (struct task_struct *task,unsigned long *fp) -{ -show_stack_loglvl (task, fp,0 ,KERN_INFO ); -} -int die (const char *str,struct pt_regs *regs,long err) { static struct {
arch/ia64/kernel/mca.c +1 -1
@@ -1631,7 +1631,7 @@ default_monarch_init_process(struct notifier_block *self, unsigned long val, voiif (read_trylock (&tasklist_lock)) { do_each_thread (g, t) {printk ("\nBacktrace of pid %d (%s)\n" , t->pid, t->comm); -show_stack (t,NULL ); +show_stack (t,NULL ,KERN_DEFAULT ); }while_each_thread (g, t);read_unlock (&tasklist_lock); }
arch/ia64/kernel/process.c +2 -9
@@ -85,8 +85,7 @@ ia64_do_show_stack (struct unw_frame_info *info, void *arg) }void -show_stack_loglvl (struct task_struct *task,unsigned long *sp, -const char *loglvl) +show_stack (struct task_struct *task,unsigned long *sp,const char *loglvl) {if (!task)unw_init_running (ia64_do_show_stack, (void *)loglvl);
@@ -98,12 +97,6 @@ show_stack_loglvl (struct task_struct *task, unsigned long *sp, } } -void -show_stack (struct task_struct *task,unsigned long *sp) -{ -show_stack_loglvl (task, sp,KERN_DEFAULT ); -} -void show_regs (struct pt_regs *regs) {
@@ -158,7 +151,7 @@ show_regs (struct pt_regs *regs) ((i == sof - 1) || (i % 3) == 2) ? "\n" : " "); } }else -show_stack (NULL ,NULL ); +show_stack (NULL ,NULL ,KERN_DEFAULT ); }/* local support for deprecated console_print */
arch/m68k/kernel/traps.c +3 -8
@@ -916,7 +916,7 @@ void show_registers(struct pt_regs *regs)default :pr_cont ("\n" ); } -show_stack (NULL , (unsigned long *)addr); +show_stack (NULL , (unsigned long *)addr,KERN_INFO );pr_info ("Code:" );set_fs (KERNEL_DS );
@@ -935,8 +935,8 @@ void show_registers(struct pt_regs *regs)pr_cont ("\n" ); } -void show_stack_loglvl (struct task_struct *task,unsigned long *stack, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *stack, +const char *loglvl) {unsigned long *p;unsigned long *endstack;
@@ -963,11 +963,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *stack,show_trace (stack, loglvl); } -void show_stack (struct task_struct *task,unsigned long *stack) -{ -show_stack_loglvl (task, stack,KERN_INFO ); -} -/* * The vector number returned in the frame pointer may also contain * the "fs" (Fault Status) bits on ColdFire. These are in the bottom
arch/microblaze/kernel/traps.c +1 -7
@@ -31,8 +31,7 @@ static int __init kstack_setup(char *s) }__setup ("kstack=" , kstack_setup); -void show_stack_loglvl (struct task_struct *task,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *sp,const char *loglvl) {unsigned long words_to_show;u32 fp = (u32 ) sp;
@@ -77,8 +76,3 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *sp,debug_show_held_locks (task); } - -void show_stack (struct task_struct *task,unsigned long *sp) -{ -show_stack_loglvl (task, sp,KERN_INFO ); -}
arch/mips/kernel/traps.c +1 -7
@@ -196,8 +196,7 @@ static void show_stacktrace(struct task_struct *task,show_backtrace (task, regs, loglvl); } -void show_stack_loglvl (struct task_struct *task,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *sp,const char *loglvl) {struct pt_regs regs;mm_segment_t old_fs =get_fs ();
@@ -225,11 +224,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *sp,set_fs (old_fs); } -void show_stack (struct task_struct *task,unsigned long *sp) -{ - show_stack_loglvl(task, sp, KERN_DEFAULT) -} -static void show_code (unsigned int __user *pc) {long i;
arch/nds32/kernel/traps.c +1 -7
@@ -135,8 +135,7 @@ static void __dump(struct task_struct *tsk, unsigned long *base_reg,printk ("%s\n" , loglvl); } -void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *tsk,unsigned long *sp,const char *loglvl) {unsigned long *base_reg;
@@ -157,11 +156,6 @@ void show_stack_loglvl(struct task_struct *tsk, unsigned long *sp,barrier (); } -void show_stack (struct task_struct *tsk,unsigned long *sp) -{ -show_stack_loglvl (tsk, sp,KERN_EMERG ); -} -DEFINE_SPINLOCK (die_lock);/*
arch/nios2/kernel/traps.c +3 -9
@@ -52,14 +52,13 @@ void _exception(int signo, struct pt_regs *regs, int code, unsigned long addr) }/* -* The show_stack(), show_stack_loglvl() are external API -* which we do not use ourselves. +* The show_stack() is external API which we do not use ourselves. */ int kstack_depth_to_print =48 ; -void show_stack_loglvl (struct task_struct *task,unsigned long *stack, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *stack, +const char *loglvl) {unsigned long *endstack, addr;int i;
@@ -106,11 +105,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *stack,printk ("%s\n" , loglvl); } -void show_stack (struct task_struct *task,unsigned long *stack) -{ -show_stack_loglvl (task, stack,KERN_EMERG ); -} -void __init trap_init (void ) {/* Nothing to do here */
arch/openrisc/kernel/traps.c +2 -8
@@ -48,8 +48,7 @@ void print_trace(void *data, unsigned long addr, int reliable) }/* displays a short stack trace */ -void show_stack_loglvl (struct task_struct *task,unsigned long *esp, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *esp,const char *loglvl) {if (esp ==NULL ) esp = (unsigned long *)&esp;
@@ -58,11 +57,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *esp,unwind_stack ((void *)loglvl, esp, print_trace); } -void show_stack (struct task_struct *task,unsigned long *esp) -{ -show_stack_loglvl (task, esp,KERN_EMERG ); -} -void show_registers (struct pt_regs *regs) {int i;
@@ -104,7 +98,7 @@ void show_registers(struct pt_regs *regs)if (in_kernel) {printk ("\nStack: " ); -show_stack (NULL , (unsigned long *)esp); +show_stack (NULL , (unsigned long *)esp,KERN_EMERG );printk ("\nCode: " );if (regs->pc <PAGE_OFFSET )
arch/parisc/kernel/traps.c +1 -7
@@ -198,17 +198,11 @@ static void parisc_show_stack(struct task_struct *task,do_show_stack (&info, loglvl); } -void show_stack_loglvl (struct task_struct *t,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *t,unsigned long *sp,const char *loglvl) {parisc_show_stack (t,NULL , loglvl); } -void show_stack (struct task_struct *t,unsigned long *sp) -{ - show_stack_loglvl(t, sp, KERN_CRIT) -} -int is_valid_bugaddr (unsigned long iaoq) {return 1 ;
arch/powerpc/kernel/process.c +3 -8
@@ -1444,7 +1444,7 @@ void show_regs(struct pt_regs * regs)printk ("NIP [" REG "] %pS\n" , regs->nip, (void *)regs->nip);printk ("LR [" REG "] %pS\n" , regs->link, (void *)regs->link);#endif -show_stack (current, (unsigned long *) regs->gpr[1 ]); +show_stack (current, (unsigned long *) regs->gpr[1 ],KERN_DEFAULT );if (!user_mode (regs))show_instructions (regs); }
@@ -2068,8 +2068,8 @@ unsigned long get_wchan(struct task_struct *p)static int kstack_depth_to_print =CONFIG_PRINT_STACK_DEPTH ; -void show_stack_loglvl (struct task_struct *tsk,unsigned long *stack, -const char *loglvl) +void show_stack (struct task_struct *tsk,unsigned long *stack, +const char *loglvl) {unsigned long sp, ip, lr, newsp;int count =0 ;
@@ -2138,11 +2138,6 @@ void show_stack_loglvl(struct task_struct *tsk, unsigned long *stack,put_task_stack (tsk); } -void show_stack (struct task_struct *tsk,unsigned long *stack) -{ -show_stack_loglvl (tsk, stack,KERN_DEFAULT ); -} -#ifdef CONFIG_PPC64 /* Called with hard IRQs off */ void notrace __ppc64_runlatch_on(void)
arch/powerpc/kernel/stacktrace.c +1 -1
@@ -260,7 +260,7 @@ static void raise_backtrace_ipi(cpumask_t *mask)pr_cont (" current pointer corrupt? (%px)\n" , p->__current);pr_warn ("Back trace of paca->saved_r1 (0x%016llx) (possibly stale):\n" , p->saved_r1); -show_stack (p->__current, (unsigned long *)p->saved_r1); +show_stack (p->__current, (unsigned long *)p->saved_r1,KERN_WARNING ); } }
arch/riscv/kernel/stacktrace.c +1 -7
@@ -105,18 +105,12 @@ static bool print_trace_address(unsigned long pc, void *arg)return false; } -void show_stack_loglvl (struct task_struct *task,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *sp,const char *loglvl) {pr_cont ("Call Trace:\n" );walk_stackframe (task,NULL , print_trace_address, (void *)loglvl); } -void show_stack (struct task_struct *task,unsigned long *sp) -{ -show_stack_loglvl (task, sp,KERN_DEFAULT ); -} -static bool save_wchan (unsigned long pc,void *arg) {if (!in_sched_functions (pc)) {
arch/s390/kernel/dumpstack.c +2 -7
@@ -126,7 +126,7 @@ int get_stack_info(unsigned long sp, struct task_struct *task,return -EINVAL ; } -void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +void show_stack (struct task_struct *task,unsigned long *stack,const char *loglvl) {struct unwind_state state;
@@ -139,11 +139,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *stack,debug_show_held_locks (task ? : current); } -void show_stack (struct task_struct *task,unsigned long *stack) -{ -show_stack_loglvl (task, stack,KERN_DEFAULT ); -} -static void show_last_breaking_event (struct pt_regs *regs) {printk ("Last Breaking-Event-Address:\n" );
@@ -181,7 +176,7 @@ void show_regs(struct pt_regs *regs)show_registers (regs);/* Show stack backtrace if pt_regs is from kernel mode */ if (!user_mode (regs)) -show_stack (NULL , (unsigned long *) regs->gprs[15 ]); +show_stack (NULL , (unsigned long *) regs->gprs[15 ],KERN_DEFAULT );show_last_breaking_event (regs); }
arch/sh/kernel/dumpstack.c +1 -7
@@ -144,8 +144,7 @@ void show_trace(struct task_struct *tsk, unsigned long *sp,debug_show_held_locks (tsk); } -void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *tsk,unsigned long *sp,const char *loglvl) {unsigned long stack;
@@ -161,8 +160,3 @@ void show_stack_loglvl(struct task_struct *tsk, unsigned long *sp, (unsigned long)task_stack_page(tsk));show_trace (tsk, sp,NULL , loglvl); } - -void show_stack (struct task_struct *task,unsigned long *sp) -{ -show_stack_loglvl (task, sp,KERN_DEFAULT ); -}
arch/sh/kernel/process_64.c +1 -2
@@ -275,13 +275,12 @@ void show_regs(struct pt_regs *regs)* If we're in kernel mode, dump the stack too.. */ if (!user_mode (regs)) { -void show_stack (struct task_struct *tsk,unsigned long *sp);unsigned long sp = regs->regs[15 ] &0xffffffff ;struct task_struct *tsk =get_current (); tsk->thread.kregs = regs; -show_stack (tsk, (unsigned long *)sp); +show_stack (tsk, (unsigned long *)sp,KERN_DEFAULT ); } }
arch/sparc/kernel/process_32.c +2 -9
@@ -145,12 +145,10 @@ void show_regs(struct pt_regs *r) }/* -* The show_stack(), show_stack_loglvl() are external APIs which -* we do not use ourselves. +* The show_stack() is external API which we do not use ourselves. * The oops is printed in die_if_kernel. */ -void show_stack_loglvl (struct task_struct *tsk,unsigned long *_ksp, -const char *loglvl) +void show_stack (struct task_struct *tsk,unsigned long *_ksp,const char *loglvl) {unsigned long pc, fp;unsigned long task_base;
@@ -179,11 +177,6 @@ void show_stack_loglvl(struct task_struct *tsk, unsigned long *_ksp,printk ("%s\n" , loglvl); } -void show_stack (struct task_struct *task,unsigned long *sp) -{ -show_stack_loglvl (task, sp,KERN_DEFAULT ); -} -/* * Free current thread data structures etc.. */
arch/sparc/kernel/process_64.c +1 -1
@@ -195,7 +195,7 @@ void show_regs(struct pt_regs *regs) regs->u_regs[15]);printk ("RPC: <%pS>\n" , (void *) regs->u_regs[15 ]);show_regwindow (regs); -show_stack (current, (unsigned long *) regs->u_regs[UREG_FP ]); +show_stack (current, (unsigned long *)regs->u_regs[UREG_FP ],KERN_DEFAULT ); }union global_cpu_snapshot global_cpu_snapshot[NR_CPUS ];
arch/sparc/kernel/traps_64.c +1 -7
@@ -2453,8 +2453,7 @@ static void user_instruction_dump(unsigned int __user *pc)printk ("\n" ); } -void show_stack_loglvl (struct task_struct *tsk,unsigned long *_ksp, -const char *loglvl) +void show_stack (struct task_struct *tsk,unsigned long *_ksp,const char *loglvl) {unsigned long fp, ksp;struct thread_info *tp;
@@ -2514,11 +2513,6 @@ void show_stack_loglvl(struct task_struct *tsk, unsigned long *_ksp, }while (++count <16 ); } -void show_stack (struct task_struct *tsk,unsigned long *_ksp) -{ -show_stack_loglvl (task, sp,KERN_DEFAULT ); -} -static inline struct reg_window *kernel_stack_up (struct reg_window *rw) {unsigned long fp = rw->ins[6 ];
arch/um/drivers/mconsole_kern.c +1 -1
@@ -648,7 +648,7 @@ static void stack_proc(void *arg) {struct task_struct *task = arg; -show_stack (task,NULL ); +show_stack (task,NULL ,KERN_INFO ); }/*
arch/um/kernel/sysrq.c +1 -6
@@ -27,7 +27,7 @@ static const struct stacktrace_ops stackops = { .address = _print_addr }; -void show_stack_loglvl (struct task_struct *task,unsigned long *stack, +void show_stack (struct task_struct *task,unsigned long *stack,const char *loglvl) {struct pt_regs *segv_regs = current->thread.segv_regs;
@@ -56,8 +56,3 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *stack,dump_trace (current, &stackops, (void *)loglvl);printk ("%s\n" , loglvl); } - -void show_stack (struct task_struct *task,unsigned long *stack) -{ -show_stack_loglvl (task, stack,KERN_INFO ); -}
arch/unicore32/kernel/traps.c +1 -6
@@ -167,18 +167,13 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,c_backtrace (fp, loglvl); } -void show_stack_loglvl (struct task_struct *tsk,unsigned long *sp, +void show_stack (struct task_struct *tsk,unsigned long *sp,const char *loglvl) {dump_backtrace (NULL , tsk, loglvl);barrier (); } -void show_stack (struct task_struct *tsk,unsigned long *sp) -{ - show_stack_loglvl(tsk, sp, KERN_DEFAULT) -} -static int __die (const char *str,int err,struct thread_info *thread,struct pt_regs *regs) {
arch/x86/kernel/amd_gart_64.c +1 -1
@@ -159,7 +159,7 @@ static void dump_leak(void)return ; dump =1 ; -show_stack_loglvl (NULL ,NULL ,KERN_ERR ); +show_stack (NULL ,NULL ,KERN_ERR ); debug_dma_dump_mappings(NULL); }#endif
arch/x86/kernel/dumpstack.c +1 -6
@@ -279,7 +279,7 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, } } -void show_stack_loglvl (struct task_struct *task,unsigned long *sp, +void show_stack (struct task_struct *task,unsigned long *sp,const char *loglvl) { task = task ? : current;
@@ -294,11 +294,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *sp,show_trace_log_lvl (task,NULL , sp, loglvl); } -void show_stack (struct task_struct *task,unsigned long *sp) -{ -show_stack_loglvl (task, sp,KERN_DEFAULT ); -} -void show_stack_regs (struct pt_regs *regs) {show_trace_log_lvl (current, regs,NULL ,KERN_DEFAULT );
arch/xtensa/kernel/traps.c +2 -8
@@ -501,8 +501,7 @@ static void show_trace(struct task_struct *task, unsigned long *sp,#define STACK_DUMP_LINE_SIZE 32static size_t kstack_depth_to_print =CONFIG_PRINT_STACK_DEPTH ; -void show_stack_loglvl (struct task_struct *task,unsigned long *sp, -const char *loglvl) +void show_stack (struct task_struct *task,unsigned long *sp,const char *loglvl) {size_t len;
@@ -519,11 +518,6 @@ void show_stack_loglvl(struct task_struct *task, unsigned long *sp,show_trace (task, stack, loglvl); } -void show_stack (struct task_struct *task,unsigned long *sp) -{ -show_stack_loglvl (task, sp,KERN_INFO ); -} -DEFINE_SPINLOCK (die_lock);void die (const char * str,struct pt_regs * regs,long err)
@@ -540,7 +534,7 @@ void die(const char * str, struct pt_regs * regs, long err)pr_info ("%s: sig: %ld [#%d]%s\n" , str, err, ++die_counter, pr);show_regs (regs);if (!user_mode (regs)) -show_stack (NULL , (unsigned long *)regs->areg[1 ]); +show_stack (NULL , (unsigned long *)regs->areg[1 ],KERN_INFO );add_taint (TAINT_DIE ,LOCKDEP_NOW_UNRELIABLE );spin_unlock_irq (&die_lock);
drivers/base/power/main.c +1 -1
@@ -519,7 +519,7 @@ static void dpm_watchdog_handler(struct timer_list *t)struct dpm_watchdog *wd =from_timer (wd, t, timer);dev_emerg (wd->dev,"**** DPM device timeout ****\n" ); -show_stack_loglvl (wd->tsk,NULL ,KERN_EMERG ); +show_stack (wd->tsk,NULL ,KERN_EMERG );panic ("%s %s: unrecoverable failure\n" ,dev_driver_string (wd->dev),dev_name (wd->dev)); }
drivers/tty/sysrq.c +1 -1
@@ -232,7 +232,7 @@ static void showacpu(void *dummy)raw_spin_lock_irqsave (&show_lock, flags);pr_info ("CPU%d:\n" ,smp_processor_id ()); -show_stack_loglvl (NULL ,NULL ,KERN_INFO ); +show_stack (NULL ,NULL ,KERN_INFO );raw_spin_unlock_irqrestore (&show_lock, flags); }
include/linux/sched/debug.h +2 -3
@@ -30,9 +30,8 @@ extern void show_regs(struct pt_regs *);* task), SP is the stack pointer of the first frame that should be shown in the back * trace (or NULL if the entire call-chain of the task should be shown). */ -extern void show_stack (struct task_struct *task,unsigned long *sp); -extern void show_stack_loglvl (struct task_struct *task,unsigned long *sp, -const char *loglvl); +extern void show_stack (struct task_struct *task,unsigned long *sp, +const char *loglvl);extern void sched_show_task (struct task_struct *p);
kernel/debug/kdb/kdb_bt.c +1 -1
@@ -30,7 +30,7 @@ static void kdb_show_stack(struct task_struct *p, void *addr)kdb_dump_stack_on_cpu (kdb_process_cpu (p)); console_loglevel = old_lvl; }else { -show_stack_loglvl (p, addr,KERN_EMERG ); +show_stack (p, addr,KERN_EMERG ); } kdb_trap_printk--;
kernel/locking/rtmutex-debug.c +1 -1
@@ -125,7 +125,7 @@ void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter)printk ("\n%s/%d's [blocked] stackdump:\n\n" , task->comm,task_pid_nr (task)); -show_stack_loglvl (task,NULL ,KERN_DEFAULT ); +show_stack (task,NULL ,KERN_DEFAULT );printk ("\n%s/%d's [current] stackdump:\n\n" , current->comm,task_pid_nr (current));dump_stack ();
kernel/sched/core.c +1 -1
@@ -5957,7 +5957,7 @@ void sched_show_task(struct task_struct *p) (unsigned long)task_thread_info(p)->flags);print_worker_info (KERN_INFO , p); -show_stack_loglvl (p,NULL ,KERN_INFO ); +show_stack (p,NULL ,KERN_INFO );put_task_stack (p); }EXPORT_SYMBOL_GPL (sched_show_task);
lib/dump_stack.c +1 -1
@@ -74,7 +74,7 @@ void show_regs_print_info(const char *log_lvl)static void __dump_stack (void ) {dump_stack_print_info (KERN_DEFAULT ); -show_stack_loglvl (NULL ,NULL ,KERN_DEFAULT ); +show_stack (NULL ,NULL ,KERN_DEFAULT ); }/**
Signature · 1 line
2.26.0
Quoted 5 lines · Dmitry Safonov
Add log level argument to
show_stack().
Done in three stages:
1. Introducingshow_stack_loglvl()for every architecture
2. Migrating old users with an explicit log level
3. Renamingshow_stack_loglvl()intoshow_stack()
Thank you for proposing this patchset.
Every architecture gets show_stack_loglvl() means that it will become possible to implement dump_stack_loglvl(const char *loglvl), isn't it?
I'm about to start a proposal for making it possible to suppress printing majority of OOM-killer messages and memory allocation failure messages to consoles
( https://lkml.kernel.org/r/[email protected] ), for dump_stack() / show_mem() / dump_tasks() etc. can take long time (if printed to consoles) is an unhappy thing for OOM context and atomic context.
Hi Tetsuo,
Quoted 11 lines · Tetsuo Handa
Quoted 5 lines · Dmitry Safonov
Add log level argument to
show_stack().
Done in three stages:
1. Introducingshow_stack_loglvl()for every architecture
2. Migrating old users with an explicit log level
3. Renamingshow_stack_loglvl()intoshow_stack()Thank you for proposing this patchset.
Every architecture gets
show_stack_loglvl()means that it will become possible to implementdump_stack_loglvl(const char *loglvl), isn't it?
Yes, it should be quite trivial.
Currently I'm waiting if there will be any noise from linux-next, then I plan to add dump_stack_loglvl(), also sched_show_task_lvl() and show_trace().
Quoted 5 lines
I'm about to start a proposal for making it possible to suppress printing majority of OOM-killer messages and memory allocation failure messages to consoles
( https://lkml.kernel.org/r/[email protected] ), fordump_stack()/show_mem()/dump_tasks()etc. can take long time (if printed to consoles) is an unhappy thing for OOM context and atomic context.
Sounds good - especially for slow consoles.
One can use sysrq to print OOM info.
Thanks,
Dmitry