Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | From | Dongdong Deng <> | Subject | [PATCH 2/2] debug_core: replace atomic_set() with atomic_xchg() for atomic kgdb_active | Date | Fri, 26 Nov 2010 16:28:27 +0800 |
| |
The atomic_set() don't imply memory barriers, therefor the single stepping processor could not observe the changing of kgdb_active value which was done at other cpu immediately.
Using atomic_xchg() to replace atomic_set() to change kgdb_active, as it implys the memory barrier semantics around the atomic_xchg().
Signed-off-by: Dongdong Deng <libfetion@gmail.com> --- kernel/debug/debug_core.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index bec8af0..722968f 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c @@ -548,7 +548,7 @@ return_normal: if (atomic_read(&kgdb_cpu_doing_single_step) != -1 && (kgdb_info[cpu].task && kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) { - atomic_set(&kgdb_active, -1); + atomic_xchg(&kgdb_active, -1); raw_spin_unlock(&dbg_master_lock); dbg_touch_watchdogs(); local_irq_restore(flags); @@ -657,7 +657,7 @@ kgdb_restore: smp_mb__before_atomic_dec(); atomic_dec(&masters_in_kgdb); /* Free kgdb_active */ - atomic_set(&kgdb_active, -1); + atomic_xchg(&kgdb_active, -1); raw_spin_unlock(&dbg_master_lock); dbg_touch_watchdogs(); local_irq_restore(flags); -- 1.6.0.4
| ![\](/images/icornerr.gif) |