svn commit: r345247 - in stable/12/sys: cddl/contrib/opensolaris/uts/common/dtrace cddl/contrib/opensolaris/uts/intel/dtrace cddl/dev/dtrace modules/dtrace
Mark Johnston
markj at FreeBSD.org
Sun Mar 17 20:30:29 UTC 2019
Author: markj
Date: Sun Mar 17 20:30:27 2019
New Revision: 345247
URL: https://svnweb.freebsd.org/changeset/base/345247
Log:
MFC r344450, r344452, r344453:
Fix a tracepoint lookup race in fasttrap_pid_probe().
Modified:
stable/12/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
stable/12/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
stable/12/sys/cddl/dev/dtrace/dtrace_cddl.h
stable/12/sys/modules/dtrace/Makefile
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c Sun Mar 17 18:31:48 2019 (r345246)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c Sun Mar 17 20:30:27 2019 (r345247)
@@ -1089,6 +1089,8 @@ fasttrap_tracepoint_disable(proc_t *p, fasttrap_probe_
ASSERT(p->p_proc_flag & P_PR_LOCK);
#endif
p->p_dtrace_count--;
+
+ atomic_add_rel_64(&p->p_fasttrap_tp_gen, 1);
}
/*
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c Sun Mar 17 18:31:48 2019 (r345246)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c Sun Mar 17 20:30:27 2019 (r345247)
@@ -967,6 +967,7 @@ fasttrap_pid_probe(struct trapframe *tf)
struct reg reg, *rp;
proc_t *p = curproc, *pp;
struct rm_priotracker tracker;
+ uint64_t gen;
uintptr_t pc;
uintptr_t new_pc = 0;
fasttrap_bucket_t *bucket;
@@ -1026,8 +1027,22 @@ fasttrap_pid_probe(struct trapframe *tf)
while (pp->p_vmspace == pp->p_pptr->p_vmspace)
pp = pp->p_pptr;
pid = pp->p_pid;
+ if (pp != p) {
+ PROC_LOCK(pp);
+ if ((pp->p_flag & P_WEXIT) != 0) {
+ /*
+ * This can happen if the child was created with
+ * rfork(2). Userspace tracing cannot work reliably in
+ * such a scenario, but we can at least try.
+ */
+ PROC_UNLOCK(pp);
+ sx_sunlock(&proctree_lock);
+ return (-1);
+ }
+ _PHOLD_LITE(pp);
+ PROC_UNLOCK(pp);
+ }
sx_sunlock(&proctree_lock);
- pp = NULL;
rm_rlock(&fasttrap_tp_lock, &tracker);
#endif
@@ -1051,11 +1066,32 @@ fasttrap_pid_probe(struct trapframe *tf)
if (tp == NULL) {
#ifdef illumos
mutex_exit(pid_mtx);
+ return (-1);
#else
rm_runlock(&fasttrap_tp_lock, &tracker);
+ gen = atomic_load_acq_64(&pp->p_fasttrap_tp_gen);
+ if (pp != p)
+ PRELE(pp);
+ if (curthread->t_fasttrap_tp_gen != gen) {
+ /*
+ * At least one tracepoint associated with this PID has
+ * been removed from the table since #BP was raised.
+ * Speculate that we hit a tracepoint that has since
+ * been removed, and retry the instruction.
+ */
+ curthread->t_fasttrap_tp_gen = gen;
+#ifdef __amd64
+ tf->tf_rip = pc;
+#else
+ tf->tf_eip = pc;
#endif
+ return (0);
+ }
return (-1);
+#endif
}
+ if (pp != p)
+ PRELE(pp);
/*
* Set the program counter to the address of the traced instruction
Modified: stable/12/sys/cddl/dev/dtrace/dtrace_cddl.h
==============================================================================
--- stable/12/sys/cddl/dev/dtrace/dtrace_cddl.h Sun Mar 17 18:31:48 2019 (r345246)
+++ stable/12/sys/cddl/dev/dtrace/dtrace_cddl.h Sun Mar 17 20:30:27 2019 (r345247)
@@ -37,7 +37,7 @@ typedef struct kdtrace_proc {
u_int64_t p_dtrace_count; /* Number of DTrace tracepoints */
void *p_dtrace_helpers; /* DTrace helpers, if any */
int p_dtrace_model;
-
+ uint64_t p_fasttrap_tp_gen; /* Tracepoint hash table gen */
} kdtrace_proc_t;
/*
@@ -86,6 +86,7 @@ typedef struct kdtrace_thread {
u_int64_t td_hrtime; /* Last time on cpu. */
void *td_dtrace_sscr; /* Saved scratch space location. */
void *td_systrace_args; /* syscall probe arguments. */
+ uint64_t td_fasttrap_tp_gen; /* Tracepoint hash table gen. */
} kdtrace_thread_t;
/*
@@ -113,10 +114,12 @@ typedef struct kdtrace_thread {
#define t_dtrace_regv td_dtrace->td_dtrace_regv
#define t_dtrace_sscr td_dtrace->td_dtrace_sscr
#define t_dtrace_systrace_args td_dtrace->td_systrace_args
+#define t_fasttrap_tp_gen td_dtrace->td_fasttrap_tp_gen
#define p_dtrace_helpers p_dtrace->p_dtrace_helpers
#define p_dtrace_count p_dtrace->p_dtrace_count
#define p_dtrace_probes p_dtrace->p_dtrace_probes
#define p_model p_dtrace->p_dtrace_model
+#define p_fasttrap_tp_gen p_dtrace->p_fasttrap_tp_gen
#define DATAMODEL_NATIVE 0
#ifdef __amd64__
Modified: stable/12/sys/modules/dtrace/Makefile
==============================================================================
--- stable/12/sys/modules/dtrace/Makefile Sun Mar 17 18:31:48 2019 (r345246)
+++ stable/12/sys/modules/dtrace/Makefile Sun Mar 17 20:30:27 2019 (r345247)
@@ -19,9 +19,6 @@ SUBDIR+= fasttrap fbt systrace_linux
.if ${MACHINE_CPUARCH} == "amd64"
SUBDIR+= systrace_linux32
.endif
-.if ${MACHINE_CPUARCH} == "powerpc"
-SUBDIR+= fbt fasttrap
-.endif
.if ${MACHINE_CPUARCH} == "amd64" || \
${MACHINE_CPUARCH} == "aarch64" || \
${MACHINE_ARCH} == "mips64" || \
@@ -31,7 +28,9 @@ SUBDIR+= systrace_freebsd32
.if ${MACHINE_CPUARCH} == "aarch64" || \
${MACHINE_CPUARCH} == "arm" || \
${MACHINE_CPUARCH} == "mips" || \
+ ${MACHINE_CPUARCH} == "powerpc" || \
${MACHINE_CPUARCH} == "riscv"
SUBDIR+= fbt
.endif
+
.include <bsd.subdir.mk>
More information about the svn-src-all
mailing list