Commit 68b08647 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov

libbpf: Detect minimal BTF support and skip BTF loading, if missing

Detect whether a kernel supports any BTF at all, and if not, don't even
attempt loading BTF to avoid unnecessary log messages like:

  libbpf: Error loading BTF: Invalid argument(22)
  libbpf: Error loading .BTF into kernel: -22. BTF is optional, ignoring.
Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200818213356.2629020-8-andriin@fb.com
parent 70785cfb
...@@ -170,6 +170,8 @@ enum kern_feature_id { ...@@ -170,6 +170,8 @@ enum kern_feature_id {
FEAT_PROG_NAME, FEAT_PROG_NAME,
/* v5.2: kernel support for global data sections. */ /* v5.2: kernel support for global data sections. */
FEAT_GLOBAL_DATA, FEAT_GLOBAL_DATA,
/* BTF support */
FEAT_BTF,
/* BTF_KIND_FUNC and BTF_KIND_FUNC_PROTO support */ /* BTF_KIND_FUNC and BTF_KIND_FUNC_PROTO support */
FEAT_BTF_FUNC, FEAT_BTF_FUNC,
/* BTF_KIND_VAR and BTF_KIND_DATASEC support */ /* BTF_KIND_VAR and BTF_KIND_DATASEC support */
...@@ -2533,6 +2535,15 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj) ...@@ -2533,6 +2535,15 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)
if (!obj->btf) if (!obj->btf)
return 0; return 0;
if (!kernel_supports(FEAT_BTF)) {
if (kernel_needs_btf(obj)) {
err = -EOPNOTSUPP;
goto report;
}
pr_debug("Kernel doesn't support BTF, skipping uploading it.\n");
return 0;
}
sanitize = btf_needs_sanitization(obj); sanitize = btf_needs_sanitization(obj);
if (sanitize) { if (sanitize) {
const void *raw_data; const void *raw_data;
...@@ -2558,6 +2569,7 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj) ...@@ -2558,6 +2569,7 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)
} }
btf__free(kern_btf); btf__free(kern_btf);
} }
report:
if (err) { if (err) {
btf_mandatory = kernel_needs_btf(obj); btf_mandatory = kernel_needs_btf(obj);
pr_warn("Error loading .BTF into kernel: %d. %s\n", err, pr_warn("Error loading .BTF into kernel: %d. %s\n", err,
...@@ -3502,6 +3514,18 @@ static int probe_kern_global_data(void) ...@@ -3502,6 +3514,18 @@ static int probe_kern_global_data(void)
return probe_fd(ret); return probe_fd(ret);
} }
static int probe_kern_btf(void)
{
static const char strs[] = "\0int";
__u32 types[] = {
/* int */
BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4),
};
return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types),
strs, sizeof(strs)));
}
static int probe_kern_btf_func(void) static int probe_kern_btf_func(void)
{ {
static const char strs[] = "\0int\0x\0a"; static const char strs[] = "\0int\0x\0a";
...@@ -3633,6 +3657,9 @@ static struct kern_feature_desc { ...@@ -3633,6 +3657,9 @@ static struct kern_feature_desc {
[FEAT_GLOBAL_DATA] = { [FEAT_GLOBAL_DATA] = {
"global variables", probe_kern_global_data, "global variables", probe_kern_global_data,
}, },
[FEAT_BTF] = {
"minimal BTF", probe_kern_btf,
},
[FEAT_BTF_FUNC] = { [FEAT_BTF_FUNC] = {
"BTF functions", probe_kern_btf_func, "BTF functions", probe_kern_btf_func,
}, },
......
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