[DTrace-devel] [PATCH 04/16] Replace probe_fini with detach, and separate detach and destroy

Kris Van Hees kris.van.hees at oracle.com
Thu Mar 18 21:54:20 PDT 2021


The probe framework provides a function dt_probe_fini() that destroys
all probes.  This function calls dt_probe_destroy() on every probe,
and it was calling the probe_fini hook for each probe to perform the
detach and destroy.  Some providers will need additional work done
between the detach and the destroy, so those need to be implemented
as separate hooks.  It is also desirable to explicitly perform the
per-probe detach as a termination of the earlier attach.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_open.c         |  2 ++
 libdtrace/dt_probe.c        | 20 ++++++++++++++++++--
 libdtrace/dt_probe.h        |  1 +
 libdtrace/dt_prov_dtrace.c  |  6 +++---
 libdtrace/dt_prov_fbt.c     |  6 +++---
 libdtrace/dt_prov_profile.c | 24 +++++++++++-------------
 libdtrace/dt_prov_sdt.c     |  6 ++----
 libdtrace/dt_prov_syscall.c |  2 +-
 libdtrace/dt_provider.h     |  6 +++---
 9 files changed, 44 insertions(+), 29 deletions(-)

diff --git a/libdtrace/dt_open.c b/libdtrace/dt_open.c
index c9698564..669bd714 100644
--- a/libdtrace/dt_open.c
+++ b/libdtrace/dt_open.c
@@ -1168,6 +1168,8 @@ dtrace_close(dtrace_hdl_t *dtp)
 	if (dtp == NULL)
 		return;
 
+	dt_probe_detach(dtp);
+
 	dt_free(dtp, dtp->dt_conf.cpus);
 
 	if (dtp->dt_procs != NULL)
diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
index 0190975e..f08ebef3 100644
--- a/libdtrace/dt_probe.c
+++ b/libdtrace/dt_probe.c
@@ -510,8 +510,8 @@ dt_probe_destroy(dt_probe_t *prp)
 		dt_htab_delete(dtp->dt_byfqn, prp);
 	}
 
-	if (prp->prov && prp->prov->impl && prp->prov->impl->probe_fini)
-		prp->prov->impl->probe_fini(dtp, prp);
+	if (prp->prov && prp->prov->impl && prp->prov->impl->probe_destroy)
+		prp->prov->impl->probe_destroy(dtp, prp->prv_data);
 
 	dt_node_list_free(&prp->nargs);
 	dt_node_list_free(&prp->xargs);
@@ -1386,6 +1386,22 @@ dt_probe_init(dtrace_hdl_t *dtp)
 	dtp->dt_probe_id = 1;
 }
 
