diff options
author | David Xu <davidxu@FreeBSD.org> | 2005-08-19 13:35:34 +0000 |
---|---|---|
committer | David Xu <davidxu@FreeBSD.org> | 2005-08-19 13:35:34 +0000 |
commit | 8c6d7a8db81cd4d0171689626f909acbb59c1710 (patch) | |
tree | 07ff9efc7df0cd2edc792f5410cc9e1fa89023dd /sys/kern/sys_process.c | |
parent | 8ddda5248576ce82727ad7adf71d3de92b0325aa (diff) | |
download | src-8c6d7a8db81cd4d0171689626f909acbb59c1710.tar.gz src-8c6d7a8db81cd4d0171689626f909acbb59c1710.zip |
Fix a LOR between sched_lock and sleep queue lock.
Notes
Notes:
svn path=/head/; revision=149284
Diffstat (limited to 'sys/kern/sys_process.c')
-rw-r--r-- | sys/kern/sys_process.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 11b66da43091..f1157ca5ff26 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -788,7 +788,6 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) /* deliver or queue signal */ if (P_SHOULDSTOP(p)) { p->p_xstat = data; - p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG); mtx_lock_spin(&sched_lock); if (saved_pid <= PID_MAX) { p->p_xthread->td_flags &= ~TDF_XSIG; @@ -808,8 +807,11 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) * you should use PT_SUSPEND to suspend it before * continuing process. */ - thread_unsuspend(p); + mtx_unlock_spin(&sched_lock); thread_continued(p); + p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG); + mtx_lock_spin(&sched_lock); + thread_unsuspend(p); mtx_unlock_spin(&sched_lock); } else if (data) { psignal(p, data); |