Commit ae6bf53e authored by Jason Wessel's avatar Jason Wessel

kgdb: use atomic_inc and atomic_dec instead of atomic_set

Memory barriers should be used for the kgdb cpu synchronization.  The
atomic_set() does not imply a memory barrier.
Reported-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarJason Wessel <jason.wessel@windriver.com>
parent 62fae312
...@@ -1379,8 +1379,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs) ...@@ -1379,8 +1379,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs)
* Make sure the above info reaches the primary CPU before * Make sure the above info reaches the primary CPU before
* our cpu_in_kgdb[] flag setting does: * our cpu_in_kgdb[] flag setting does:
*/ */
smp_wmb(); atomic_inc(&cpu_in_kgdb[cpu]);
atomic_set(&cpu_in_kgdb[cpu], 1);
/* /*
* CPU will loop if it is a slave or request to become a kgdb * CPU will loop if it is a slave or request to become a kgdb
...@@ -1400,7 +1399,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs) ...@@ -1400,7 +1399,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs)
*/ */
if (arch_kgdb_ops.correct_hw_break) if (arch_kgdb_ops.correct_hw_break)
arch_kgdb_ops.correct_hw_break(); arch_kgdb_ops.correct_hw_break();
atomic_set(&cpu_in_kgdb[cpu], 0); atomic_dec(&cpu_in_kgdb[cpu]);
touch_softlockup_watchdog_sync(); touch_softlockup_watchdog_sync();
clocksource_touch_watchdog(); clocksource_touch_watchdog();
local_irq_restore(flags); local_irq_restore(flags);
...@@ -1449,7 +1448,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs) ...@@ -1449,7 +1448,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs)
*/ */
if (!kgdb_single_step) { if (!kgdb_single_step) {
for (i = 0; i < NR_CPUS; i++) for (i = 0; i < NR_CPUS; i++)
atomic_set(&passive_cpu_wait[i], 1); atomic_inc(&passive_cpu_wait[i]);
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
...@@ -1483,11 +1482,11 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs) ...@@ -1483,11 +1482,11 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs)
if (kgdb_io_ops->post_exception) if (kgdb_io_ops->post_exception)
kgdb_io_ops->post_exception(); kgdb_io_ops->post_exception();
atomic_set(&cpu_in_kgdb[ks->cpu], 0); atomic_dec(&cpu_in_kgdb[ks->cpu]);
if (!kgdb_single_step) { if (!kgdb_single_step) {
for (i = NR_CPUS-1; i >= 0; i--) for (i = NR_CPUS-1; i >= 0; i--)
atomic_set(&passive_cpu_wait[i], 0); atomic_dec(&passive_cpu_wait[i]);
/* /*
* Wait till all the CPUs have quit * Wait till all the CPUs have quit
* from the debugger. * from the debugger.
...@@ -1736,11 +1735,11 @@ EXPORT_SYMBOL_GPL(kgdb_unregister_io_module); ...@@ -1736,11 +1735,11 @@ EXPORT_SYMBOL_GPL(kgdb_unregister_io_module);
*/ */
void kgdb_breakpoint(void) void kgdb_breakpoint(void)
{ {
atomic_set(&kgdb_setting_breakpoint, 1); atomic_inc(&kgdb_setting_breakpoint);
wmb(); /* Sync point before breakpoint */ wmb(); /* Sync point before breakpoint */
arch_kgdb_breakpoint(); arch_kgdb_breakpoint();
wmb(); /* Sync point after breakpoint */ wmb(); /* Sync point after breakpoint */
atomic_set(&kgdb_setting_breakpoint, 0); atomic_dec(&kgdb_setting_breakpoint);
} }
EXPORT_SYMBOL_GPL(kgdb_breakpoint); EXPORT_SYMBOL_GPL(kgdb_breakpoint);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment