diff options
author | Andrii Nakryiko <andriin@fb.com> | 2019-05-29 13:36:08 -0400 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-05-29 19:23:35 -0400 |
commit | fba01a0689a98613f5ee3b1569fd9321f3fde7bd (patch) | |
tree | 359d69754de209de08203f3f709d8a0a88528c56 /tools/lib/bpf/libbpf.c | |
parent | f102154d3158c8fe9713f03bd3492f9cb8409a5e (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.c | 13 |
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 | ||
2078 | retry_load: | 2079 | retry_load: |
2079 | log_buf = malloc(log_buf_size); | 2080 | log_buf = malloc(log_buf_size); |