summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c31
-rw-r--r--sys/kern/kern_fork.c10
2 files changed, 28 insertions, 13 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c b/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
index f07e8ac..1d19be10 100644
--- a/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
+++ b/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
@@ -988,6 +988,9 @@ int
fasttrap_pid_probe(struct reg *rp)
{
proc_t *p = curproc;
+#if !defined(sun)
+ proc_t *pp;
+#endif
uintptr_t pc = rp->r_rip - 1;
uintptr_t new_pc = 0;
fasttrap_bucket_t *bucket;
@@ -1023,24 +1026,32 @@ fasttrap_pid_probe(struct reg *rp)
curthread->t_dtrace_regv = 0;
#endif
-#if defined(sun)
/*
* Treat a child created by a call to vfork(2) as if it were its
* parent. We know that there's only one thread of control in such a
* process: this one.
*/
+#if defined(sun)
while (p->p_flag & SVFORK) {
p = p->p_parent;
}
-#endif
- PROC_LOCK(p);
- _PHOLD(p);
pid = p->p_pid;
-#if defined(sun)
pid_mtx = &cpu_core[CPU->cpu_id].cpuc_pid_lock;
mutex_enter(pid_mtx);
+#else
+ pp = p;
+ sx_slock(&proctree_lock);
+ while (pp->p_vmspace == pp->p_pptr->p_vmspace)
+ pp = pp->p_pptr;
+ pid = pp->p_pid;
+ sx_sunlock(&proctree_lock);
+ pp = NULL;
+
+ PROC_LOCK(p);
+ _PHOLD(p);
#endif
+
bucket = &fasttrap_tpoints.fth_table[FASTTRAP_TPOINTS_INDEX(pid, pc)];
/*
@@ -1060,9 +1071,10 @@ fasttrap_pid_probe(struct reg *rp)
if (tp == NULL) {
#if defined(sun)
mutex_exit(pid_mtx);
-#endif
+#else
_PRELE(p);
PROC_UNLOCK(p);
+#endif
return (-1);
}
@@ -1184,9 +1196,10 @@ fasttrap_pid_probe(struct reg *rp)
* tracepoint again later if we need to light up any return probes.
*/
tp_local = *tp;
- PROC_UNLOCK(p);
#if defined(sun)
mutex_exit(pid_mtx);
+#else
+ PROC_UNLOCK(p);
#endif
tp = &tp_local;
@@ -1736,7 +1749,7 @@ fasttrap_pid_probe(struct reg *rp)
#if defined(sun)
if (fasttrap_copyout(scratch, (char *)addr, i)) {
#else
- if (uwrite(curproc, scratch, i, addr)) {
+ if (uwrite(p, scratch, i, addr)) {
#endif
fasttrap_sigtrap(p, curthread, pc);
new_pc = pc;
@@ -1795,10 +1808,12 @@ done:
rp->r_rip = new_pc;
+#if !defined(sun)
PROC_LOCK(p);
proc_write_regs(curthread, rp);
_PRELE(p);
PROC_UNLOCK(p);
+#endif
return (0);
}
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 04a7eba..76605f4 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -684,12 +684,12 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2,
#ifdef KDTRACE_HOOKS
/*
- * Tell the DTrace fasttrap provider about the new process
- * if it has registered an interest. We have to do this only after
- * p_state is PRS_NORMAL since the fasttrap module will use pfind()
- * later on.
+ * Tell the DTrace fasttrap provider about the new process so that any
+ * tracepoints inherited from the parent can be removed. We have to do
+ * this only after p_state is PRS_NORMAL since the fasttrap module will
+ * use pfind() later on.
*/
- if (dtrace_fasttrap_fork)
+ if ((flags & RFMEM) == 0 && dtrace_fasttrap_fork)
dtrace_fasttrap_fork(p1, p2);
#endif
if ((p1->p_flag & (P_TRACED | P_FOLLOWFORK)) == (P_TRACED |
OpenPOWER on IntegriCloud