Re: [PATCH bpf-next] tools/resolve_btfids: Warn when having multiple IDs for single type
From: Andrii Nakryiko <hidden>
Date: 2021-01-05 21:16:46
Also in:
bpf
On Tue, Jan 5, 2021 at 7:41 AM Jiri Olsa [off-list ref] wrote:
The kernel image can contain multiple types (structs/unions) with the same name. This causes distinct type hierarchies in BTF data and makes resolve_btfids fail with error like: BTFIDS vmlinux FAILED unresolved symbol udp6_sock as reported by Qais Yousef [1]. This change adds warning when multiple types of the same name are detected: BTFIDS vmlinux WARN: multiple IDs found for 'file' (526, 113351) WARN: multiple IDs found for 'sk_buff' (2744, 113958) We keep the lower ID for the given type instance and let the build continue. [1] https://lore.kernel.org/lkml/20201229151352.6hzmjvu3qh6p2qgg@e107158-lin/ (local) Reported-by: Qais Yousef <redacted> Signed-off-by: Jiri Olsa <jolsa@kernel.org> ---
see comments below, but otherwise lgtm Acked-by: Andrii Nakryiko <andrii@kernel.org>
quoted hunk ↗ jump to hunk
tools/bpf/resolve_btfids/main.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c index e3ea569ee125..36a3b1024cdc 100644 --- a/tools/bpf/resolve_btfids/main.c +++ b/tools/bpf/resolve_btfids/main.c@@ -139,6 +139,8 @@ int eprintf(int level, int var, const char *fmt, ...) #define pr_debug2(fmt, ...) pr_debugN(2, pr_fmt(fmt), ##__VA_ARGS__) #define pr_err(fmt, ...) \ eprintf(0, verbose, pr_fmt(fmt), ##__VA_ARGS__) +#define pr_info(fmt, ...) \ + eprintf(0, verbose, pr_fmt(fmt), ##__VA_ARGS__)
how is it different from pr_err? Did you forget to update verboseness levels or it's intentional?
quoted hunk ↗ jump to hunk
static bool is_btf_id(const char *name) {@@ -526,8 +528,13 @@ static int symbols_resolve(struct object *obj) id = btf_id__find(root, str); if (id) { - id->id = type_id; - (*nr)--; + if (id->id) { + pr_info("WARN: multiple IDs found for '%s' (%d, %d)\n", + str, id->id, type_id); + } else { + id->id = type_id; + (*nr)--;
btw, there is a nasty shadowing of nr variable, which is used both for the for() loop condition (as int) and as `int *` inside the loop body. It's better to rename inner (or outer) nr, it's extremely confusing as is.
+ }
}
}
--
2.26.2