Merge tag 'pnp-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / lib / dump_stack.c
index f5a33b6..5ebf437 100644 (file)
@@ -84,50 +84,16 @@ 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)
 {
        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);
-}
-#else
-asmlinkage __visible void dump_stack(void)
-{
+       printk_cpu_lock_irqsave(flags);
        __dump_stack();
+       printk_cpu_unlock_irqrestore(flags);
 }
-#endif
 EXPORT_SYMBOL(dump_stack);