netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: John Fastabend <john.fastabend@gmail.com>
To: Andrii Nakryiko <andrii@kernel.org>,
	bpf@vger.kernel.org, netdev@vger.kernel.org, ast@fb.com,
	daniel@iogearbox.net
Cc: andrii@kernel.org, kernel-team@fb.com
Subject: RE: [PATCH v5 bpf-next 05/14] libbpf: add kernel module BTF support for CO-RE relocations
Date: Wed, 02 Dec 2020 21:30:20 -0800	[thread overview]
Message-ID: <5fc877ec37f7d_1123e208e8@john-XPS-13-9370.notmuch> (raw)
In-Reply-To: <20201203035204.1411380-6-andrii@kernel.org>

Andrii Nakryiko wrote:
> Teach libbpf to search for candidate types for CO-RE relocations across kernel
> modules BTFs, in addition to vmlinux BTF. If at least one candidate type is
> found in vmlinux BTF, kernel module BTFs are not iterated. If vmlinux BTF has
> no matching candidates, then find all kernel module BTFs and search for all
> matching candidates across all of them.
> 
> Kernel's support for module BTFs are inferred from the support for BTF name
> pointer in BPF UAPI.
> 
> Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
> ---
  
small typo and missing close maybe? Otherwise,

Acked-by: John Fastabend <john.fastabend@gmail.com>

> +static int load_module_btfs(struct bpf_object *obj)
> +{
> +	struct bpf_btf_info info;
> +	struct module_btf *mod_btf;
> +	struct btf *btf;
> +	char name[64];
> +	__u32 id = 0, len;
> +	int err, fd;
> +
> +	if (obj->btf_modules_loaded)
> +		return 0;
> +
> +	/* don't do this again, even if we find no module BTFs */

I wonder a bit if we might load modules at some point and want
to then run this, but I wouldn't worry about it. Its likely
easy enough to just reload or delay load until module is in place.

> +	obj->btf_modules_loaded = true;
> +
> +	/* kernel too old to support module BTFs */
> +	if (!kernel_supports(FEAT_MODULE_BTF))
> +		return 0;
> +
> +	while (true) {
> +		err = bpf_btf_get_next_id(id, &id);
> +		if (err && errno == ENOENT)
> +			return 0;
> +		if (err) {
> +			err = -errno;
> +			pr_warn("failed to iterate BTF objects: %d\n", err);
> +			return err;
> +		}
> +
> +		fd = bpf_btf_get_fd_by_id(id);
> +		if (fd < 0) {
> +			if (errno == ENOENT)
> +				continue; /* expected race: BTF was unloaded */
> +			err = -errno;
> +			pr_warn("failed to get BTF object #%d FD: %d\n", id, err);
> +			return err;
> +		}
> +
> +		len = sizeof(info);
> +		memset(&info, 0, sizeof(info));
> +		info.name = ptr_to_u64(name);
> +		info.name_len = sizeof(name);
> +
> +		err = bpf_obj_get_info_by_fd(fd, &info, &len);
> +		if (err) {

do we also need to close(fd) here? If not then we don't need the close in xsk.c
I guess.

> +			err = -errno;
> +			pr_warn("failed to get BTF object #%d info: %d\n", id, err);
> +			return err;
> +		}
> +
> +		/* ignore non-module BTFs */
> +		if (!info.kernel_btf || strcmp(name, "vmlinux") == 0) {
> +			close(fd);
> +			continue;
> +		}
> +
> +		btf = btf_get_from_fd(fd, obj->btf_vmlinux);
> +		close(fd);
> +		if (IS_ERR(btf)) {
> +			pr_warn("failed to load module [%s]'s BTF object #%d: %ld\n",
> +				name, id, PTR_ERR(btf));
> +			return PTR_ERR(btf);
> +		}
> +
> +		err = btf_ensure_mem((void **)&obj->btf_modules, &obj->btf_module_cap,
> +				     sizeof(*obj->btf_modules), obj->btf_module_cnt + 1);
> +		if (err)
> +			return err;
> +
> +		mod_btf = &obj->btf_modules[obj->btf_module_cnt++];
> +
> +		mod_btf->btf = btf;
> +		mod_btf->id = id;
> +		mod_btf->name = strdup(name);
> +		if (!mod_btf->name)
> +			return -ENOMEM;
> +	}
> +
> +	return 0;
> +}
> +
>  static struct core_cand_list *
>  bpf_core_find_cands(struct bpf_object *obj, const struct btf *local_btf, __u32 local_type_id)
>  {
>  	struct core_cand local_cand = {};
>  	struct core_cand_list *cands;
> +	const struct btf *main_btf;
>  	size_t local_essent_len;
> -	int err;
> +	int err, i;
>  
>  	local_cand.btf = local_btf;
>  	local_cand.t = btf__type_by_id(local_btf, local_type_id);
> @@ -4697,15 +4824,38 @@ bpf_core_find_cands(struct bpf_object *obj, const struct btf *local_btf, __u32 l
>  		return ERR_PTR(-ENOMEM);
>  
>  	/* Attempt to find target candidates in vmlinux BTF first */
> -	err = bpf_core_add_cands(&local_cand, local_essent_len,
> -				 obj->btf_vmlinux_override ?: obj->btf_vmlinux,
> -				 "vmlinux", 1, cands);
> -	if (err) {
> -		bpf_core_free_cands(cands);
> -		return ERR_PTR(err);
> +	main_btf = obj->btf_vmlinux_override ?: obj->btf_vmlinux;
> +	err = bpf_core_add_cands(&local_cand, local_essent_len, main_btf, "vmlinux", 1, cands);
> +	if (err)
> +		goto err_out;
> +
> +	/* if vmlinux BTF has any candidate, don't got for module BTFs */

small typo: don't got for -> don't go for

> +	if (cands->len)
> +		return cands;
> +
> +	/* if vmlinux BTF was overridden, don't attempt to load module BTFs */
> +	if (obj->btf_vmlinux_override)
> +		return cands;
> +
> +	/* now look through module BTFs, trying to still find candidates */
> +	err = load_module_btfs(obj);
> +	if (err)
> +		goto err_out;
> +
> +	for (i = 0; i < obj->btf_module_cnt; i++) {
> +		err = bpf_core_add_cands(&local_cand, local_essent_len,
> +					 obj->btf_modules[i].btf,
> +					 obj->btf_modules[i].name,
> +					 btf__get_nr_types(obj->btf_vmlinux) + 1,
> +					 cands);
> +		if (err)
> +			goto err_out;
>  	}
>  
>  	return cands;
> +err_out:
> +	bpf_core_free_cands(cands);
> +	return ERR_PTR(err);
>  }
>  

  reply	other threads:[~2020-12-03  5:31 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-03  3:51 [PATCH v5 bpf-next 00/14] Support BTF-powered BPF tracing programs for kernel modules Andrii Nakryiko
2020-12-03  3:51 ` [PATCH v5 bpf-next 01/14] bpf: fix bpf_put_raw_tracepoint()'s use of __module_address() Andrii Nakryiko
2020-12-03  4:36   ` John Fastabend
2020-12-03  3:51 ` [PATCH v5 bpf-next 02/14] bpf: keep module's btf_data_size intact after load Andrii Nakryiko
2020-12-03  3:51 ` [PATCH v5 bpf-next 03/14] libbpf: add internal helper to load BTF data by FD Andrii Nakryiko
2020-12-03  4:51   ` John Fastabend
2020-12-03  3:51 ` [PATCH v5 bpf-next 04/14] libbpf: refactor CO-RE relocs to not assume a single BTF object Andrii Nakryiko
2020-12-03  5:11   ` John Fastabend
2020-12-03  3:51 ` [PATCH v5 bpf-next 05/14] libbpf: add kernel module BTF support for CO-RE relocations Andrii Nakryiko
2020-12-03  5:30   ` John Fastabend [this message]
2020-12-03  5:38     ` Andrii Nakryiko
2020-12-03  3:51 ` [PATCH v5 bpf-next 06/14] selftests/bpf: add bpf_testmod kernel module for testing Andrii Nakryiko
2020-12-03  3:51 ` [PATCH v5 bpf-next 07/14] selftests/bpf: add support for marking sub-tests as skipped Andrii Nakryiko
2020-12-03  3:51 ` [PATCH v5 bpf-next 08/14] selftests/bpf: add CO-RE relocs selftest relying on kernel module BTF Andrii Nakryiko
2020-12-03  3:51 ` [PATCH v5 bpf-next 09/14] bpf: remove hard-coded btf_vmlinux assumption from BPF verifier Andrii Nakryiko
2020-12-03  6:13   ` kernel test robot
2020-12-03  6:32   ` kernel test robot
2020-12-03  3:52 ` [PATCH v5 bpf-next 10/14] bpf: allow to specify kernel module BTFs when attaching BPF programs Andrii Nakryiko
2020-12-03  3:52 ` [PATCH v5 bpf-next 11/14] libbpf: factor out low-level BPF program loading helper Andrii Nakryiko
2020-12-03  3:52 ` [PATCH v5 bpf-next 12/14] libbpf: support attachment of BPF tracing programs to kernel modules Andrii Nakryiko
2020-12-03  3:52 ` [PATCH v5 bpf-next 13/14] selftests/bpf: add tp_btf CO-RE reloc test for modules Andrii Nakryiko
2020-12-03  3:52 ` [PATCH v5 bpf-next 14/14] selftests/bpf: add fentry/fexit/fmod_ret selftest for kernel module Andrii Nakryiko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5fc877ec37f7d_1123e208e8@john-XPS-13-9370.notmuch \
    --to=john.fastabend@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@fb.com \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=kernel-team@fb.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).