[DTrace-devel] [PATCH v2 01/04] probe: propagate dt_probe_args_info() failures to dt_probe_info()

Kris Van Hees kris.van.hees at oracle.com
Thu Nov 30 15:59:01 UTC 2023


Failures in dt_probe_args_info() were ignored by dt_probe_info() and
that could lead to strange behaviour.  E.g. if lockmem issues cause
the logic in the raw tracepoint argument count determination to fail,
the probe was reported as not having any arguments.  This patch will
make it possible to add code to accurately report such failures
rather than silently ignoring them.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 cmd/dtrace.c         | 16 ++++++++++++----
 libdtrace/dt_bpf.h   |  1 +
 libdtrace/dt_probe.c | 22 +++++++++++++---------
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/cmd/dtrace.c b/cmd/dtrace.c
index e7ca9e4c..9c820686 100644
--- a/cmd/dtrace.c
+++ b/cmd/dtrace.c
@@ -323,6 +323,8 @@ info_stmt(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
 
 	if (dtrace_probe_info(dtp, pdp, &p) == 0)
 		print_probe_info(&p);
+	else
+		return -1;
 
 	*last = edp;
 	return 0;
@@ -417,8 +419,12 @@ list_probe(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp, void *arg)
 	oprintf("%5d %10s %17s %33s %s\n",
 		pdp->id, pdp->prv, pdp->mod, pdp->fun, pdp->prb);
 
-	if (g_verbose && dtrace_probe_info(dtp, pdp, &p) == 0)
-		print_probe_info(&p);
+	if (g_verbose) {
+		if (dtrace_probe_info(dtp, pdp, &p) == 0)
+			print_probe_info(&p);
+		else
+			return -1;
+	}
 
 	return 0;
 }
@@ -1426,8 +1432,10 @@ main(int argc, char *argv[])
 		for (i = 0; i < g_cmdc; i++)
 			list_prog(&g_cmdv[i]);
 
-		if (g_cmdc == 0)
-			dtrace_probe_iter(g_dtp, NULL, list_probe, NULL);
+		if (g_cmdc == 0) {
+			if (dtrace_probe_iter(g_dtp, NULL, list_probe, NULL) < 0)
+				dfatal(NULL); /* dtrace_errmsg() only */
+		}
 
 		dtrace_close(g_dtp);
 		return g_status;
diff --git a/libdtrace/dt_bpf.h b/libdtrace/dt_bpf.h
index 0fee533b..125a250d 100644
--- a/libdtrace/dt_bpf.h
+++ b/libdtrace/dt_bpf.h
@@ -12,6 +12,7 @@
 #include <linux/bpf.h>
 #include <linux/perf_event.h>
 #include <dtrace/difo.h>
+#include <dt_impl.h>
 
 struct dtrace_hdl;
 
diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
index 93266ff7..7da30ddb 100644
--- a/libdtrace/dt_probe.c
+++ b/libdtrace/dt_probe.c
@@ -881,25 +881,26 @@ dt_probe_delete(dtrace_hdl_t *dtp, dt_probe_t *prp)
 	/* FIXME: Add cleanup code for the dt_probe_t itself. */
 }
 
-static void
+static int
 dt_probe_args_info(dtrace_hdl_t *dtp, dt_probe_t *prp)
 {
 	int			argc = 0;
 	dt_argdesc_t		*argv = NULL;
-	int			i, nc, xc;
+	int			rc, i, nc, xc;
 	dtrace_typeinfo_t	dtt;
 
 	/* Only retrieve probe argument information once per probe. */
 	if (prp->argc != -1)
-		return;
+		return 0;
 	if (!prp->prov->impl->probe_info)
-		return;
-	if (prp->prov->impl->probe_info(dtp, prp, &argc, &argv) < 0)
-		return;
+		return 0;
+	rc = prp->prov->impl->probe_info(dtp, prp, &argc, &argv);
+	if (rc == -1)
+		return rc;
 
 	if (!argc || !argv) {
 		prp->argc = 0;
-		return;
+		return 0;
 	}
 
 	nc = 0;
@@ -915,7 +916,7 @@ dt_probe_args_info(dtrace_hdl_t *dtp, dt_probe_t *prp)
 	dt_probe_alloc_args(prp, nc, xc);
 
 	if ((xc != 0 && prp->xargs == NULL) || (nc != 0 && prp->nargs == NULL))
-		return;
+		return 0;
 
 	/*
 	 * Iterate over the arguments and assign their types to prp->nargv[],
@@ -964,6 +965,8 @@ dt_probe_args_info(dtrace_hdl_t *dtp, dt_probe_t *prp)
 	}
 
 	dt_free(dtp, argv);
+
+	return 0;
 }
 
 /*ARGSUSED*/
@@ -1066,7 +1069,8 @@ dt_probe_info(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
 	if (!n_is_glob)
 		pip->dtp_attr = dt_attr_min(pip->dtp_attr, pap->dtpa_name);
 
-	dt_probe_args_info(dtp, prp);
+	if (dt_probe_args_info(dtp, prp) == -1)
+		return NULL;
 
 	pip->dtp_arga = pap->dtpa_args;
 	pip->dtp_argv = prp->argv;
-- 
2.42.0




More information about the DTrace-devel mailing list