aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.com>2021-06-29 09:53:17 +0200
committerPetr Mladek <pmladek@suse.com>2021-06-29 09:53:17 +0200
commit94f2be50badfa88e96033e77621c6711d58f84d3 (patch)
treee12cd00f1cc461bbf9054e2ffb763739c158d267 /lib
parentMerge branch 'for-5.14-vsprintf-scanf' into for-linus (diff)
parentprintk: fix cpu lock ordering (diff)
downloadlinux-dev-94f2be50badfa88e96033e77621c6711d58f84d3.tar.xz
linux-dev-94f2be50badfa88e96033e77621c6711d58f84d3.zip
Merge branch 'printk-rework' into for-linus
Diffstat (limited to 'lib')
-rw-r--r--lib/dump_stack.c38
1 files changed, 2 insertions, 36 deletions
diff --git a/lib/dump_stack.c b/lib/dump_stack.c
index f5a33b6f773f..5ebf4375fa8c 100644
--- a/lib/dump_stack.c
+++ b/lib/dump_stack.c
@@ -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);