diff options
author | Jason Wessel <jason.wessel@windriver.com> | 2009-07-28 13:31:47 -0500 |
---|---|---|
committer | Jason Wessel <jason.wessel@windriver.com> | 2009-07-28 13:31:47 -0500 |
commit | 22baca4e35e9f8abf2ee8a7c87064238c32bdf37 (patch) | |
tree | fe7db3c32ac5fa05ae691fe05e134ed1a8f503b3 /kernel | |
parent | 7c4a7e890633d64d3cdb5896f48a3c326b15ca0c (diff) |
kgdb: allow for cpu switch when single stepping
The kgdb core should not assume that a single step operation of a
kernel thread will complete on the same CPU. The single step flag is
set at the "thread" level and it is possible in a multi cpu system
that a kernel thread can get scheduled on another cpu the next time it
run.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/kgdb.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/kgdb.c b/kernel/kgdb.c index f44a5a57a635..414cb77580c2 100644 --- a/kernel/kgdb.c +++ b/kernel/kgdb.c @@ -129,6 +129,7 @@ struct task_struct *kgdb_usethread; struct task_struct *kgdb_contthread; int kgdb_single_step; +pid_t kgdb_sstep_pid; /* Our I/O buffers. */ static char remcom_in_buffer[BUFMAX]; @@ -1430,8 +1431,8 @@ acquirelock: * debugger on a different CPU via a single step */ if (atomic_read(&kgdb_cpu_doing_single_step) != -1 && - atomic_read(&kgdb_cpu_doing_single_step) != cpu) { - + kgdb_info[cpu].task && + kgdb_info[cpu].task->pid != kgdb_sstep_pid) { atomic_set(&kgdb_active, -1); touch_softlockup_watchdog_sync(); clocksource_touch_watchdog(); @@ -1524,6 +1525,13 @@ acquirelock: } kgdb_restore: + if (atomic_read(&kgdb_cpu_doing_single_step) != -1) { + int sstep_cpu = atomic_read(&kgdb_cpu_doing_single_step); + if (kgdb_info[sstep_cpu].task) + kgdb_sstep_pid = kgdb_info[sstep_cpu].task->pid; + else + kgdb_sstep_pid = 0; + } /* Free kgdb_active */ atomic_set(&kgdb_active, -1); touch_softlockup_watchdog_sync(); |