[DTrace-devel] [PATCH 05/12] Add provider-dependent struct in dt_probe_t

eugene.loh at oracle.com eugene.loh at oracle.com
Sat Jul 11 17:38:29 PDT 2020


From: Eugene Loh <eugene.loh at oracle.com>

The dt_probe_t struct had members like event_id and event_fd.
This made sense for the providers we were supporting, since they
were all tracepoint-like.  For future providers, however, those
members might not make sense and others will be needed.  Therefore,
replace event_id and event_fd with an opaque pointer to a
provider-dependent struct.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_bpf.c          | 10 +++---
 libdtrace/dt_probe.c        | 31 +++++++---------
 libdtrace/dt_probe.h        |  6 ++--
 libdtrace/dt_prov_dtrace.c  | 25 ++++++-------
 libdtrace/dt_prov_fbt.c     | 23 ++++++------
 libdtrace/dt_prov_sdt.c     | 72 +++++++++++++++++++++++++++++--------
 libdtrace/dt_prov_syscall.c | 22 +++++++-----
 libdtrace/dt_provider.h     | 20 ++++++++---
 8 files changed, 135 insertions(+), 74 deletions(-)

diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index d5282b94..e7780b56 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -323,11 +323,13 @@ dt_bpf_load_prog(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 int
 dt_bpf_attach(dtrace_hdl_t *dtp, dt_probe_t *prp, int bpf_fd)
 {
+	tp_probe_t *datap = prp->prv_data;
+
 	/*
 	 * If we have not yet created a perf event for this probe, do that now
 	 * and cache the file descriptor so we only need to do this once.
 	 */
-	if (prp->event_fd == -1) {
+	if (datap->event_fd == -1) {
 		int			fd;
 		struct perf_event_attr	attr = { 0, };
 
@@ -335,16 +337,16 @@ dt_bpf_attach(dtrace_hdl_t *dtp, dt_probe_t *prp, int bpf_fd)
 		attr.sample_type = PERF_SAMPLE_RAW;
 		attr.sample_period = 1;
 		attr.wakeup_events = 1;
-		attr.config = prp->event_id;
+		attr.config = datap->event_id;
 
 		fd = perf_event_open(&attr, -1, 0, -1, 0);
 		if (fd < 0)
 			return dt_set_errno(dtp, errno);
 
-		prp->event_fd = fd;
+		datap->event_fd = fd;
 	}
 
-	if (ioctl(prp->event_fd, PERF_EVENT_IOC_SET_BPF, bpf_fd) < 0)
+	if (ioctl(datap->event_fd, PERF_EVENT_IOC_SET_BPF, bpf_fd) < 0)
 		return dt_set_errno(dtp, errno);
 
 	return 0;
diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
index 5add8ae6..30f178f6 100644
--- a/libdtrace/dt_probe.c
+++ b/libdtrace/dt_probe.c
@@ -666,7 +666,8 @@ dt_probe_tag(dt_probe_t *prp, uint_t argn, dt_node_t *dnp)
 
 dt_probe_t *
 dt_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov, const char *prv,
-		const char *mod, const char *fun, const char *prb)
+		const char *mod, const char *fun, const char *prb,
+		void *datap)
 {
 	dt_probe_t		*prp;
 	dtrace_probedesc_t	*desc;
@@ -678,12 +679,12 @@ dt_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov, const char *prv,
 
 		if (nprobes_sz < dtp->dt_probes_sz) {	/* overflow */
 			dt_set_errno(dtp, EDT_NOMEM);
-			return NULL;
+			goto err;
 		}
 
 		nprobes = dt_calloc(dtp, nprobes_sz, sizeof(dt_probe_t *));
 		if (nprobes == NULL)
-			return NULL;
+			goto err;
 
 		if (dtp->dt_probes)
 			memcpy(nprobes, dtp->dt_probes,
@@ -696,11 +697,11 @@ dt_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov, const char *prv,
 
 	/* Allocate the new probe and fill in its basic info. */
 	if ((prp = dt_zalloc(dtp, sizeof(dt_probe_t))) == NULL)
-		return NULL;
+		goto err;
 
 	if ((desc = dt_alloc(dtp, sizeof(dtrace_probedesc_t))) == NULL) {
 		dt_free(dtp, prp);
-		return NULL;
+		goto err;
 	}
 
 	desc->id = dtp->dt_probe_id++;
@@ -711,8 +712,7 @@ dt_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov, const char *prv,
 
 	prp->desc = desc;
 	prp->prov = prov;
-	prp->event_id = -1;
-	prp->event_fd = -1;
+	prp->prv_data = datap;
 
 	dt_htab_insert(dtp->dt_byprv, prp);
 	dt_htab_insert(dtp->dt_bymod, prp);
@@ -723,6 +723,11 @@ dt_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov, const char *prv,
 	dtp->dt_probes[dtp->dt_probe_id - 1] = prp;
 
 	return prp;
+
+err:
+	if (prov->impl->probe_destroy)
+		prov->impl->probe_destroy(dtp, datap);
+	return NULL;
 }
 
 static int
@@ -872,26 +877,16 @@ dt_probe_delete(dtrace_hdl_t *dtp, dt_probe_t *prp)
 static void
 dt_probe_args_info(dtrace_hdl_t *dtp, dt_probe_t *prp)
 {
-	int			id = DTRACE_IDNONE;
 	int			argc = 0;
 	dt_argdesc_t		*argv = NULL;
 	int			i, nc, xc;
 	dtrace_typeinfo_t	dtt;
 
-	/*
-	 * If we already have an event ID information for this probe, there is
-	 * no need to retrieve it again.
-	 */
-	if (prp->event_id != -1)
-		return;
-
 	if (!prp->prov->impl->probe_info)
 		return;
-	if (prp->prov->impl->probe_info(dtp, prp, &id, &argc, &argv) < 0)
+	if (prp->prov->impl->probe_info(dtp, prp, &argc, &argv) < 0)
 		return;
 
-	if (id > 0)
-		prp->event_id = id;
 	if (!argc || !argv)
 		return;
 
diff --git a/libdtrace/dt_probe.h b/libdtrace/dt_probe.h
index 7feeeff2..8ec6ebc5 100644
--- a/libdtrace/dt_probe.h
+++ b/libdtrace/dt_probe.h
@@ -38,8 +38,7 @@ typedef struct dt_probe {
 	struct dt_hentry he_fun;	/* function name htab links */
 	struct dt_hentry he_prb;	/* probe name htab link */
 	struct dt_hentry he_fqn;	/* fully qualified name htab link */
-	int event_id;			/* tracing event id */
-	int event_fd;			/* perf event file descriptor */
+	void *prv_data;			/* provider-specific data */
 	dt_ident_t *pr_ident;		/* pointer to probe identifier */
 	const char *pr_name;		/* pointer to name component */
 	dt_node_t *nargs;		/* native argument list */
@@ -71,7 +70,8 @@ extern dt_node_t *dt_probe_tag(dt_probe_t *, uint_t, dt_node_t *);
 
 extern dt_probe_t *dt_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov,
 				     const char *prv, const char *mod,
-				     const char *fun, const char *prb);
+				     const char *fun, const char *prb,
+				     void *datap);
 extern dt_probe_t *dt_probe_lookup(dtrace_hdl_t *dtp,
 				   const dtrace_probedesc_t *pdp);
 extern dt_probe_t *dt_probe_lookup_by_name(dtrace_hdl_t *dtp, const char *name);
diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
index fe9759de..a5dc1eb0 100644
--- a/libdtrace/dt_prov_dtrace.c
+++ b/libdtrace/dt_prov_dtrace.c
@@ -40,11 +40,11 @@ static int populate(dtrace_hdl_t *dtp)
 	if (prv == NULL)
 		return 0;
 
-	if (dt_probe_insert(dtp, prv, prvname, modname, funname, "BEGIN"))
+	if (tp_probe_insert(dtp, prv, prvname, modname, funname, "BEGIN"))
 		n++;
-	if (dt_probe_insert(dtp, prv, prvname, modname, funname, "END"))
+	if (tp_probe_insert(dtp, prv, prvname, modname, funname, "END"))
 		n++;
-	if (dt_probe_insert(dtp, prv, prvname, modname, funname, "ERROR"))
+	if (tp_probe_insert(dtp, prv, prvname, modname, funname, "ERROR"))
 		n++;
 
 	return n;
@@ -230,7 +230,7 @@ out:
 }
 
 static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
-		      int *idp, int *argcp, dt_argdesc_t **argvp)
+		      int *argcp, dt_argdesc_t **argvp)
 {
 	char	*spec;
 	char	*fn = NULL;
@@ -238,8 +238,12 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	FILE	*f;
 	int	rc = -ENOENT;
 	size_t	len;
+	tp_probe_t	*datap = prp->prv_data;
+
+        /* if we have an event ID, no need to retrieve it again */
+        if (datap->event_id != -1)
+		return -1;
 
-	*idp = -1;
 	*argcp = 0;			/* no arguments */
 	*argvp = NULL;
 
@@ -271,7 +275,7 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	if (f == NULL)
 		goto out;
 
-	rc = tp_event_info(dtp, f, 0, idp, NULL, NULL);
+	rc = tp_event_info(dtp, f, 0, datap, NULL, NULL);
 	fclose(f);
 
 out:
@@ -292,19 +296,15 @@ out:
  * for some reason we are out of luck - fortunately it is not harmful to the
  * system as a whole.
  */
-static int probe_fini(dtrace_hdl_t *dtp, dt_probe_t *prp)
+static int probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
 {
 	int	fd;
 
-	if (prp->event_fd != -1) {
-		close(prp->event_fd);
-		prp->event_fd = -1;
-	}
+	tp_probe_fini(dtp, prp);
 
 	fd = open(UPROBE_EVENTS, O_WRONLY | O_APPEND);
 	if (fd == -1)
 		return -1;
-
 	dprintf(fd, "-:" GROUP_FMT "/%s\n", GROUP_DATA, prp->desc->prb);
 	close(fd);
 
@@ -317,5 +317,6 @@ dt_provimpl_t	dt_dtrace = {
 	.populate	= &populate,
 	.trampoline	= &trampoline,
 	.probe_info	= &probe_info,
+	.probe_destroy	= &tp_probe_destroy,
 	.probe_fini	= &probe_fini,
 };
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 1aa3ca3c..d01d1932 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -136,9 +136,9 @@ static int populate(dtrace_hdl_t *dtp)
 		if (dt_probe_lookup(dtp, &pd) != NULL)
 			continue;
 
-		if (dt_probe_insert(dtp, prv, prvname, mod, buf, "entry"))
+		if (tp_probe_insert(dtp, prv, prvname, mod, buf, "entry"))
 			n++;
-		if (dt_probe_insert(dtp, prv, prvname, mod, buf, "return"))
+		if (tp_probe_insert(dtp, prv, prvname, mod, buf, "return"))
 			n++;
 	}
 
@@ -273,15 +273,19 @@ static void trampoline(dt_pcb_t *pcb)
 }
 
 static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
