Commit e55d54f4 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Daniel Borkmann

libbpf: fix check for presence of associated BTF for map creation

Kernel internally checks that either key or value type ID is specified,
before using btf_fd. Do the same in libbpf's map creation code for
determining when to retry map creation w/o BTF.
Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Fixes: fba01a06 ("libbpf: use negative fd to specify missing BTF")
Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent cabd3e88
...@@ -1736,7 +1736,7 @@ bpf_object__create_maps(struct bpf_object *obj) ...@@ -1736,7 +1736,7 @@ bpf_object__create_maps(struct bpf_object *obj)
create_attr.key_size = def->key_size; create_attr.key_size = def->key_size;
create_attr.value_size = def->value_size; create_attr.value_size = def->value_size;
create_attr.max_entries = def->max_entries; create_attr.max_entries = def->max_entries;
create_attr.btf_fd = -1; create_attr.btf_fd = 0;
create_attr.btf_key_type_id = 0; create_attr.btf_key_type_id = 0;
create_attr.btf_value_type_id = 0; create_attr.btf_value_type_id = 0;
if (bpf_map_type__is_map_in_map(def->type) && if (bpf_map_type__is_map_in_map(def->type) &&
...@@ -1750,11 +1750,12 @@ bpf_object__create_maps(struct bpf_object *obj) ...@@ -1750,11 +1750,12 @@ bpf_object__create_maps(struct bpf_object *obj)
} }
*pfd = bpf_create_map_xattr(&create_attr); *pfd = bpf_create_map_xattr(&create_attr);
if (*pfd < 0 && create_attr.btf_fd >= 0) { if (*pfd < 0 && (create_attr.btf_key_type_id ||
create_attr.btf_value_type_id)) {
cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n",
map->name, cp, errno); map->name, cp, errno);
create_attr.btf_fd = -1; create_attr.btf_fd = 0;
create_attr.btf_key_type_id = 0; create_attr.btf_key_type_id = 0;
create_attr.btf_value_type_id = 0; create_attr.btf_value_type_id = 0;
map->btf_key_type_id = 0; map->btf_key_type_id = 0;
...@@ -2045,7 +2046,7 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, ...@@ -2045,7 +2046,7 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt,
load_attr.license = license; load_attr.license = license;
load_attr.kern_version = kern_version; load_attr.kern_version = kern_version;
load_attr.prog_ifindex = prog->prog_ifindex; load_attr.prog_ifindex = prog->prog_ifindex;
load_attr.prog_btf_fd = prog->btf_fd; load_attr.prog_btf_fd = prog->btf_fd >= 0 ? prog->btf_fd : 0;
load_attr.func_info = prog->func_info; load_attr.func_info = prog->func_info;
load_attr.func_info_rec_size = prog->func_info_rec_size; load_attr.func_info_rec_size = prog->func_info_rec_size;
load_attr.func_info_cnt = prog->func_info_cnt; load_attr.func_info_cnt = prog->func_info_cnt;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment