|
@@ -25,6 +25,7 @@ static atomic_t dump_lock = ATOMIC_INIT(-1);
|
|
|
|
|
|
asmlinkage __visible void dump_stack(void)
|
|
asmlinkage __visible void dump_stack(void)
|
|
{
|
|
{
|
|
|
|
+ unsigned long flags;
|
|
int was_locked;
|
|
int was_locked;
|
|
int old;
|
|
int old;
|
|
int cpu;
|
|
int cpu;
|
|
@@ -33,9 +34,8 @@ asmlinkage __visible void dump_stack(void)
|
|
* Permit this cpu to perform nested stack dumps while serialising
|
|
* Permit this cpu to perform nested stack dumps while serialising
|
|
* against other CPUs
|
|
* against other CPUs
|
|
*/
|
|
*/
|
|
- preempt_disable();
|
|
|
|
-
|
|
|
|
retry:
|
|
retry:
|
|
|
|
+ local_irq_save(flags);
|
|
cpu = smp_processor_id();
|
|
cpu = smp_processor_id();
|
|
old = atomic_cmpxchg(&dump_lock, -1, cpu);
|
|
old = atomic_cmpxchg(&dump_lock, -1, cpu);
|
|
if (old == -1) {
|
|
if (old == -1) {
|
|
@@ -43,6 +43,7 @@ retry:
|
|
} else if (old == cpu) {
|
|
} else if (old == cpu) {
|
|
was_locked = 1;
|
|
was_locked = 1;
|
|
} else {
|
|
} else {
|
|
|
|
+ local_irq_restore(flags);
|
|
cpu_relax();
|
|
cpu_relax();
|
|
goto retry;
|
|
goto retry;
|
|
}
|
|
}
|
|
@@ -52,7 +53,7 @@ retry:
|
|
if (!was_locked)
|
|
if (!was_locked)
|
|
atomic_set(&dump_lock, -1);
|
|
atomic_set(&dump_lock, -1);
|
|
|
|
|
|
- preempt_enable();
|
|
|
|
|
|
+ local_irq_restore(flags);
|
|
}
|
|
}
|
|
#else
|
|
#else
|
|
asmlinkage __visible void dump_stack(void)
|
|
asmlinkage __visible void dump_stack(void)
|