[DTrace-devel] [PATCH] bpf, perf: helper functions should return -errno on failure
Kris Van Hees
kris.van.hees at oracle.com
Wed Nov 29 21:11:24 UTC 2023
The bpf() and perf_event_open() helper functions were returning -1 on
failure and callers were supposed to check errno. Since the only valid
values are >= 0, they now return -errno on failure so callers can just
check the return value rather than errno.
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_bpf.c | 29 ++++++++++++++++++-----------
libdtrace/dt_prov_rawtp.c | 4 ++--
libdtrace/dt_provider_tp.c | 2 +-
3 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index 6c9758a1..8034af48 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -31,14 +31,20 @@ int
perf_event_open(struct perf_event_attr *attr, pid_t pid,
int cpu, int group_fd, unsigned long flags)
{
- return syscall(__NR_perf_event_open, attr, pid, cpu, group_fd,
- flags | PERF_FLAG_FD_CLOEXEC);
+ int rc;
+
+ rc = syscall(__NR_perf_event_open, attr, pid, cpu, group_fd,
+ flags | PERF_FLAG_FD_CLOEXEC);
+ return rc >= 0 ? rc : -errno;
}
int
bpf(enum bpf_cmd cmd, union bpf_attr *attr)
{
- return syscall(__NR_bpf, cmd, attr, sizeof(union bpf_attr));
+ int rc;
+
+ rc = syscall(__NR_bpf, cmd, attr, sizeof(union bpf_attr));
+ return rc >= 0 ? rc : -errno;
}
static int
@@ -92,7 +98,7 @@ dt_bpf_prog_load(enum bpf_prog_type prog_type, const dtrace_difo_t *dp,
/* Syscall could return EAGAIN - try at most 5 times. */
do {
fd = bpf(BPF_PROG_LOAD, &attr);
- } while (fd < 0 && errno == EAGAIN && ++i < 5);
+ } while (fd == -EAGAIN && ++i < 5);
return fd;
}
@@ -143,7 +149,7 @@ dt_bpf_map_create_meta(enum bpf_map_type otype, const char *name,
ifd = bpf(BPF_MAP_CREATE, &attr);
if (ifd < 0)
- return -1;
+ return ifd;
/* Create the map-of-maps. */
memset(&attr, 0, sizeof(attr));
@@ -976,7 +982,7 @@ dt_bpf_load_prog(dtrace_hdl_t *dtp, const dt_probe_t *prp,
{
size_t logsz;
char *log;
- int rc, origerrno = 0;
+ int rc, origerr = 0;
const dtrace_probedesc_t *pdp = prp->desc;
char *p, *q;
@@ -996,7 +1002,7 @@ dt_bpf_load_prog(dtrace_hdl_t *dtp, const dt_probe_t *prp,
if (rc >= 0)
return rc;
- origerrno = errno;
+ origerr = -rc;
}
if (dtp->dt_options[DTRACEOPT_BPFLOGSIZE] != DTRACEOPT_UNSET)
@@ -1008,18 +1014,19 @@ dt_bpf_load_prog(dtrace_hdl_t *dtp, const dt_probe_t *prp,
rc = dt_bpf_prog_load(prp->prov->impl->prog_type, dp, 4 | 2 | 1,
log, logsz);
if (rc < 0) {
- char msg[64];
+ char msg[64];
+ int err = -rc;
snprintf(msg, sizeof(msg),
"BPF program load for '%s:%s:%s:%s' failed",
pdp->prv, pdp->mod, pdp->fun, pdp->prb);
- if (errno == EPERM)
+ if (err == EPERM)
return dt_bpf_lockmem_error(dtp, msg);
dt_bpf_error(dtp, "%s: %s\n", msg,
- strerror(origerrno ? origerrno : errno));
+ strerror(origerr ? origerr : err));
/* check whether we have an incomplete BPF log */
- if (errno == ENOSPC) {
+ if (err == ENOSPC) {
fprintf(stderr,
"BPF verifier log is incomplete and is not reported.\n"
"Set DTrace option 'bpflogsize' to some greater size for more output.\n"
diff --git a/libdtrace/dt_prov_rawtp.c b/libdtrace/dt_prov_rawtp.c
index 1ff0a311..24104dd5 100644
--- a/libdtrace/dt_prov_rawtp.c
+++ b/libdtrace/dt_prov_rawtp.c
@@ -181,11 +181,11 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
dif.dtdo_len = 2;
bpf_fd = dt_bpf_prog_load(dt_rawtp.prog_type, &dif, 0, NULL, 0);
- if (bpf_fd == -1)
+ if (bpf_fd < 0)
continue;
rtp_fd = dt_bpf_raw_tracepoint_open(prp->desc->prb, bpf_fd);
close(bpf_fd);
- if (rtp_fd == -1)
+ if (rtp_fd < 0)
continue;
close(rtp_fd);
break;
diff --git a/libdtrace/dt_provider_tp.c b/libdtrace/dt_provider_tp.c
index f3e03323..23766b2a 100644
--- a/libdtrace/dt_provider_tp.c
+++ b/libdtrace/dt_provider_tp.c
@@ -75,7 +75,7 @@ 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 -errno;
+ return fd;
tpp->event_fd = fd;
}
--
2.42.0
More information about the DTrace-devel
mailing list