]> git.baikalelectronics.ru Git - kernel.git/commitdiff
kallsyms/printk: add loglvl to print_ip_sym()
authorDmitry Safonov <dima@arista.com>
Tue, 9 Jun 2020 04:29:56 +0000 (21:29 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Jun 2020 16:39:10 +0000 (09:39 -0700)
Patch series "Add log level to show_stack()", v3.

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:

- It's a design mistake to move a business-logic decision into platform
  realization detail.

- 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).

- 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).

- 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/20191106083538.z5nlpuf64cigxigh@pathway.suse.cz/

This patch (of 50):

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.

Signed-off-by: Dmitry Safonov <dima@arista.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Ben Segall <bsegall@google.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: Greentime Hu <green.hu@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Hogan <jhogan@kernel.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Michal Simek <monstr@monstr.eu>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Paul Burton <paulburton@kernel.org>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vincent Chen <deanbo422@gmail.com>
Cc: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Will Deacon <will@kernel.org>
Cc: Dmitry Safonov <0x7f454c46@gmail.com>
Cc: Dmitry Safonov <dima@arista.com>
Cc: Jiri Slaby <jslaby@suse.com>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Vineet Gupta <vgupta@synopsys.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Aurelien Jacquiot <jacquiot.aurelien@gmail.com>
Cc: Mark Salter <msalter@redhat.com>
Cc: Guo Ren <guoren@kernel.org>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Brian Cain <bcain@codeaurora.org>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Ley Foon Tan <lftan@altera.com>
Cc: Jonas Bonn <jonas@southpole.se>
Cc: Stafford Horne <shorne@gmail.com>
Cc: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
Cc: Helge Deller <deller@gmx.de>
Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Rich Felker <dalias@libc.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: Guan Xuetao <gxt@pku.edu.cn>
Cc: Borislav Petkov <bp@alien8.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Chris Zankel <chris@zankel.net>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Len Brown <len.brown@intel.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Cc: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Douglas Anderson <dianders@chromium.org>
Cc: Jason Wessel <jason.wessel@windriver.com>
Link: http://lkml.kernel.org/r/20200418201944.482088-2-dima@arista.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/microblaze/kernel/unwind.c
arch/mips/kernel/traps.c
arch/nds32/kernel/traps.c
arch/riscv/kernel/stacktrace.c
include/linux/kallsyms.h
kernel/locking/lockdep.c
kernel/sched/core.c
kernel/trace/ftrace.c
tools/include/linux/kallsyms.h

index 34c270cb11fcbd340aaeaa9716010dd8893a9cd6..4241cdd28ee779017e05b3157b0c95ad7c526347 100644 (file)
@@ -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 */
index 22f805a73921d6355e7e5bf5953e79f263359f9f..210fea63de75012b771f7df4e2d9cceb85d609c1 100644 (file)
@@ -125,7 +125,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");
 }
@@ -155,7 +155,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");
index f4d386b52622762c7011667466ee0a632bec6fc8..40625760a125e12ce5d76176f1c07c1cb51128a4 100644 (file)
@@ -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;
index 837b9b38f825cf254bc1963325e3abd670e1ef97..9f1ac258482fd7e98a55472ec3f3bcb72b2529b3 100644 (file)
@@ -99,7 +99,7 @@ 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;
 }
 
index 657a83b943f06465e32cb23dabb7bd6f94cacee6..98338dc6b5d275acdc80b2026ee6ac7111cb9f7d 100644 (file)
@@ -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*/
index 4c057dd8e93b224e65dcde606091925cd8773538..38cce34d03dc387c4dddd7eaa4962c454318a085 100644 (file)
@@ -4424,7 +4424,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);
@@ -5075,7 +5075,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);
index 8298b2c240ce8e2cda3b8f0515608d9c403b3d6b..c06da3c3e317d4ac00b7c676ce9740a91e3d1aa2 100644 (file)
@@ -3922,8 +3922,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");
@@ -6871,8 +6870,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);
index b5765aeea698af5fabf37438e4f9b28703a7a522..7d0ebd1047069551fa666482a1297fc54ab3ebe7 100644 (file)
@@ -2020,12 +2020,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) {
@@ -2036,12 +2036,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) {
index 89ca6fe257ccb94652015f073f5fade62d011c88..efb6c3f5f2a9a53a58e436fe120dd7b4d9880d8a 100644 (file)
@@ -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;