[DTrace-devel] [PATCH 01/04] cc: allow probe_info failures to report an error

Kris Van Hees kris.van.hees at oracle.com
Wed Nov 22 15:49:48 UTC 2023


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

diff --git a/cmd/dtrace.c b/cmd/dtrace.c
index e7ca9e4c..2827819f 100644
--- a/cmd/dtrace.c
+++ b/cmd/dtrace.c
@@ -417,8 +417,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;
 }
diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index 6c9758a1..816d1b1f 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -56,7 +56,7 @@ dt_bpf_error(dtrace_hdl_t *dtp, const char *fmt, ...)
 	return dt_set_errno(dtp, EDT_BPF);
 }
 
-static int
+int
 dt_bpf_lockmem_error(dtrace_hdl_t *dtp, const char *msg)
 {
 	return dt_bpf_error(dtp, "%s:\n"
diff --git a/libdtrace/dt_bpf.h b/libdtrace/dt_bpf.h
index 0fee533b..924345bd 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;
 
@@ -59,6 +60,7 @@ extern int dt_bpf_map_lookup_inner(int fd, const void *okey, const void *ikey,
 				   void *val);
 extern int dt_bpf_map_update_inner(int fd, const void *okey, const void *ikey,
 				   const void *val);
+extern int dt_bpf_lockmem_error(dtrace_hdl_t *dtp, const char *msg);
 extern int dt_bpf_prog_load(enum bpf_prog_type prog_type,
 			    const dtrace_difo_t *dp, uint32_t log_level,
 			    char *log_buf, size_t log_buf_sz);
diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
index a42109f1..5bfedc54 100644
--- a/libdtrace/dt_cc.c
+++ b/libdtrace/dt_cc.c
@@ -306,7 +306,8 @@ dt_setcontext(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
 			"match any probes\n", pdp->prv, pdp->mod, pdp->fun,
 			pdp->prb);
 	}
-
+	if (err == EDT_BPF)
+		longjmp(yypcb->pcb_jmpbuf, err);
 	if (err != EDT_NOPROBE && err != EDT_UNSTABLE && err != 0)
 		xyerror(D_PDESC_INVAL, "%s\n", dtrace_errmsg(dtp, err));
 
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.39.3




More information about the DTrace-devel mailing list