Merge tag 'drm-misc-fixes-2021-08-04' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-2.6-microblaze.git] / lib / dump_stack.c
index f5a33b6..cd3387b 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/buildid.h>
 #include <linux/export.h>
 #include <linux/sched.h>
 #include <linux/sched/debug.h>
@@ -36,6 +37,14 @@ void __init dump_stack_set_arch_desc(const char *fmt, ...)
        va_end(args);
 }
 
+#if IS_ENABLED(CONFIG_STACKTRACE_BUILD_ID)
+#define BUILD_ID_FMT " %20phN"
+#define BUILD_ID_VAL vmlinux_build_id
+#else
+#define BUILD_ID_FMT "%s"
+#define BUILD_ID_VAL ""
+#endif
+
 /**
  * dump_stack_print_info - print generic debug info for dump_stack()
  * @log_lvl: log level
@@ -45,13 +54,13 @@ void __init dump_stack_set_arch_desc(const char *fmt, ...)
  */
 void dump_stack_print_info(const char *log_lvl)
 {
-       printk("%sCPU: %d PID: %d Comm: %.20s %s%s %s %.*s\n",
+       printk("%sCPU: %d PID: %d Comm: %.20s %s%s %s %.*s" BUILD_ID_FMT "\n",
               log_lvl, raw_smp_processor_id(), current->pid, current->comm,
               kexec_crash_loaded() ? "Kdump: loaded " : "",
               print_tainted(),
               init_utsname()->release,
               (int)strcspn(init_utsname()->version, " "),
-              init_utsname()->version);
+              init_utsname()->version, BUILD_ID_VAL);
 
        if (dump_stack_arch_desc_str[0] != '\0')
                printk("%sHardware name: %s\n",
@@ -73,10 +82,10 @@ void show_regs_print_info(const char *log_lvl)
        dump_stack_print_info(log_lvl);
 }
 
-static void __dump_stack(void)
+static void __dump_stack(const char *log_lvl)
 {
-       dump_stack_print_info(KERN_DEFAULT);
-       show_stack(NULL, NULL, KERN_DEFAULT);
+       dump_stack_print_info(log_lvl);
+       show_stack(NULL, NULL, log_lvl);
 }
 
 /**
@@ -84,50 +93,22 @@ static void __dump_stack(void)
  *
  * Architectures can override this implementation by implementing its own.
  */
-#ifdef CONFIG_SMP
-static atomic_t dump_lock = ATOMIC_INIT(-1);
-
-asmlinkage __visible void dump_stack(void)
+asmlinkage __visible void dump_stack_lvl(const char *log_lvl)
 {
        unsigned long flags;
-       int was_locked;
-       int old;
-       int cpu;
 
        /*
         * Permit this cpu to perform nested stack dumps while serialising
         * against other CPUs
         */
-retry:
-       local_irq_save(flags);
-       cpu = smp_processor_id();
-       old = atomic_cmpxchg(&dump_lock, -1, cpu);
-       if (old == -1) {
-               was_locked = 0;
-       } else if (old == cpu) {
-               was_locked = 1;
-       } else {
-               local_irq_restore(flags);
-               /*
-                * Wait for the lock to release before jumping to
-                * atomic_cmpxchg() in order to mitigate the thundering herd
-                * problem.
-                */
-               do { cpu_relax(); } while (atomic_read(&dump_lock) != -1);
-               goto retry;
-       }
-
-       __dump_stack();
-
-       if (!was_locked)
-               atomic_set(&dump_lock, -1);
-
-       local_irq_restore(flags);
+       printk_cpu_lock_irqsave(flags);
+       __dump_stack(log_lvl);
+       printk_cpu_unlock_irqrestore(flags);
 }
-#else
+EXPORT_SYMBOL(dump_stack_lvl);
+
 asmlinkage __visible void dump_stack(void)
 {
-       __dump_stack();
+       dump_stack_lvl(KERN_DEFAULT);
 }
-#endif
 EXPORT_SYMBOL(dump_stack);