[DTrace-devel] [PATCH 7/7] Report an error to the consumer if a probe cannot be enabled

Kris Van Hees kris.van.hees at oracle.com
Tue Dec 6 21:50:38 UTC 2022


Some probes (esp. uprobes) appear to be useable, but yet the kernel
tracing subsystem reports a failure when trying to enable the probe.
It need not be a fatal error (esp. when probing a set of probes based
on a wildcard specification), but it should get reported.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_bpf.c         | 20 +++++++++++++++++---
 libdtrace/dt_provider_tp.c |  4 ++--
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index 92cbc4ed..a9536511 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -1044,7 +1044,8 @@ dt_bpf_load_progs(dtrace_hdl_t *dtp, uint_t cflags)
 	 */
 	for (prp = dt_list_next(&dtp->dt_enablings); prp != NULL;
 	     prp = dt_list_next(prp)) {
-		int		fd;
+		int	fd;
+		int	rc = -1;
 
 		/* Already done. */
 		if (prp == dtp->dt_error)
@@ -1070,9 +1071,22 @@ dt_bpf_load_progs(dtrace_hdl_t *dtp, uint_t cflags)
 
 		dt_difo_free(dtp, dp);
 
-		if (!prp->prov->impl->attach ||
-		    prp->prov->impl->attach(dtp, prp, fd) < 0)
+		if (prp->prov->impl->attach)
+		    rc = prp->prov->impl->attach(dtp, prp, fd);
+
+		if (rc == -ENOTSUPP) {
+			char	*s;
+
+			if (asprintf(&s, "Failed to enable %s:%s:%s:%s",
+				     prp->desc->prv, prp->desc->mod,
+				     prp->desc->fun, prp->desc->prb) == -1)
+				return dt_set_errno(dtp, EDT_ENABLING_ERR);
+			dt_handle_rawerr(dtp, s);
+			free(s);
+		} else if (rc < 0) {
+			close(fd);
 			return dt_set_errno(dtp, EDT_ENABLING_ERR);
+		}
 	}
 
 	return 0;
diff --git a/libdtrace/dt_provider_tp.c b/libdtrace/dt_provider_tp.c
index fdd7f9c5..7388bb94 100644
--- a/libdtrace/dt_provider_tp.c
+++ b/libdtrace/dt_provider_tp.c
@@ -74,13 +74,13 @@ dt_tp_attach(dtrace_hdl_t *dtp, tp_probe_t *tpp, int bpf_fd)
 
 		fd = perf_event_open(&attr, -1, 0, -1, 0);
 		if (fd < 0)
-			return dt_set_errno(dtp, errno);
+			return -errno;
 
 		tpp->event_fd = fd;
 	}
 
 	if (ioctl(tpp->event_fd, PERF_EVENT_IOC_SET_BPF, bpf_fd) < 0)
-		return dt_set_errno(dtp, errno);
+		return -errno;
 
 	return 0;
 }
-- 
2.37.2




More information about the DTrace-devel mailing list