All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Toke Høiland-Jørgensen" <toke@redhat.com>
To: Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Andrii Nakryiko <andriin@fb.com>, bpf <bpf@vger.kernel.org>,
	Networking <netdev@vger.kernel.org>,
	Alexei Starovoitov <ast@fb.com>, Kernel Team <kernel-team@fb.com>,
	Yonghong Song <yhs@fb.com>
Subject: Re: [PATCH v3 bpf-next 1/3] bpf: switch BPF UAPI #define constants used from BPF program side to enums
Date: Thu, 05 Mar 2020 11:50:32 +0100	[thread overview]
Message-ID: <87y2sf2hzb.fsf@toke.dk> (raw)
In-Reply-To: <c742d2d4-6596-3178-3d03-809270e67183@iogearbox.net>

Daniel Borkmann <daniel@iogearbox.net> writes:

> On 3/4/20 4:38 PM, Daniel Borkmann wrote:
>> On 3/4/20 10:37 AM, Toke Høiland-Jørgensen wrote:
>>> Andrii Nakryiko <andrii.nakryiko@gmail.com> writes:
>>>> On Tue, Mar 3, 2020 at 3:01 PM Daniel Borkmann <daniel@iogearbox.net> wrote:
>>>>>
>>>>> On 3/3/20 1:32 AM, Andrii Nakryiko wrote:
>>>>>> Switch BPF UAPI constants, previously defined as #define macro, to anonymous
>>>>>> enum values. This preserves constants values and behavior in expressions, but
>>>>>> has added advantaged of being captured as part of DWARF and, subsequently, BTF
>>>>>> type info. Which, in turn, greatly improves usefulness of generated vmlinux.h
>>>>>> for BPF applications, as it will not require BPF users to copy/paste various
>>>>>> flags and constants, which are frequently used with BPF helpers. Only those
>>>>>> constants that are used/useful from BPF program side are converted.
>>>>>>
>>>>>> Signed-off-by: Andrii Nakryiko <andriin@fb.com>
>>>>>
>>>>> Just thinking out loud, is there some way this could be resolved generically
>>>>> either from compiler side or via additional tooling where this ends up as BTF
>>>>> data and thus inside vmlinux.h as anon enum eventually? bpf.h is one single
>>>>> header and worst case libbpf could also ship a copy of it (?), but what about
>>>>> all the other things one would need to redefine e.g. for tracing? Small example
>>>>> that comes to mind are all these TASK_* defines in sched.h etc, and there's
>>>>> probably dozens of other similar stuff needed too depending on the particular
>>>>> case; would be nice to have some generic catch-all, hmm.
>>>>
>>>> Enum convertion seems to be the simplest and cleanest way,
>>>> unfortunately (as far as I know). DWARF has some extensions capturing
>>>> #defines, but values are strings (and need to be parsed, which is pain
>>>> already for "1 << 1ULL"), and it's some obscure extension, not a
>>>> standard thing. I agree would be nice not to have and change all UAPI
>>>> headers for this, but I'm not aware of the solution like that.
>>>
>>> Since this is a UAPI header, are we sure that no userspace programs are
>>> using these defines in #ifdefs or something like that?
>> 
>> Hm, yes, anyone doing #ifdefs on them would get build issues. Simple example:
>> 
>> enum {
>>          FOO = 42,
>> //#define FOO   FOO
>> };
>> 
>> #ifndef FOO
>> # warning "bar"
>> #endif
>> 
>> int main(int argc, char **argv)
>> {
>>          return FOO;
>> }
>> 
>> $ gcc -Wall -O2 foo.c
>> foo.c:7:3: warning: #warning "bar" [-Wcpp]
>>      7 | # warning "bar"
>>        |   ^~~~~~~
>> 
>> Commenting #define FOO FOO back in fixes it as we discussed in v2:
>> 
>> $ gcc -Wall -O2 foo.c
>> $
>> 
>> There's also a flag_enum attribute, but with the experiments I tried yesterday
>> night I couldn't get a warning to trigger for anonymous enums at least, so that
>> part should be ok.
>> 
>> I was about to push the series out, but agree that there may be a risk for #ifndefs
>> in the BPF C code. If we want to be on safe side, #define FOO FOO would be needed.
>
> I checked Cilium, LLVM, bcc, bpftrace code, and various others at least there it
> seems okay with the current approach, meaning no such if{,n}def seen that would
> cause a build warning. Also suricata seems to ship the BPF header itself. But
> iproute2 had the following in include/bpf_util.h:
>
> #ifndef BPF_PSEUDO_MAP_FD
> # define BPF_PSEUDO_MAP_FD      1
> #endif
>
> It's still not what was converted though. I would expect risk might be
> rather low.

OK, fair enough; thank you for checking :)

> Toke, is there anything on your side affected?

Nope, we're not #if-testing for any of the variables changed in this
patch in either xdp-tutorial or xdp-tools.

-Toke


  parent reply	other threads:[~2020-03-05 10:50 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-03  0:32 [PATCH v3 bpf-next 0/3] Convert BPF UAPI constants into enum values Andrii Nakryiko
2020-03-03  0:32 ` [PATCH v3 bpf-next 1/3] bpf: switch BPF UAPI #define constants used from BPF program side to enums Andrii Nakryiko
2020-03-03 23:01   ` Daniel Borkmann
2020-03-03 23:24     ` Andrii Nakryiko
2020-03-04  9:37       ` Toke Høiland-Jørgensen
2020-03-04 15:38         ` Daniel Borkmann
2020-03-04 15:50           ` Alexei Starovoitov
2020-03-04 16:03             ` Daniel Borkmann
2020-03-04 15:57           ` Daniel Borkmann
2020-03-04 16:02             ` Andrii Nakryiko
2020-03-04 16:07             ` Alexei Starovoitov
2020-03-05 10:50             ` Toke Høiland-Jørgensen [this message]
2020-06-02  5:31           ` Michael Forney
2020-06-02 19:17             ` Alexei Starovoitov
2020-06-02 21:40               ` Michael Forney
2020-06-02 23:07                 ` Alexei Starovoitov
2020-06-02 23:21                   ` Michael Forney
2020-06-02 23:36                     ` Alexei Starovoitov
2020-06-03 21:22                       ` Michael Forney
2020-03-03  0:32 ` [PATCH v3 bpf-next 2/3] libbpf: assume unsigned values for BTF_KIND_ENUM Andrii Nakryiko
2020-03-03  0:32 ` [PATCH v3 bpf-next 3/3] tools/runqslower: drop copy/pasted BPF_F_CURRENT_CPU definiton Andrii Nakryiko
2020-03-04 15:21 ` [PATCH v3 bpf-next 0/3] Convert BPF UAPI constants into enum values Daniel Borkmann
2020-03-04 15:34   ` 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=87y2sf2hzb.fsf@toke.dk \
    --to=toke@redhat.com \
    --cc=andrii.nakryiko@gmail.com \
    --cc=andriin@fb.com \
    --cc=ast@fb.com \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=kernel-team@fb.com \
    --cc=netdev@vger.kernel.org \
    --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.