summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_kse.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_kse.c')
-rw-r--r--sys/kern/kern_kse.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/kern/kern_kse.c b/sys/kern/kern_kse.c
index e5ae121..8f8585c 100644
--- a/sys/kern/kern_kse.c
+++ b/sys/kern/kern_kse.c
@@ -148,7 +148,9 @@ kse_switchin(struct thread *td, struct kse_switchin_args *uap)
td->td_mailbox = uap->tmbx;
td->td_pflags |= TDP_CAN_UNBIND;
}
+ PROC_LOCK(td->td_proc);
if (td->td_proc->p_flag & P_TRACED) {
+ _PHOLD(td->td_proc);
if (tmbx.tm_dflags & TMDF_SSTEP)
ptrace_single_step(td);
else
@@ -160,7 +162,9 @@ kse_switchin(struct thread *td, struct kse_switchin_args *uap)
ku->ku_flags |= KUF_DOUPCALL;
mtx_unlock_spin(&sched_lock);
}
+ _PRELE(td->td_proc);
}
+ PROC_UNLOCK(td->td_proc);
}
return ((error == 0) ? EJUSTRETURN : error);
}
@@ -782,8 +786,13 @@ kse_create(struct thread *td, struct kse_create_args *uap)
*/
cpu_set_upcall_kse(newtd, newku->ku_func,
newku->ku_mailbox, &newku->ku_stack);
- if (p->p_flag & P_TRACED)
+ PROC_LOCK(p);
+ if (p->p_flag & P_TRACED) {
+ _PHOLD(p);
ptrace_clear_single_step(newtd);
+ _PRELE(p);
+ }
+ PROC_UNLOCK(p);
}
}
@@ -1376,8 +1385,13 @@ thread_userret(struct thread *td, struct trapframe *frame)
if (!(ku->ku_mflags & KMF_NOUPCALL)) {
cpu_set_upcall_kse(td, ku->ku_func, ku->ku_mailbox,
&ku->ku_stack);
- if (p->p_flag & P_TRACED)
+ PROC_LOCK(p);
+ if (p->p_flag & P_TRACED) {
+ _PHOLD(p);
ptrace_clear_single_step(td);
+ _PRELE(p);
+ }
+ PROC_UNLOCK(p);
error = suword32(&ku->ku_mailbox->km_lwp,
td->td_tid);
if (error)
OpenPOWER on IntegriCloud