All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ilya Leoshkevich <iii@linux.ibm.com>
To: John Fastabend <john.fastabend@gmail.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii@kernel.org>, Yonghong Song <yhs@fb.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: bpf@vger.kernel.org, Heiko Carstens <heiko.carstens@de.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>
Subject: Re: [PATCH bpf-next 2/6] libbpf: Add BTF_KIND_FLOAT support
Date: Thu, 18 Feb 2021 14:57:52 +0100	[thread overview]
Message-ID: <91f2dfab7e124c5edef515b18af30aed111d2a0a.camel@linux.ibm.com> (raw)
In-Reply-To: <602dc2574df18_182c3208c0@john-XPS-13-9370.notmuch>

On Wed, 2021-02-17 at 17:26 -0800, John Fastabend wrote:
> Ilya Leoshkevich wrote:
> > On Wed, 2021-02-17 at 13:12 -0800, John Fastabend wrote:
> > > John Fastabend wrote:
> > > > Ilya Leoshkevich wrote:
> > > > > The logic follows that of BTF_KIND_INT most of the time.
> > > > > Sanitization
> > > > > replaces BTF_KIND_FLOATs with equally-sized BTF_KIND_INTs on
> > > > > older
> > > >                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > > > Does this match the code though?
> > > > 
> > > > > kernels.
> > > > > 
> > > > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> > > > > ---
> > > > 
> > > > [...]
> > > > 
> > > > 
> > > > > @@ -2445,6 +2450,9 @@ static void
> > > > > bpf_object__sanitize_btf(struct
> > > > > bpf_object *obj, struct btf *btf)
> > > > >                 } else if (!has_func_global &&
> > > > > btf_is_func(t)) {
> > > > >                         /* replace BTF_FUNC_GLOBAL with
> > > > > BTF_FUNC_STATIC */
> > > > >                         t->info = BTF_INFO_ENC(BTF_KIND_FUNC,
> > > > > 0,
> > > > > 0);
> > > > > +               } else if (!has_float && btf_is_float(t)) {
> > > > > +                       /* replace FLOAT with INT */
> > > > > +                       t->info =
> > > > > BTF_INFO_ENC(BTF_KIND_FLOAT, 0,
> > > > > 0);
> > > > 
> > > > Do we also need to encode the vlen here?
> > > 
> > > Sorry typo on my side, 't->size = ?' is what I was trying to
> > > point
> > > out.
> > > Looks like its set in the other case where we replace VAR with
> > > INT.
> > 
> > The idea is to have the size of the INT equal to the size of the
> > FLOAT
> > that it replaces. I guess we can't do the same for VARs, because
> > they
> > don't have the size field, and if we don't have DATASECs, then we
> > can't
> > find the size of a VAR at all.
> > 
> 
> Right, but KINT_INT has some extra constraints that don't appear to
> be in
> place for KIND_FLOAT. For example meta_check includes max size check.
> We
> should check these when libbpf does conversion as well? Otherwise
> kernel
> is going to give us an error that will be a bit hard to understand.

Yeah, apparently floats can have non-power-of-2 sizes, which kills the
idea with such a replacement. Maybe we should do exactly the same thing
as we do for VARs after all.

> Also what I am I missing here. I use the writers to build a float,
> 
>  btf__add_float(btf, "new_float", 8);
> 
> This will create the btf_type struct approximately like this,
> 
>  btf_type t {
>    .name = name_off; // points at my name
>    .info = btf_type_info(BTF_KIND_FLOAT, 0, 0);
>    .size = 8
>  };
> 
> But if I create an int_type with btf__add_int(btf, "net_int", 8); I
> will
> get a btf_type + __u32. When we do the conversion how do we skip the 
> extra u32 setup?
> 
>  *(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8);
> 
> Should we set this up on the conversion as well? Otherwise later
> steps
> might try to read the __u32 piece to find some arbitrary memory?

Ah, you are absolutely right. I was hoping that e.g. btf_get_raw_data()
would clean that up, but turns out it doesn't do that. Seems like I'll
have to implement this myself.


  reply	other threads:[~2021-02-18 16:51 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-16  1:12 [PATCH bpf-next 0/6] Add BTF_KIND_FLOAT support Ilya Leoshkevich
2021-02-16  1:12 ` [PATCH bpf-next 1/6] bpf: Add BTF_KIND_FLOAT to uapi Ilya Leoshkevich
2021-02-16  1:12 ` [PATCH bpf-next 2/6] libbpf: Add BTF_KIND_FLOAT support Ilya Leoshkevich
2021-02-17 20:58   ` John Fastabend
2021-02-17 21:12     ` John Fastabend
2021-02-17 21:28       ` Ilya Leoshkevich
2021-02-18  1:26         ` John Fastabend
2021-02-18 13:57           ` Ilya Leoshkevich [this message]
2021-02-18  6:58   ` Yonghong Song
2021-02-18 13:41     ` Ilya Leoshkevich
2021-02-18 17:39       ` Yonghong Song
2021-02-18  7:16   ` Yonghong Song
2021-02-18 13:34     ` Ilya Leoshkevich
2021-02-18 17:29       ` Yonghong Song
2021-02-16  1:12 ` [PATCH bpf-next 3/6] tools/bpftool: " Ilya Leoshkevich
2021-02-16  1:12 ` [PATCH bpf-next 4/6] bpf: " Ilya Leoshkevich
2021-02-18  7:13   ` Yonghong Song
2021-02-16  1:12 ` [PATCH bpf-next 5/6] selftest/bpf: Add BTF_KIND_FLOAT tests Ilya Leoshkevich
2021-02-16  1:12 ` [PATCH bpf-next 6/6] bpf: Document BTF_KIND_FLOAT in btf.rst Ilya Leoshkevich

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=91f2dfab7e124c5edef515b18af30aed111d2a0a.camel@linux.ibm.com \
    --to=iii@linux.ibm.com \
    --cc=acme@redhat.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=gor@linux.ibm.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=john.fastabend@gmail.com \
    --cc=yhs@fb.com \
    /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.