[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