Commit 0d1e0269 authored by Alexei Starovoitov's avatar Alexei Starovoitov
Browse files

Merge branch 'bpftool: improve split BTF support'



Andrii Nakryiko says:

====================

Few follow up improvements to bpftool for split BTF support:
  - emit "name <anon>" for non-named BTFs in `bpftool btf show` command;
  - when dumping /sys/kernel/btf/<module> use /sys/kernel/btf/vmlinux as the
    base BTF, unless base BTF is explicitly specified with -B flag.

This patch set also adds btf__base_btf() getter to access base BTF of the
struct btf.
====================

Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parents 97306be4 fa452837
Loading
Loading
Loading
Loading
+23 −4
Original line number Diff line number Diff line
@@ -357,11 +357,13 @@ static int dump_btf_raw(const struct btf *btf,
			dump_btf_type(btf, root_type_ids[i], t);
		}
	} else {
		const struct btf *base;
		int cnt = btf__get_nr_types(btf);
		int start_id = 1;

		if (base_btf)
			start_id = btf__get_nr_types(base_btf) + 1;
		base = btf__base_btf(btf);
		if (base)
			start_id = btf__get_nr_types(base) + 1;

		for (i = start_id; i <= cnt; i++) {
			t = btf__type_by_id(btf, i);
@@ -428,7 +430,7 @@ static int dump_btf_c(const struct btf *btf,

static int do_dump(int argc, char **argv)
{
	struct btf *btf = NULL;
	struct btf *btf = NULL, *base = NULL;
	__u32 root_type_ids[2];
	int root_type_cnt = 0;
	bool dump_c = false;
@@ -502,7 +504,21 @@ static int do_dump(int argc, char **argv)
		}
		NEXT_ARG();
	} else if (is_prefix(src, "file")) {
		btf = btf__parse_split(*argv, base_btf);
		const char sysfs_prefix[] = "/sys/kernel/btf/";
		const char sysfs_vmlinux[] = "/sys/kernel/btf/vmlinux";

		if (!base_btf &&
		    strncmp(*argv, sysfs_prefix, sizeof(sysfs_prefix) - 1) == 0 &&
		    strcmp(*argv, sysfs_vmlinux) != 0) {
			base = btf__parse(sysfs_vmlinux, NULL);
			if (libbpf_get_error(base)) {
				p_err("failed to parse vmlinux BTF at '%s': %ld\n",
				      sysfs_vmlinux, libbpf_get_error(base));
				base = NULL;
			}
		}

		btf = btf__parse_split(*argv, base ?: base_btf);
		if (IS_ERR(btf)) {
			err = -PTR_ERR(btf);
			btf = NULL;
@@ -567,6 +583,7 @@ static int do_dump(int argc, char **argv)
done:
	close(fd);
	btf__free(btf);
	btf__free(base);
	return err;
}

@@ -750,6 +767,8 @@ show_btf_plain(struct bpf_btf_info *info, int fd,
		printf("name [%s]  ", name);
	else if (name && name[0])
		printf("name %s  ", name);
	else
		printf("name <anon>  ");
	printf("size %uB", info->btf_size);

	n = 0;
+5 −0
Original line number Diff line number Diff line
@@ -432,6 +432,11 @@ __u32 btf__get_nr_types(const struct btf *btf)
	return btf->start_id + btf->nr_types - 1;
}

const struct btf *btf__base_btf(const struct btf *btf)
{
	return btf->base_btf;
}

/* internal helper returning non-const pointer to a type */
static struct btf_type *btf_type_by_id(struct btf *btf, __u32 type_id)
{
+1 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ LIBBPF_API __s32 btf__find_by_name(const struct btf *btf,
LIBBPF_API __s32 btf__find_by_name_kind(const struct btf *btf,
					const char *type_name, __u32 kind);
LIBBPF_API __u32 btf__get_nr_types(const struct btf *btf);
LIBBPF_API const struct btf *btf__base_btf(const struct btf *btf);
LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
						  __u32 id);
LIBBPF_API size_t btf__pointer_size(const struct btf *btf);
+1 −0
Original line number Diff line number Diff line
@@ -340,6 +340,7 @@ LIBBPF_0.2.0 {

LIBBPF_0.3.0 {
	global:
		btf__base_btf;
		btf__parse_elf_split;
		btf__parse_raw_split;
		btf__parse_split;