diff options
| -rw-r--r-- | tools/lib/bpf/Build | 2 | ||||
| -rw-r--r-- | tools/lib/bpf/libbpf.c | 20 | ||||
| -rw-r--r-- | tools/lib/bpf/str_error.c | 18 | ||||
| -rw-r--r-- | tools/lib/bpf/str_error.h | 6 |
4 files changed, 35 insertions, 11 deletions
diff --git a/tools/lib/bpf/Build b/tools/lib/bpf/Build index 13a861135127..6eb9bacd1948 100644 --- a/tools/lib/bpf/Build +++ b/tools/lib/bpf/Build | |||
| @@ -1 +1 @@ | |||
| libbpf-y := libbpf.o bpf.o nlattr.o btf.o libbpf_errno.o | libbpf-y := libbpf.o bpf.o nlattr.o btf.o libbpf_errno.o str_error.o | ||
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 2abd0f112627..bdb94939fd60 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include "libbpf.h" | 50 | #include "libbpf.h" |
| 51 | #include "bpf.h" | 51 | #include "bpf.h" |
| 52 | #include "btf.h" | 52 | #include "btf.h" |
| 53 | #include "str_error.h" | ||
| 53 | 54 | ||
| 54 | #ifndef EM_BPF | 55 | #ifndef EM_BPF |
| 55 | #define EM_BPF 247 | 56 | #define EM_BPF 247 |
| @@ -469,7 +470,7 @@ static int bpf_object__elf_init(struct bpf_object *obj) | |||
| 469 | obj->efile.fd = open(obj->path, O_RDONLY); | 470 | obj->efile.fd = open(obj->path, O_RDONLY); |
| 470 | if (obj->efile.fd < 0) { | 471 | if (obj->efile.fd < 0) { |
| 471 | char errmsg[STRERR_BUFSIZE]; | 472 | char errmsg[STRERR_BUFSIZE]; |
| 472 | char *cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 473 | char *cp = str_error(errno, errmsg, sizeof(errmsg)); |
| 473 | 474 | ||
| 474 | pr_warning("failed to open %s: %s\n", obj->path, cp); | 475 | pr_warning("failed to open %s: %s\n", obj->path, cp); |
| 475 | return -errno; | 476 | return -errno; |
| @@ -810,8 +811,7 @@ static int bpf_object__elf_collect(struct bpf_object *obj) | |||
| 810 | data->d_size, name, idx); | 811 | data->d_size, name, idx); |
| 811 | if (err) { | 812 | if (err) { |
| 812 | char errmsg[STRERR_BUFSIZE]; | 813 | char errmsg[STRERR_BUFSIZE]; |
| 813 | char *cp = strerror_r(-err, errmsg, | 814 | char *cp = str_error(-err, errmsg, sizeof(errmsg)); |
| 814 | sizeof(errmsg)); | ||
| 815 | 815 | ||
| 816 | pr_warning("failed to alloc program %s (%s): %s", | 816 | pr_warning("failed to alloc program %s (%s): %s", |
| 817 | name, obj->path, cp); | 817 | name, obj->path, cp); |
| @@ -1140,7 +1140,7 @@ bpf_object__create_maps(struct bpf_object *obj) | |||
| 1140 | 1140 | ||
| 1141 | *pfd = bpf_create_map_xattr(&create_attr); | 1141 | *pfd = bpf_create_map_xattr(&create_attr); |
| 1142 | if (*pfd < 0 && create_attr.btf_key_type_id) { | 1142 | if (*pfd < 0 && create_attr.btf_key_type_id) { |
| 1143 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1143 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
| 1144 | pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", | 1144 | pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", |
| 1145 | map->name, cp, errno); | 1145 | map->name, cp, errno); |
| 1146 | create_attr.btf_fd = 0; | 1146 | create_attr.btf_fd = 0; |
| @@ -1155,7 +1155,7 @@ bpf_object__create_maps(struct bpf_object *obj) | |||
| 1155 | size_t j; | 1155 | size_t j; |
| 1156 | 1156 | ||
| 1157 | err = *pfd; | 1157 | err = *pfd; |
| 1158 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1158 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
| 1159 | pr_warning("failed to create map (name: '%s'): %s\n", | 1159 | pr_warning("failed to create map (name: '%s'): %s\n", |
| 1160 | map->name, cp); | 1160 | map->name, cp); |
| 1161 | for (j = 0; j < i; j++) | 1161 | for (j = 0; j < i; j++) |
| @@ -1339,7 +1339,7 @@ load_program(enum bpf_prog_type type, enum bpf_attach_type expected_attach_type, | |||
| 1339 | } | 1339 | } |
| 1340 | 1340 | ||
| 1341 | ret = -LIBBPF_ERRNO__LOAD; | 1341 | ret = -LIBBPF_ERRNO__LOAD; |
| 1342 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1342 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
| 1343 | pr_warning("load bpf program failed: %s\n", cp); | 1343 | pr_warning("load bpf program failed: %s\n", cp); |
| 1344 | 1344 | ||
| 1345 | if (log_buf && log_buf[0] != '\0') { | 1345 | if (log_buf && log_buf[0] != '\0') { |
| @@ -1654,7 +1654,7 @@ static int check_path(const char *path) | |||
| 1654 | 1654 | ||
| 1655 | dir = dirname(dname); | 1655 | dir = dirname(dname); |
| 1656 | if (statfs(dir, &st_fs)) { | 1656 | if (statfs(dir, &st_fs)) { |
| 1657 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1657 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
| 1658 | pr_warning("failed to statfs %s: %s\n", dir, cp); | 1658 | pr_warning("failed to statfs %s: %s\n", dir, cp); |
| 1659 | err = -errno; | 1659 | err = -errno; |
| 1660 | } | 1660 | } |
| @@ -1690,7 +1690,7 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path, | |||
| 1690 | } | 1690 | } |
| 1691 | 1691 | ||
| 1692 | if (bpf_obj_pin(prog->instances.fds[instance], path)) { | 1692 | if (bpf_obj_pin(prog->instances.fds[instance], path)) { |
| 1693 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1693 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
| 1694 | pr_warning("failed to pin program: %s\n", cp); | 1694 | pr_warning("failed to pin program: %s\n", cp); |
| 1695 | return -errno; | 1695 | return -errno; |
| 1696 | } | 1696 | } |
| @@ -1708,7 +1708,7 @@ static int make_dir(const char *path) | |||
| 1708 | err = -errno; | 1708 | err = -errno; |
| 1709 | 1709 | ||
| 1710 | if (err) { | 1710 | if (err) { |
| 1711 | cp = strerror_r(-err, errmsg, sizeof(errmsg)); | 1711 | cp = str_error(-err, errmsg, sizeof(errmsg)); |
| 1712 | pr_warning("failed to mkdir %s: %s\n", path, cp); | 1712 | pr_warning("failed to mkdir %s: %s\n", path, cp); |
| 1713 | } | 1713 | } |
| 1714 | return err; | 1714 | return err; |
| @@ -1770,7 +1770,7 @@ int bpf_map__pin(struct bpf_map *map, const char *path) | |||
| 1770 | } | 1770 | } |
| 1771 | 1771 | ||
| 1772 | if (bpf_obj_pin(map->fd, path)) { | 1772 | if (bpf_obj_pin(map->fd, path)) { |
| 1773 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1773 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
| 1774 | pr_warning("failed to pin map: %s\n", cp); | 1774 | pr_warning("failed to pin map: %s\n", cp); |
| 1775 | return -errno; | 1775 | return -errno; |
| 1776 | } | 1776 | } |
diff --git a/tools/lib/bpf/str_error.c b/tools/lib/bpf/str_error.c new file mode 100644 index 000000000000..b8798114a357 --- /dev/null +++ b/tools/lib/bpf/str_error.c | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | // SPDX-License-Identifier: LGPL-2.1 | ||
| 2 | #undef _GNU_SOURCE | ||
| 3 | #include <string.h> | ||
| 4 | #include <stdio.h> | ||
| 5 | #include "str_error.h" | ||
| 6 | |||
| 7 | /* | ||
| 8 | * Wrapper to allow for building in non-GNU systems such as Alpine Linux's musl | ||
| 9 | * libc, while checking strerror_r() return to avoid having to check this in | ||
| 10 | * all places calling it. | ||
| 11 | */ | ||
| 12 | char *str_error(int err, char *dst, int len) | ||
| 13 | { | ||
| 14 | int ret = strerror_r(err, dst, len); | ||
| 15 | if (ret) | ||
| 16 | snprintf(dst, len, "ERROR: strerror_r(%d)=%d", err, ret); | ||
| 17 | return dst; | ||
| 18 | } | ||
diff --git a/tools/lib/bpf/str_error.h b/tools/lib/bpf/str_error.h new file mode 100644 index 000000000000..355b1db571d1 --- /dev/null +++ b/tools/lib/bpf/str_error.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | // SPDX-License-Identifier: LGPL-2.1 | ||
| 2 | #ifndef BPF_STR_ERROR | ||
| 3 | #define BPF_STR_ERROR | ||
| 4 | |||
| 5 | char *str_error(int err, char *dst, int len); | ||
| 6 | #endif // BPF_STR_ERROR | ||
