Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae6bf53e authored by Jason Wessel's avatar Jason Wessel
Browse files

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
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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
	 * our cpu_in_kgdb[] flag setting does:
	 */
	smp_wmb();
	atomic_set(&cpu_in_kgdb[cpu], 1);
	atomic_inc(&cpu_in_kgdb[cpu]);

	/*
	 * 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)
			 */
			if (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();
			clocksource_touch_watchdog();
			local_irq_restore(flags);
@@ -1449,7 +1448,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs)
	 */
	if (!kgdb_single_step) {
		for (i = 0; i < NR_CPUS; i++)
			atomic_set(&passive_cpu_wait[i], 1);
			atomic_inc(&passive_cpu_wait[i]);
	}

#ifdef CONFIG_SMP
@@ -1483,11 +1482,11 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs)
	if (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) {
		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
		 * from the debugger.
@@ -1736,11 +1735,11 @@ EXPORT_SYMBOL_GPL(kgdb_unregister_io_module);
 */
void kgdb_breakpoint(void)
{
	atomic_set(&kgdb_setting_breakpoint, 1);
	atomic_inc(&kgdb_setting_breakpoint);
	wmb(); /* Sync point before breakpoint */
	arch_kgdb_breakpoint();
	wmb(); /* Sync point after breakpoint */
	atomic_set(&kgdb_setting_breakpoint, 0);
	atomic_dec(&kgdb_setting_breakpoint);
}
EXPORT_SYMBOL_GPL(kgdb_breakpoint);