-		      int *idp, int *argcp, dt_argdesc_t **argvp)
+		      int *argcp, dt_argdesc_t **argvp)
 {
 	int	fd;
 	char	*fn;
 	size_t	len;
 	FILE	*f;
 	int	rc = -1;
+	tp_probe_t	*datap = prp->prv_data;
+
+        /* if we have an event ID, no need to retrieve it again */
+        if (datap->event_id != -1)
+		return -1;
 
-	*idp = -1;
 	*argcp = 0;			/* no arguments by default */
 	*argvp = NULL;
 
@@ -312,7 +316,7 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	if (f == NULL)
 		goto out;
 
-	rc = tp_event_info(dtp, f, 0, idp, NULL, NULL);
+	rc = tp_event_info(dtp, f, 0, datap, NULL, NULL);
 	fclose(f);
 
 out:
@@ -332,19 +336,15 @@ out:
  * for some reason we are out of luck - fortunately it is not harmful to the
  * system as a whole.
  */
-static int probe_fini(dtrace_hdl_t *dtp, dt_probe_t *prp)
+static int probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
 {
 	int	fd;
 
-	if (prp->event_fd != -1) {
-		close(prp->event_fd);
-		prp->event_fd = -1;
-	}
+	tp_probe_fini(dtp, prp);
 
 	fd = open(KPROBE_EVENTS, O_WRONLY | O_APPEND);
 	if (fd == -1)
 		return -1;
-
 	dprintf(fd, "-:" FBT_GROUP_FMT "/%s\n", FBT_GROUP_DATA,
 		prp->desc->fun);
 	close(fd);
@@ -358,5 +358,6 @@ dt_provimpl_t	dt_fbt = {
 	.populate	= &populate,
 	.trampoline	= &trampoline,
 	.probe_info	= &probe_info,
+	.probe_destroy	= &tp_probe_destroy,
 	.probe_fini	= &probe_fini,
 };
diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
index 6d99653a..9223951b 100644
--- a/libdtrace/dt_prov_sdt.c
+++ b/libdtrace/dt_prov_sdt.c
@@ -57,6 +57,22 @@ static const dtrace_pattr_t	pattr = {
 { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA },
 };
 
+dt_probe_t *tp_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov,
+			    const char *prv, const char *mod,
+			    const char *fun, const char *prb)
+{
+	tp_probe_t *datap;
+
+	datap = dt_zalloc(dtp, sizeof (tp_probe_t));
+	if (datap == NULL)
+		return NULL;
+
+	datap->event_id = -1;
+	datap->event_fd = -1;
+
+	return dt_probe_insert(dtp, prov, prv, mod, fun, prb, datap);
+}
+
 /*
  * Parse the EVENTSFS/<group>/<event>/format file to determine the event id and
  * the argument types.
@@ -79,8 +95,8 @@ static const dtrace_pattr_t	pattr = {
  * specify an additional numbe of fields to skip (using the 'skip' parameter)
  * before we get to the actual arguments.
  */
-int tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, int *idp, int *argcp,
-		  dt_argdesc_t **argvp)
+int tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *datap,
+		  int *argcp, dt_argdesc_t **argvp)
 {
 	char		buf[1024];
 	int		argc;
@@ -88,7 +104,7 @@ int tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, int *idp, int *argcp,
 	dt_argdesc_t	*argv = NULL;
 	char		*strp;
 
-	*idp = -1;
+	datap->event_id = -1;
 
 	/*
 	 * Let skip be the total number of fields to skip.
@@ -104,7 +120,7 @@ int tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, int *idp, int *argcp,
 	while (fgets(buf, sizeof(buf), f)) {
 		char	*p = buf;
 
-		if (sscanf(buf, "ID: %d\n", idp) == 1)
+		if (sscanf(buf, "ID: %d\n", &datap->event_id) == 1)
 			continue;
 
 		if (sscanf(buf, " field:%[^;]", p) <= 0)
@@ -223,6 +239,29 @@ done:
 	return 0;
 }
 
+int tp_probe_destroy(dtrace_hdl_t *dtp, void *datap)
+{
+	dt_free(dtp, datap);
+	datap = NULL;
+
+	return 0;
+}
+
+int tp_probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
+{
+	tp_probe_t *datap = prp->prv_data;
+
+	if (datap->event_fd != -1) {
+		close(datap->event_fd);
+		datap->event_fd = -1;
+	}
+	datap->event_id = -1;
+
+	tp_probe_destroy(dtp, prp->prv_data);
+
+	return 0;
+}
+
 /*
  * The PROBE_LIST file lists all tracepoints in a <group>:<name> format.
  * We need to ignore these groups:
@@ -247,8 +286,8 @@ static int populate(dtrace_hdl_t *dtp)
 		return 0;
 
 	while (fgets(buf, sizeof(buf), f)) {
-		int	dummy;
-		char	str[sizeof(buf)];
+		int		dummy;
+		char		str[sizeof(buf)];
 
 		p = strchr(buf, '\n');
 		if (p)
@@ -273,10 +312,10 @@ static int populate(dtrace_hdl_t *dtp)
 				 strcmp(buf, UPROBES) == 0)
 				continue;
 
-			if (dt_probe_insert(dtp, prv, prvname, buf, "", p))
+			if (tp_probe_insert(dtp, prv, prvname, buf, "", p))
 				n++;
 		} else {
-			if (dt_probe_insert(dtp, prv, prvname, modname, "",
+			if (tp_probe_insert(dtp, prv, prvname, modname, "",
 					    buf))
 				n++;
 		}
@@ -380,13 +419,16 @@ static void trampoline(dt_pcb_t *pcb)
 }
 
 static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
-		      int *idp, int *argcp, dt_argdesc_t **argvp)
+		      int *argcp, dt_argdesc_t **argvp)
 {
-	FILE	*f;
-	char	fn[256];
-	int	rc;
+	FILE		*f;
+	char		fn[256];
+	int		rc;
+	tp_probe_t	*datap = prp->prv_data;
 
-	*idp = -1;
+	/* if we have an event ID, no need to retrieve it again */
+	if (datap->event_id != -1)
+		return -1;
 
 	strcpy(fn, EVENTSFS);
 	strcat(fn, prp->desc->mod);
@@ -398,7 +440,7 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	if (!f)
 		return -ENOENT;
 
-	rc = tp_event_info(dtp, f, 0, idp, argcp, argvp);
+	rc = tp_event_info(dtp, f, 0, datap, argcp, argvp);
 	fclose(f);
 
 	return rc;
@@ -410,4 +452,6 @@ dt_provimpl_t	dt_sdt = {
 	.populate	= &populate,
 	.trampoline	= &trampoline,
 	.probe_info	= &probe_info,
+	.probe_destroy	= &tp_probe_destroy,
+	.probe_fini	= &tp_probe_fini,
 };
diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
index a7061d21..1c9145c0 100644
--- a/libdtrace/dt_prov_syscall.c
+++ b/libdtrace/dt_prov_syscall.c
@@ -109,18 +109,19 @@ static int populate(dtrace_hdl_t *dtp)
 			continue;
 
 		p += sizeof(PROV_PREFIX) - 1;
+
 		/*
 		 * Now p will be just "event", and we are only interested in
 		 * events that match "sys_enter_*" or "sys_exit_*".
 		 */
 		if (!memcmp(p, ENTRY_PREFIX, sizeof(ENTRY_PREFIX) - 1)) {
 			p += sizeof(ENTRY_PREFIX) - 1;
-			if (dt_probe_insert(dtp, prv, prvname, modname, p,
+			if (tp_probe_insert(dtp, prv, prvname, modname, p,
 					    "entry"))
 				n++;
 		} else if (!memcmp(p, EXIT_PREFIX, sizeof(EXIT_PREFIX) - 1)) {
 			p += sizeof(EXIT_PREFIX) - 1;
-			if (dt_probe_insert(dtp, prv, prvname, modname, p,
+			if (tp_probe_insert(dtp, prv, prvname, modname, p,
 					    "return"))
 				n++;
 		}
@@ -235,13 +236,16 @@ static void trampoline(dt_pcb_t *pcb)
 }
 
 static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
-		      int *idp, int *argcp, dt_argdesc_t **argvp)
+		      int *argcp, dt_argdesc_t **argvp)
 {
-	FILE	*f;
-	char	fn[256];
-	int	rc;
+	FILE		*f;
+	char		fn[256];
+	int		rc;
+	tp_probe_t	*datap = prp->prv_data;
 
-	*idp = -1;
+	/* if we have an event ID, no need to retrieve it again */
+	if (datap->event_id != -1)
+		return -1;
 
 	/*
 	 * We know that the probe name is either "entry" or "return", so we can
@@ -259,7 +263,7 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	if (!f)
 		return -ENOENT;
 
-	rc = tp_event_info(dtp, f, SKIP_EXTRA_FIELDS, idp, argcp, argvp);
+	rc = tp_event_info(dtp, f, SKIP_EXTRA_FIELDS, datap, argcp, argvp);
 	fclose(f);
 
 	return rc;
@@ -271,4 +275,6 @@ dt_provimpl_t	dt_syscall = {
 	.populate	= &populate,
 	.trampoline	= &trampoline,
 	.probe_info	= &probe_info,
+	.probe_destroy	= &tp_probe_destroy,
+	.probe_fini	= &tp_probe_fini,
 };
diff --git a/libdtrace/dt_provider.h b/libdtrace/dt_provider.h
index 4f488460..85fe2227 100644
--- a/libdtrace/dt_provider.h
+++ b/libdtrace/dt_provider.h
@@ -63,14 +63,18 @@ typedef struct dt_provimpl {
 		       const dtrace_probedesc_t *pdp);
 	int (*probe_info)(dtrace_hdl_t *dtp,	/* get probe info */
 			  const struct dt_probe *prp,
-			  int *idp, int *argcp, dt_argdesc_t **argvp);
+			  int *argcp, dt_argdesc_t **argvp);
 	void (*trampoline)(dt_pcb_t *pcb);	/* generate BPF trampoline */
+	int (*probe_destroy)(dtrace_hdl_t *dtp,	/* free provider-specific data */
+			     void *datap);
 	int (*probe_fini)(dtrace_hdl_t *dtp,	/* probe cleanup */
-			  struct dt_probe *prb);
+			  const struct dt_probe *prb);
 } dt_provimpl_t;
 
-extern int tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, int *idp,
-			 int *argcp, dt_argdesc_t **argvp);
+typedef struct tp_probe {
+	int	event_id;
+	int	event_fd;
+} tp_probe_t;
 
 extern dt_provimpl_t dt_dtrace;
 extern dt_provimpl_t dt_fbt;
@@ -91,6 +95,14 @@ typedef struct dt_provider {
 	uint_t pv_flags;		/* flags (see below) */
 } dt_provider_t;
 
+extern struct dt_probe *tp_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov,
+				   const char *prv, const char *mod,
+				   const char *fun, const char *prb);
+extern int tp_probe_destroy(dtrace_hdl_t *dtp, void *datap);
+extern int tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip,
+			 tp_probe_t *datap, int *argcp, dt_argdesc_t **argvp);
+extern int tp_probe_fini(dtrace_hdl_t *dtp, const struct dt_probe *prb);
+
 #define	DT_PROVIDER_INTF	0x1	/* provider interface declaration */
 #define	DT_PROVIDER_IMPL	0x2	/* provider implementation is loaded */
 
-- 
2.18.2




More information about the DTrace-devel mailing list