2021-05-16 10:26:49

by Alejandro Colomar

[permalink] [raw]
Subject: Re: [PATCH v3] bpf.2: Use standard types and attributes

On 5/15/21 9:01 PM, Alejandro Colomar wrote:
> Some manual pages are already using C99 syntax for integral
> types 'uint32_t', but some aren't. There are some using kernel
> syntax '__u32'. Fix those.
>
> Both the kernel and the standard types are 100% binary compatible,
> and the source code differences between them are very small, and
> not important in a manual page:
>
> - Some of them are implemented with different underlying types
> (e.g., s64 is always long long, while int64_t may be long long
> or long, depending on the arch). This causes the following
> differences.
>
> - length modifiers required by printf are different, resulting in
> a warning ('-Wformat=').
>
> - pointer assignment causes a warning:
> ('-Wincompatible-pointer-types'), but there aren't any pointers
> in this page.
>
> But, AFAIK, all of those warnings can be safely ignored, due to
> the binary compatibility between the types.
>
> ...
>
> Some pages also document attributes, using GNU syntax
> '__attribute__((xxx))'. Update those to use the shorter and more
> portable C11 keywords such as 'alignas()' when possible, and C2x
> syntax '[[gnu::xxx]]' elsewhere, which hasn't been standardized
> yet, but is already implemented in GCC, and available through
> either --std=c2x or any of the --std=gnu... options.
>
> The standard isn't very clear on how to use alignas() or
> [[]]-style attributes, and the GNU documentation isn't better, so
> the following link is a useful experiment about the different
> alignment syntaxes:
> __attribute__((aligned())), alignas(), and [[gnu::aligned()]]:
> <https://stackoverflow.com/q/67271825/6872717>
>
> Signed-off-by: Alejandro Colomar <[email protected]>
Discussion:
<https://lore.kernel.org/linux-man/[email protected]/T/>
> Nacked-by: Alexei Starovoitov <[email protected]>
> Nacked-by: Greg Kroah-Hartman <[email protected]>
> Acked-by: Zack Weinberg <[email protected]>
> Cc: LKML <[email protected]>
> Cc: glibc <[email protected]>
> Cc: GCC <[email protected]>
> Cc: bpf <[email protected]>
> Cc: David Laight <[email protected]>
> Cc: Joseph Myers <[email protected]>
> Cc: Florian Weimer <[email protected]>
> Cc: Daniel Borkmann <[email protected]>
> ---
> man2/bpf.2 | 49 ++++++++++++++++++++++++-------------------------
> 1 file changed, 24 insertions(+), 25 deletions(-)
>
> diff --git a/man2/bpf.2 b/man2/bpf.2
> index 6e1ffa198..04b8fbcef 100644
> --- a/man2/bpf.2
> +++ b/man2/bpf.2
> @@ -186,41 +186,40 @@ commands:
> .PP
> .in +4n
> .EX
> -union bpf_attr {
> +union [[gnu::aligned(8)]] bpf_attr {
> struct { /* Used by BPF_MAP_CREATE */
> - __u32 map_type;
> - __u32 key_size; /* size of key in bytes */
> - __u32 value_size; /* size of value in bytes */
> - __u32 max_entries; /* maximum number of entries
> - in a map */
> + uint32_t map_type;
> + uint32_t key_size; /* size of key in bytes */
> + uint32_t value_size; /* size of value in bytes */
> + uint32_t max_entries; /* maximum number of entries
> + in a map */
> };
>
> - struct { /* Used by BPF_MAP_*_ELEM and BPF_MAP_GET_NEXT_KEY
> - commands */
> - __u32 map_fd;
> - __aligned_u64 key;
> + struct { /* Used by BPF_MAP_*_ELEM and BPF_MAP_GET_NEXT_KEY commands */
> + uint32_t map_fd;
> + uint64_t alignas(8) key;
> union {
> - __aligned_u64 value;
> - __aligned_u64 next_key;
> + uint64_t alignas(8) value;
> + uint64_t alignas(8) next_key;
> };
> - __u64 flags;
> + uint64_t flags;
> };
>
> struct { /* Used by BPF_PROG_LOAD */
> - __u32 prog_type;
> - __u32 insn_cnt;
> - __aligned_u64 insns; /* \(aqconst struct bpf_insn *\(aq */
> - __aligned_u64 license; /* \(aqconst char *\(aq */
> - __u32 log_level; /* verbosity level of verifier */
> - __u32 log_size; /* size of user buffer */
> - __aligned_u64 log_buf; /* user supplied \(aqchar *\(aq
> - buffer */
> - __u32 kern_version;
> - /* checked when prog_type=kprobe
> - (since Linux 4.1) */
> + uint32_t prog_type;
> + uint32_t insn_cnt;
> + uint64_t alignas(8) insns; /* \(aqconst struct bpf_insn *\(aq */
> + uint64_t alignas(8) license; /* \(aqconst char *\(aq */
> + uint32_t log_level; /* verbosity level of verifier */
> + uint32_t log_size; /* size of user buffer */
> + uint64_t alignas(8) log_buf; /* user supplied \(aqchar *\(aq
> + buffer */
> + uint32_t kern_version;
> + /* checked when prog_type=kprobe
> + (since Linux 4.1) */
> .\" commit 2541517c32be2531e0da59dfd7efc1ce844644f5
> };
> -} __attribute__((aligned(8)));
> +};
> .EE
> .in
> .\"
>


--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/


2021-05-19 01:10:22

by Daniel Borkmann

[permalink] [raw]
Subject: Re: [PATCH v3] bpf.2: Use standard types and attributes

On 5/16/21 11:16 AM, Alejandro Colomar (man-pages) wrote:
> On 5/15/21 9:01 PM, Alejandro Colomar wrote:
>> Some manual pages are already using C99 syntax for integral
>> types 'uint32_t', but some aren't.  There are some using kernel
>> syntax '__u32'.  Fix those.
>>
>> Both the kernel and the standard types are 100% binary compatible,
>> and the source code differences between them are very small, and
>> not important in a manual page:
>>
>> - Some of them are implemented with different underlying types
>>    (e.g., s64 is always long long, while int64_t may be long long
>>    or long, depending on the arch).  This causes the following
>>    differences.
>>
>> - length modifiers required by printf are different, resulting in
>>    a warning ('-Wformat=').
>>
>> - pointer assignment causes a warning:
>>    ('-Wincompatible-pointer-types'), but there aren't any pointers
>>    in this page.
>>
>> But, AFAIK, all of those warnings can be safely ignored, due to
>> the binary compatibility between the types.
>>
>> ...
>>
>> Some pages also document attributes, using GNU syntax
>> '__attribute__((xxx))'.  Update those to use the shorter and more
>> portable C11 keywords such as 'alignas()' when possible, and C2x
>> syntax '[[gnu::xxx]]' elsewhere, which hasn't been standardized
>> yet, but is already implemented in GCC, and available through
>> either --std=c2x or any of the --std=gnu... options.
>>
>> The standard isn't very clear on how to use alignas() or
>> [[]]-style attributes, and the GNU documentation isn't better, so
>> the following link is a useful experiment about the different
>> alignment syntaxes:
>> __attribute__((aligned())), alignas(), and [[gnu::aligned()]]:
>> <https://stackoverflow.com/q/67271825/6872717>
>>
>> Signed-off-by: Alejandro Colomar <[email protected]>
> Discussion: <https://lore.kernel.org/linux-man/[email protected]/T/>
>> Nacked-by: Alexei Starovoitov <[email protected]>
>> Nacked-by: Greg Kroah-Hartman <[email protected]>

You forgot to retain my ...

Nacked-by: Daniel Borkmann <[email protected]>

>> Acked-by: Zack Weinberg <[email protected]>
>> Cc: LKML <[email protected]>
>> Cc: glibc <[email protected]>
>> Cc: GCC <[email protected]>
>> Cc: bpf <[email protected]>
>> Cc: David Laight <[email protected]>
>> Cc: Joseph Myers <[email protected]>
>> Cc: Florian Weimer <[email protected]>
>> Cc: Daniel Borkmann <[email protected]>
>> ---
>>   man2/bpf.2 | 49 ++++++++++++++++++++++++-------------------------
>>   1 file changed, 24 insertions(+), 25 deletions(-)
>>

Subject: Re: [PATCH v3] bpf.2: Use standard types and attributes

Hello Daniel,

On 5/17/21 8:56 PM, Daniel Borkmann wrote:
> On 5/16/21 11:16 AM, Alejandro Colomar (man-pages) wrote:
>>>
>>> Signed-off-by: Alejandro Colomar <[email protected]>
>> Discussion:
>> <https://lore.kernel.org/linux-man/[email protected]/T/>
>>
>>> Nacked-by: Alexei Starovoitov <[email protected]>
>>> Nacked-by: Greg Kroah-Hartman <[email protected]>
>
> You forgot to retain my ...
>
> Nacked-by: Daniel Borkmann <[email protected]>

Yup! Sorry, I forgot :)

Thanks,

Alex

>
>>> Acked-by: Zack Weinberg <[email protected]>
>>> Cc: LKML <[email protected]>
>>> Cc: glibc <[email protected]>
>>> Cc: GCC <[email protected]>
>>> Cc: bpf <[email protected]>
>>> Cc: David Laight <[email protected]>
>>> Cc: Joseph Myers <[email protected]>
>>> Cc: Florian Weimer <[email protected]>
>>> Cc: Daniel Borkmann <[email protected]>
>>> ---
>>>   man2/bpf.2 | 49 ++++++++++++++++++++++++-------------------------
>>>   1 file changed, 24 insertions(+), 25 deletions(-)
>>>