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

Eugene Loh eugene.loh at oracle.com
Tue Dec 6 23:00:11 UTC 2022


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
One question below:

On 12/6/22 16:50, Kris Van Hees via DTrace-devel wrote:
> 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);

Should there also be a close(fd) here?

> +		} 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;
>   }



More information about the DTrace-devel mailing list