aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib/bpf/libbpf.c
diff options
context:
space:
mode:
authorAndrii Nakryiko <andriin@fb.com>2019-05-29 13:36:08 -0400
committerDaniel Borkmann <daniel@iogearbox.net>2019-05-29 19:23:35 -0400
commitfba01a0689a98613f5ee3b1569fd9321f3fde7bd (patch)
tree359d69754de209de08203f3f709d8a0a88528c56 /tools/lib/bpf/libbpf.c
parentf102154d3158c8fe9713f03bd3492f9cb8409a5e (diff)
libbpf: use negative fd to specify missing BTF
0 is a valid FD, so it's better to initialize it to -1, as is done in other places. Also, technically, BTF type ID 0 is valid (it's a VOID type), so it's more reliable to check btf_fd, instead of btf_key_type_id, to determine if there is any BTF associated with a map. Acked-by: Song Liu <songliubraving@fb.com> Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'tools/lib/bpf/libbpf.c')
-rw-r--r--tools/lib/bpf/libbpf.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 9f421206d3e7..b43913fc8b1b 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -1751,7 +1751,7 @@ bpf_object__create_maps(struct bpf_object *obj)
1751 create_attr.key_size = def->key_size; 1751 create_attr.key_size = def->key_size;
1752 create_attr.value_size = def->value_size; 1752 create_attr.value_size = def->value_size;
1753 create_attr.max_entries = def->max_entries; 1753 create_attr.max_entries = def->max_entries;
1754 create_attr.btf_fd = 0; 1754 create_attr.btf_fd = -1;
1755 create_attr.btf_key_type_id = 0; 1755 create_attr.btf_key_type_id = 0;
1756 create_attr.btf_value_type_id = 0; 1756 create_attr.btf_value_type_id = 0;
1757 if (bpf_map_type__is_map_in_map(def->type) && 1757 if (bpf_map_type__is_map_in_map(def->type) &&
@@ -1765,11 +1765,11 @@ bpf_object__create_maps(struct bpf_object *obj)
1765 } 1765 }
1766 1766
1767 *pfd = bpf_create_map_xattr(&create_attr); 1767 *pfd = bpf_create_map_xattr(&create_attr);
1768 if (*pfd < 0 && create_attr.btf_key_type_id) { 1768 if (*pfd < 0 && create_attr.btf_fd >= 0) {
1769 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); 1769 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
1770 pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", 1770 pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n",
1771 map->name, cp, errno); 1771 map->name, cp, errno);
1772 create_attr.btf_fd = 0; 1772 create_attr.btf_fd = -1;
1773 create_attr.btf_key_type_id = 0; 1773 create_attr.btf_key_type_id = 0;
1774 create_attr.btf_value_type_id = 0; 1774 create_attr.btf_value_type_id = 0;
1775 map->btf_key_type_id = 0; 1775 map->btf_key_type_id = 0;
@@ -2053,6 +2053,9 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt,
2053 char *log_buf; 2053 char *log_buf;
2054 int ret; 2054 int ret;
2055 2055
2056 if (!insns || !insns_cnt)
2057 return -EINVAL;
2058
2056 memset(&load_attr, 0, sizeof(struct bpf_load_program_attr)); 2059 memset(&load_attr, 0, sizeof(struct bpf_load_program_attr));
2057 load_attr.prog_type = prog->type; 2060 load_attr.prog_type = prog->type;
2058 load_attr.expected_attach_type = prog->expected_attach_type; 2061 load_attr.expected_attach_type = prog->expected_attach_type;
@@ -2063,7 +2066,7 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt,
2063 load_attr.license = license; 2066 load_attr.license = license;
2064 load_attr.kern_version = kern_version; 2067 load_attr.kern_version = kern_version;
2065 load_attr.prog_ifindex = prog->prog_ifindex; 2068 load_attr.prog_ifindex = prog->prog_ifindex;
2066 load_attr.prog_btf_fd = prog->btf_fd >= 0 ? prog->btf_fd : 0; 2069 load_attr.prog_btf_fd = prog->btf_fd;
2067 load_attr.func_info = prog->func_info; 2070 load_attr.func_info = prog->func_info;
2068 load_attr.func_info_rec_size = prog->func_info_rec_size; 2071 load_attr.func_info_rec_size = prog->func_info_rec_size;
2069 load_attr.func_info_cnt = prog->func_info_cnt; 2072 load_attr.func_info_cnt = prog->func_info_cnt;
@@ -2072,8 +2075,6 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt,
2072 load_attr.line_info_cnt = prog->line_info_cnt; 2075 load_attr.line_info_cnt = prog->line_info_cnt;
2073 load_attr.log_level = prog->log_level; 2076 load_attr.log_level = prog->log_level;
2074 load_attr.prog_flags = prog->prog_flags; 2077 load_attr.prog_flags = prog->prog_flags;
2075 if (!load_attr.insns || !load_attr.insns_cnt)
2076 return -EINVAL;
2077 2078
2078retry_load: 2079retry_load:
2079 log_buf = malloc(log_buf_size); 2080 log_buf = malloc(log_buf_size);