sh: add loglvl to show_trace()
authorDmitry Safonov <dima@arista.com>
Tue, 9 Jun 2020 04:31:33 +0000 (21:31 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Jun 2020 16:39:12 +0000 (09:39 -0700)
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.

Add log level parameter to show_trace() as a preparation to introduce
show_stack_loglvl().

[1]: https://lore.kernel.org/lkml/20190528002412.1625-1-dima@arista.com/T/#u

Signed-off-by: Dmitry Safonov <dima@arista.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Rich Felker <dalias@libc.org>
Link: http://lkml.kernel.org/r/20200418201944.482088-33-dima@arista.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/sh/include/asm/processor_32.h
arch/sh/kernel/dumpstack.c
arch/sh/kernel/process_32.c

index 0e0ecc0132e3b1e64d724e79b17bc374bebdb845..d44409413418a549c1b87a25ff2fc127ff3083fb 100644 (file)
@@ -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);
index 959064b9005550497235402e374d9a78a472ff22..d488a47a1f0fcf45bb69f0f08bcbdd6cb1a1fd9a 100644 (file)
@@ -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);
 }
index a094633874c373efb7eb8e1108af99015e7888b5..456cc8d171f7258a935535fdb51f20232fce388e 100644 (file)
@@ -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);
 }