BPF List
 help / color / mirror / Atom feed
From: Yonghong Song <yhs@fb.com>
To: Ilya Leoshkevich <iii@linux.ibm.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii@kernel.org>,
	Arnaldo Carvalho de Melo <acme@redhat.com>,
	John Fastabend <john.fastabend@gmail.com>
Cc: <bpf@vger.kernel.org>, Heiko Carstens <heiko.carstens@de.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>
Subject: Re: [PATCH v6 bpf-next 6/9] bpf: Add BTF_KIND_FLOAT support
Date: Thu, 25 Feb 2021 06:59:22 -0800	[thread overview]
Message-ID: <fbd33830-2f16-23a4-0c31-91bb4bd95ee4@fb.com> (raw)
In-Reply-To: <6962feb05a62d718e5d430f782012d71d6c73eed.camel@linux.ibm.com>



On 2/25/21 2:40 AM, Ilya Leoshkevich wrote:
> On Wed, 2021-02-24 at 23:10 -0800, Yonghong Song wrote:
>> On 2/24/21 3:45 PM, Ilya Leoshkevich wrote:
>>> On the kernel side, introduce a new btf_kind_operations. It is
>>> similar to that of BTF_KIND_INT, however, it does not need to
>>> handle encodings and bit offsets. Do not implement printing, since
>>> the kernel does not know how to format floating-point values.
>>>
>>> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
>>> ---
>>>    kernel/bpf/btf.c | 79
>>> ++++++++++++++++++++++++++++++++++++++++++++++--
>>>    1 file changed, 77 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
>>> index 2efeb5f4b343..c405edc8e615 100644
>>> --- a/kernel/bpf/btf.c
>>> +++ b/kernel/bpf/btf.c
> 
> [...]
> 
>>> @@ -1849,7 +1852,7 @@ static int btf_df_check_kflag_member(struct
>>> btf_verifier_env *env,
>>>          return -EINVAL;
>>>    }
>>>    
>>> -/* Used for ptr, array and struct/union type members.
>>> +/* Used for ptr, array struct/union and float type members.
>>>     * int, enum and modifier types have their specific callback
>>> functions.
>>>     */
>>>    static int btf_generic_check_kflag_member(struct btf_verifier_env
>>> *env,
>>> @@ -3675,6 +3678,77 @@ static const struct btf_kind_operations
>>> datasec_ops = {
>>>          .show                   = btf_datasec_show,
>>>    };
>>>    
>>> +static s32 btf_float_check_meta(struct btf_verifier_env *env,
>>> +                               const struct btf_type *t,
>>> +                               u32 meta_left)
>>> +{
>>> +       if (btf_type_vlen(t)) {
>>> +               btf_verifier_log_type(env, t, "vlen != 0");
>>> +               return -EINVAL;
>>> +       }
>>> +
>>> +       if (btf_type_kflag(t)) {
>>> +               btf_verifier_log_type(env, t, "Invalid btf_info
>>> kind_flag");
>>> +               return -EINVAL;
>>> +       }
>>> +
>>> +       if (t->size != 2 && t->size != 4 && t->size != 8 && t->size
>>> != 12 &&
>>> +           t->size != 16) {
>>> +               btf_verifier_log_type(env, t, "Invalid type_size");
>>> +               return -EINVAL;
>>> +       }
>>> +
>>> +       btf_verifier_log_type(env, t, NULL);
>>> +
>>> +       return 0;
>>> +}
>>> +
>>> +static int btf_float_check_member(struct btf_verifier_env *env,
>>> +                                 const struct btf_type
>>> *struct_type,
>>> +                                 const struct btf_member *member,
>>> +                                 const struct btf_type
>>> *member_type)
>>> +{
>>> +       u64 start_offset_bytes;
>>> +       u64 end_offset_bytes;
>>> +       u64 misalign_bits;
>>> +       u64 align_bytes;
>>> +       u64 align_bits;
>>> +
>>> +       align_bytes = min_t(u64, sizeof(void *), member_type-
>>>> size);
>>
>> I listed the following possible (size, align) pairs:
>>       size     x86_32 align_bytes   x86_64 align bytes
>>        2        2                    2
>>        4        4                    4
>>        8        4                    8
>>        12       4                    8
>>        16       4                    8
>>
>> A few observations.
>>     1. I don't know, just want to confirm, for double, the alignment
>> could be 4 (for a member) on 32bit system, is that right?
>>     2. for size 12, alignment will be 8 for x86_64 system, this is
>> strange, not sure whether it is true or not. Or size 12 cannot be
>> on x86_64 and we should error out if sizeof(void *) is 8.
> 
> 1 - Yes.
> 
> 2 - On x86_64 long double is 16 bytes and the required alignment is 16
> bytes too. However, on other architectures all this might be different.
> For example, for us long double is 16 bytes too, but the alignment can
> be 8. So can we be somewhat lax here and just allow smaller alignments,
> instead of trying to figure out what exactly each supported
> architecture does?

Maybe this is fine. I think, "float" is also the first BTF type whose
validation may have a dependence on underlying architecture. For 
example, member offset 4, type size 8, will be okay on x86_32,
but not okay on x84_64. That means BTF cannot be independently
validated without considering underlying architecture.

I am not against this patch. Maybe float is special. Maybe it is
okay since float is rarely used. I would like to see other people's
opinion.

> 
> [...]
>>
> 

  reply	other threads:[~2021-02-25 15:01 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-24 23:45 [PATCH v6 bpf-next 0/9] Add BTF_KIND_FLOAT support Ilya Leoshkevich
2021-02-24 23:45 ` [PATCH v6 bpf-next 1/9] bpf: Add BTF_KIND_FLOAT to uapi Ilya Leoshkevich
2021-02-24 23:45 ` [PATCH v6 bpf-next 2/9] libbpf: Fix whitespace in btf_add_composite() comment Ilya Leoshkevich
2021-02-24 23:45 ` [PATCH v6 bpf-next 3/9] libbpf: Add BTF_KIND_FLOAT support Ilya Leoshkevich
2021-02-26  1:30   ` John Fastabend
2021-02-26  5:26     ` Yonghong Song
2021-02-26  1:57   ` John Fastabend
2021-02-24 23:45 ` [PATCH v6 bpf-next 4/9] tools/bpftool: " Ilya Leoshkevich
2021-02-25  6:29   ` Yonghong Song
2021-02-24 23:45 ` [PATCH v6 bpf-next 5/9] selftests/bpf: Use the 25th bit in the "invalid BTF_INFO" test Ilya Leoshkevich
2021-02-25  6:31   ` Yonghong Song
2021-02-24 23:45 ` [PATCH v6 bpf-next 6/9] bpf: Add BTF_KIND_FLOAT support Ilya Leoshkevich
2021-02-25  7:10   ` Yonghong Song
2021-02-25 10:40     ` Ilya Leoshkevich
2021-02-25 14:59       ` Yonghong Song [this message]
2021-02-26  1:53         ` John Fastabend
2021-02-26  5:43           ` Yonghong Song
2021-02-24 23:45 ` [PATCH v6 bpf-next 7/9] selftest/bpf: Add BTF_KIND_FLOAT tests Ilya Leoshkevich
2021-02-24 23:51   ` Ilya Leoshkevich
2021-02-26  2:01   ` John Fastabend
2021-02-24 23:45 ` [PATCH v6 bpf-next 8/9] selftests/bpf: Add BTF_KIND_FLOAT to the existing deduplication tests Ilya Leoshkevich
2021-02-24 23:45 ` [PATCH v6 bpf-next 9/9] 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=fbd33830-2f16-23a4-0c31-91bb4bd95ee4@fb.com \
    --to=yhs@fb.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=iii@linux.ibm.com \
    --cc=john.fastabend@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox