All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <olsajiri@gmail.com>
To: Daniel Xu <dxu@dxuuu.xyz>
Cc: Viktor Malik <vmalik@redhat.com>,
	bpf@vger.kernel.org, Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii@kernel.org>,
	Martin KaFai Lau <martin.lau@linux.dev>,
	Eduard Zingerman <eddyz87@gmail.com>, Song Liu <song@kernel.org>,
	Yonghong Song <yonghong.song@linux.dev>,
	John Fastabend <john.fastabend@gmail.com>,
	KP Singh <kpsingh@kernel.org>,
	Stanislav Fomichev <sdf@google.com>, Hao Luo <haoluo@google.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Alexey Dobriyan <adobriyan@gmail.com>,
	Kumar Kartikeya Dwivedi <memxor@gmail.com>
Subject: Re: [PATCH bpf-next v2 2/2] tools/resolve_btfids: fix cross-compilation to non-host endianness
Date: Sat, 3 Feb 2024 21:17:14 +0100	[thread overview]
Message-ID: <Zb6fSielrjHy2nnt@krava> (raw)
In-Reply-To: <vjbvcxsbtz7mrwevvcb3i4sf7hv5ah6iyjyzg7awr4iuiimryv@wjkglqsk6wee>

On Fri, Feb 02, 2024 at 06:38:18PM -0700, Daniel Xu wrote:
> Hi Viktor,
> 
> On Wed, Jan 31, 2024 at 05:24:09PM +0100, Viktor Malik wrote:
> > The .BTF_ids section is pre-filled with zeroed BTF ID entries during the
> > build and afterwards patched by resolve_btfids with correct values.
> > Since resolve_btfids always writes in host-native endianness, it relies
> > on libelf to do the translation when the target ELF is cross-compiled to
> > a different endianness (this was introduced in commit 61e8aeda9398
> > ("bpf: Fix libelf endian handling in resolv_btfids")).
> > 
> > Unfortunately, the translation will corrupt the flags fields of SET8
> > entries because these were written during vmlinux compilation and are in
> > the correct endianness already. This will lead to numerous selftests
> > failures such as:
> > 
> >     $ sudo ./test_verifier 502 502
> >     #502/p sleepable fentry accept FAIL
> >     Failed to load prog 'Invalid argument'!
> >     bpf_fentry_test1 is not sleepable
> >     verification time 34 usec
> >     stack depth 0
> >     processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
> >     Summary: 0 PASSED, 0 SKIPPED, 1 FAILED
> > 
> > Since it's not possible to instruct libelf to translate just certain
> > values, let's manually bswap the flags in resolve_btfids when needed, so
> > that libelf then translates everything correctly.
> > 
> > Fixes: ef2c6f370a63 ("tools/resolve_btfids: Add support for 8-byte BTF sets")
> > Signed-off-by: Viktor Malik <vmalik@redhat.com>
> > ---
> >  tools/bpf/resolve_btfids/main.c | 27 ++++++++++++++++++++++++++-
> >  1 file changed, 26 insertions(+), 1 deletion(-)
> > 
> > diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c
> > index 7badf1557e5c..d01603ef6283 100644
> > --- a/tools/bpf/resolve_btfids/main.c
> > +++ b/tools/bpf/resolve_btfids/main.c
> > @@ -652,13 +652,23 @@ static int sets_patch(struct object *obj)
> >  	Elf_Data *data = obj->efile.idlist;
> >  	int *ptr = data->d_buf;
> >  	struct rb_node *next;
> > +	GElf_Ehdr ehdr;
> > +	int need_bswap;
> > +
> > +	if (gelf_getehdr(obj->efile.elf, &ehdr) == NULL) {
> > +		pr_err("FAILED cannot get ELF header: %s\n",
> > +			elf_errmsg(-1));
> > +		return -1;
> > +	}
> > +	need_bswap = (__BYTE_ORDER == __LITTLE_ENDIAN) !=
> > +		     (ehdr.e_ident[EI_DATA] == ELFDATA2LSB);
> >  
> >  	next = rb_first(&obj->sets);
> >  	while (next) {
> >  		unsigned long addr, idx;
> >  		struct btf_id *id;
> >  		void *base;
> > -		int cnt, size;
> > +		int cnt, size, i;
> >  
> >  		id   = rb_entry(next, struct btf_id, rb_node);
> >  		addr = id->addr[0];
> > @@ -686,6 +696,21 @@ static int sets_patch(struct object *obj)
> >  			base = set8->pairs;
> >  			cnt = set8->cnt;
> >  			size = sizeof(set8->pairs[0]);
> > +
> > +			/*
> > +			 * When ELF endianness does not match endianness of the
> > +			 * host, libelf will do the translation when updating
> > +			 * the ELF. This, however, corrupts SET8 flags which are
> > +			 * already in the target endianness. So, let's bswap
> > +			 * them to the host endianness and libelf will then
> > +			 * correctly translate everything.
> > +			 */
> > +			if (need_bswap) {
> > +				for (i = 0; i < cnt; i++) {
> > +					set8->pairs[i].flags =
> > +						bswap_32(set8->pairs[i].flags);
> > +				}
> 
> Do we need this for btf_id_set8:flags as well? Didn't get a chance to
> look too deeply yet.

ah did not this, right, looks like we need that

jirka

      parent reply	other threads:[~2024-02-03 20:17 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-31 16:24 [PATCH bpf-next v2 0/2] tools/resolve_btfids: fix cross-compilation to non-host endianness Viktor Malik
2024-01-31 16:24 ` [PATCH bpf-next v2 1/2] tools/resolve_btfids: Refactor set sorting with types from btf_ids.h Viktor Malik
2024-02-01 15:51   ` Daniel Borkmann
2024-02-02  9:55     ` Viktor Malik
2024-02-02 13:06   ` Jiri Olsa
2024-02-05  5:42     ` Viktor Malik
2024-01-31 16:24 ` [PATCH bpf-next v2 2/2] tools/resolve_btfids: fix cross-compilation to non-host endianness Viktor Malik
2024-02-01 16:36   ` Daniel Borkmann
2024-02-02  9:59     ` Viktor Malik
2024-02-03  1:38   ` Daniel Xu
2024-02-03 18:48     ` Manu Bretelle
2024-02-05  5:40       ` Viktor Malik
2024-02-03 20:17     ` Jiri Olsa [this message]

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=Zb6fSielrjHy2nnt@krava \
    --to=olsajiri@gmail.com \
    --cc=adobriyan@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=dxu@dxuuu.xyz \
    --cc=eddyz87@gmail.com \
    --cc=haoluo@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=kpsingh@kernel.org \
    --cc=martin.lau@linux.dev \
    --cc=memxor@gmail.com \
    --cc=sdf@google.com \
    --cc=song@kernel.org \
    --cc=vmalik@redhat.com \
    --cc=yonghong.song@linux.dev \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.