+void
+dt_probe_detach(dtrace_hdl_t *dtp)
+{
+	uint32_t	i;
+
+	for (i = 0; i < dtp->dt_probes_sz; i++) {
+		dt_probe_t	*prp = dtp->dt_probes[i];
+
+		if (prp == NULL)
+			continue;
+
+		if (prp->prov && prp->prov->impl && prp->prov->impl->detach)
+			prp->prov->impl->detach(dtp, prp);
+	}
+}
+
 void
 dt_probe_fini(dtrace_hdl_t *dtp)
 {
diff --git a/libdtrace/dt_probe.h b/libdtrace/dt_probe.h
index 2715413f..c69d1a04 100644
--- a/libdtrace/dt_probe.h
+++ b/libdtrace/dt_probe.h
@@ -91,6 +91,7 @@ extern int dt_probe_clause_iter(dtrace_hdl_t *dtp, dt_probe_t *prp,
 
 
 extern void dt_probe_init(dtrace_hdl_t *dtp);
+extern void dt_probe_detach(dtrace_hdl_t *dtp);
 extern void dt_probe_fini(dtrace_hdl_t *dtp);
 extern void dt_probe_stats(dtrace_hdl_t *dtp);
 
diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
index a5709d3c..7344a9df 100644
--- a/libdtrace/dt_prov_dtrace.c
+++ b/libdtrace/dt_prov_dtrace.c
@@ -349,11 +349,11 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
  * for some reason we are out of luck - fortunately it is not harmful to the
  * system as a whole.
  */
-static void probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
+static void detach(dtrace_hdl_t *dtp, const dt_probe_t *prp)
 {
 	int	fd;
 
-	tp_probe_fini(dtp, prp);
+	tp_detach(dtp, prp);
 
 	fd = open(UPROBE_EVENTS, O_WRONLY | O_APPEND);
 	if (fd == -1)
@@ -370,6 +370,6 @@ dt_provimpl_t	dt_dtrace = {
 	.trampoline	= &trampoline,
 	.attach		= &attach,
 	.probe_info	= &probe_info,
+	.detach		= &detach,
 	.probe_destroy	= &tp_probe_destroy,
-	.probe_fini	= &probe_fini,
 };
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index dd21369c..1f519039 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -301,11 +301,11 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
  * for some reason we are out of luck - fortunately it is not harmful to the
  * system as a whole.
  */
-static void probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
+static void detach(dtrace_hdl_t *dtp, const dt_probe_t *prp)
 {
 	int	fd;
 
-	tp_probe_fini(dtp, prp);
+	tp_detach(dtp, prp);
 
 	fd = open(KPROBE_EVENTS, O_WRONLY | O_APPEND);
 	if (fd == -1)
@@ -323,6 +323,6 @@ dt_provimpl_t	dt_fbt = {
 	.trampoline	= &trampoline,
 	.attach		= &attach,
 	.probe_info	= &probe_info,
+	.detach		= &detach,
 	.probe_destroy	= &tp_probe_destroy,
-	.probe_fini	= &probe_fini,
 };
diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
index 58cbf5f3..e4410155 100644
--- a/libdtrace/dt_prov_profile.c
+++ b/libdtrace/dt_prov_profile.c
@@ -320,15 +320,7 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	return 0;
 }
 
-static void probe_destroy(dtrace_hdl_t *dtp, void *arg)
-{
-	profile_probe_t	*datap = arg;
-
-	dt_free(dtp, datap->fds);
-	dt_free(dtp, datap);
-}
-
-static void probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
+static void detach(dtrace_hdl_t *dtp, const dt_probe_t *prp)
 {
 	profile_probe_t	*datap = prp->prv_data;
 	int		i;
@@ -338,18 +330,24 @@ static void probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
 		if (datap->fds[i] != -1)
 			close(datap->fds[i]);
 	}
+}
 
-	probe_destroy(dtp, datap);
+static void probe_destroy(dtrace_hdl_t *dtp, void *arg)
+{
+	profile_probe_t	*datap = arg;
+
+	dt_free(dtp, datap->fds);
+	dt_free(dtp, datap);
 }
 
 dt_provimpl_t	dt_profile = {
 	.name		= prvname,
 	.prog_type	= BPF_PROG_TYPE_PERF_EVENT,
 	.populate	= &populate,
-	.trampoline	= &trampoline,
-	.probe_info	= &probe_info,
 	.provide	= &provide,
+	.trampoline	= &trampoline,
 	.attach		= &attach,
+	.probe_info	= &probe_info,
+	.detach		= &detach,
 	.probe_destroy	= &probe_destroy,
-	.probe_fini	= &probe_fini,
 };
diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
index 88df4f9f..2512f9ec 100644
--- a/libdtrace/dt_prov_sdt.c
+++ b/libdtrace/dt_prov_sdt.c
@@ -313,7 +313,7 @@ void tp_probe_destroy(dtrace_hdl_t *dtp, void *datap)
  * Perform any provider specific cleanup for a probe that is being removed from
  * the framework.
  */
-void tp_probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
+void tp_detach(dtrace_hdl_t *dtp, const dt_probe_t *prp)
 {
 	tp_probe_t	*datap = prp->prv_data;
 
@@ -323,8 +323,6 @@ void tp_probe_fini(dtrace_hdl_t *dtp, const dt_probe_t *prp)
 	}
 
 	datap->event_id = -1;
-
-	tp_probe_destroy(dtp, datap);
 }
 
 /*
@@ -481,6 +479,6 @@ dt_provimpl_t	dt_sdt = {
 	.trampoline	= &trampoline,
 	.attach		= &tp_attach,
 	.probe_info	= &probe_info,
+	.detach		= &tp_detach,
 	.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 62e0b994..aa426990 100644
--- a/libdtrace/dt_prov_syscall.c
+++ b/libdtrace/dt_prov_syscall.c
@@ -236,6 +236,6 @@ dt_provimpl_t	dt_syscall = {
 	.trampoline	= &trampoline,
 	.attach		= &tp_attach,
 	.probe_info	= &probe_info,
+	.detach		= &tp_detach,
 	.probe_destroy	= &tp_probe_destroy,
-	.probe_fini	= &tp_probe_fini,
 };
diff --git a/libdtrace/dt_provider.h b/libdtrace/dt_provider.h
index e84707d0..8823ca52 100644
--- a/libdtrace/dt_provider.h
+++ b/libdtrace/dt_provider.h
@@ -67,10 +67,10 @@ typedef struct dt_provimpl {
 	int (*probe_info)(dtrace_hdl_t *dtp,	/* get probe info */
 			  const struct dt_probe *prp,
 			  int *argcp, dt_argdesc_t **argvp);
+	void (*detach)(dtrace_hdl_t *dtp,	/* probe cleanup */
+		       const struct dt_probe *prb);
 	void (*probe_destroy)(dtrace_hdl_t *dtp, /* free provider data */
 			      void *datap);
-	void (*probe_fini)(dtrace_hdl_t *dtp,	/* probe cleanup */
-			   const struct dt_probe *prb);
 } dt_provimpl_t;
 
 extern dt_provimpl_t dt_dtrace;
@@ -106,7 +106,7 @@ extern struct dt_probe *tp_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov,
 extern int tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip,
 			 tp_probe_t *datap, int *argcp, dt_argdesc_t **argvp);
 extern void tp_probe_destroy(dtrace_hdl_t *dtp, void *datap);
-extern void tp_probe_fini(dtrace_hdl_t *dtp, const struct dt_probe *prb);
+extern void tp_detach(dtrace_hdl_t *dtp, const struct dt_probe *prb);
 
 
 #define	DT_PROVIDER_INTF	0x1	/* provider interface declaration */
-- 
2.28.0




More information about the DTrace-devel mailing list