Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F138761427
D14863.id41192.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D14863.id41192.diff
View Options
Index: sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -7256,6 +7256,44 @@
*valoffsp = valoffs;
}
+/*
+ * Disables interrupts and sets the per-thread inprobe flag. When DEBUG is
+ * defined, we also assert that we are not recursing unless the probe ID is an
+ * error probe.
+ */
+static dtrace_icookie_t
+dtrace_probe_enter(dtrace_id_t id)
+{
+ dtrace_icookie_t cookie;
+
+ cookie = dtrace_interrupt_disable();
+
+ /*
+ * Unless this is an ERROR probe, we are not allowed to recurse in
+ * dtrace_probe(). Recursing into DTrace probe usually means that a
+ * function is instrumented that should not have been instrumented or
+ * that the ordering guarantee of the records will be violated,
+ * resulting in unexpected output. If there is an exception to this
+ * assertion, a new case should be added.
+ */
+ ASSERT(curthread->t_dtrace_inprobe == 0 ||
+ id == dtrace_probeid_error);
+ curthread->t_dtrace_inprobe = 1;
+
+ return (cookie);
+}
+
+/*
+ * Disables interrupts and clears the per-thread inprobe flag.
+ */
+static void
+dtrace_probe_exit(dtrace_icookie_t cookie)
+{
+
+ curthread->t_dtrace_inprobe = 0;
+ dtrace_interrupt_enable(cookie);
+}
+
/*
* If you're looking for the epicenter of DTrace, you just found it. This
* is the function called by the provider to fire a probe -- from which all
@@ -7290,7 +7328,7 @@
return;
#endif
- cookie = dtrace_interrupt_disable();
+ cookie = dtrace_probe_enter(id);
probe = dtrace_probes[id - 1];
cpuid = curcpu;
onintr = CPU_ON_INTR(CPU);
@@ -7301,7 +7339,7 @@
* We have hit in the predicate cache; we know that
* this predicate would evaluate to be false.
*/
- dtrace_interrupt_enable(cookie);
+ dtrace_probe_exit(cookie);
return;
}
@@ -7313,7 +7351,7 @@
/*
* We don't trace anything if we're panicking.
*/
- dtrace_interrupt_enable(cookie);
+ dtrace_probe_exit(cookie);
return;
}
@@ -7939,7 +7977,7 @@
if (vtime)
curthread->t_dtrace_start = dtrace_gethrtime();
- dtrace_interrupt_enable(cookie);
+ dtrace_probe_exit(cookie);
}
/*
Index: sys/cddl/dev/dtrace/dtrace_cddl.h
===================================================================
--- sys/cddl/dev/dtrace/dtrace_cddl.h
+++ sys/cddl/dev/dtrace/dtrace_cddl.h
@@ -46,6 +46,7 @@
typedef struct kdtrace_thread {
u_int8_t td_dtrace_stop; /* Indicates a DTrace-desired stop */
u_int8_t td_dtrace_sig; /* Signal sent via DTrace's raise() */
+ u_int8_t td_dtrace_inprobe; /* Are we in a probe? */
u_int td_predcache; /* DTrace predicate cache */
u_int64_t td_dtrace_vtime; /* DTrace virtual time */
u_int64_t td_dtrace_start; /* DTrace slice start time */
@@ -97,6 +98,7 @@
#define t_dtrace_start td_dtrace->td_dtrace_start
#define t_dtrace_stop td_dtrace->td_dtrace_stop
#define t_dtrace_sig td_dtrace->td_dtrace_sig
+#define t_dtrace_inprobe td_dtrace->td_dtrace_inprobe
#define t_predcache td_dtrace->td_predcache
#define t_dtrace_ft td_dtrace->td_dtrace_ft
#define t_dtrace_on td_dtrace->td_dtrace_on
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Dec 5, 2:01 PM (7 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26675887
Default Alt Text
D14863.id41192.diff (3 KB)
Attached To
Mode
D14863: DTrace: Add an invariant to check for recursion in dtrace_probe()
Attached
Detach File
Event Timeline
Log In to Comment