Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp1660911pxa; Thu, 6 Aug 2020 12:44:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx9K3RV5YfhozWAS7qqUzIxYDrjD5YbUR2/DC1OA1E0UNpzNCA9HebES6WnpyydhJZbmmZP X-Received: by 2002:aa7:ce90:: with SMTP id y16mr5681618edv.325.1596743054326; Thu, 06 Aug 2020 12:44:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596743054; cv=none; d=google.com; s=arc-20160816; b=bgLaYFXVQZR2ZA7K4Evtqnd6PayIRAnY+gmidaoBTtr6fk7OTm8z2N/iaC0Lh/9rSy C5HBz4kF+KMJVyT6QxStBjqf+CcXRk68UmCEeug1ivCSXt+iGZWxcJ0+cWuZQtJPk5AO vFo9rjb8l5fljStgB4p0YU9I7sPfc4NjVRDDkZU8Uyhez8Sty6RrbOwerSUJXjDLJTJ1 yBKN5Uvon2yY/WnAFSW0STplkpkBUuDwkSkgGTyc12j7vQXYIk3JGmUQcsURbFiqNnzm 40mtGpbSYFwz2RLLzyPCPNu5q181ljsgITSn4QXqvLY7jaIPCKEkvc/dhvmj3lFI6gl6 5gcg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=B55at2MY1UjEpBI5B3pKYwGObqRHcFxLkRJnPd4G/eY=; b=agzUzAbnKcz1tr8DWdAI2Cn3gdVgd7h8+PVIFnVUD9qxyi8JsIY45fTDGBiVevugtk AU/P6t6pK7CMbyfM9P2tthTcCir0hdkfWYmwawIH33Vh9YNhpwd415wTAHSDerB/mF9J c6eqdbCOkTaaNQSSO5TgWt1miZNlDLkH5HKcaAidfQHTqBEFF43aUBu7qwlMN4cIJVgu PKR0jLk7B+8yZaZhhsQsF4fTigiIZDqKGqBEcbZ2dHTbioT78VQlNwg991v7zff5HWoW nkssWjNalpBiMwVFbtgz1HySwDSuGjMy3eygsX6/X9QT1svOu53yA5l51p8uNebTAvU0 8nDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="N/UqYwRm"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m10si3689147eds.471.2020.08.06.12.43.51; Thu, 06 Aug 2020 12:44:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="N/UqYwRm"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726209AbgHFTmd (ORCPT + 99 others); Thu, 6 Aug 2020 15:42:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41810 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726159AbgHFTmc (ORCPT ); Thu, 6 Aug 2020 15:42:32 -0400 Received: from mail-wm1-x342.google.com (mail-wm1-x342.google.com [IPv6:2a00:1450:4864:20::342]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDB5AC061575 for ; Thu, 6 Aug 2020 12:42:31 -0700 (PDT) Received: by mail-wm1-x342.google.com with SMTP id k8so10792675wma.2 for ; Thu, 06 Aug 2020 12:42:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=B55at2MY1UjEpBI5B3pKYwGObqRHcFxLkRJnPd4G/eY=; b=N/UqYwRmic2bK4NJHIjfDFDV+Lf3mVfv9AF3Uo7z7iDy53LTwHfiS6RFqu2VtVU8PI uKMrmL+/u+PN+q8J4iIZfzYuEaNe0LXRw65UJcAX/ub5ulMmVHyigT+750VclFT8izxz RRp1Dx3mXO/5wvmFyJJ+foU3tMqQhg/DGOrdFPO1Tt6OtX8/HFBM/cE/NcnjfUv2szja PFA5zLxZkqpITkvIWp7IBsLU/fSK2/GXChRT+ua69J70VGxkf9yGtz+k7yWVHPyPvtVK VSdqWRrfcFp7OVnAwmYPCYji0C5avFJJ4Vnp9+tV142HaenW1H0hVIzuCbkY3hWlgnGI sdmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=B55at2MY1UjEpBI5B3pKYwGObqRHcFxLkRJnPd4G/eY=; b=f1AqvLtF9GQpdPiiaUrhozHVwSSB+zXXEuSRxOyEZpWtvJhiZLkJ+SYFXEFqPzedro 1aXb8tonwCqaV2vYxsLDnOzguKu9RBI7jEBljpF1Q1lC4bTHHnIdmgl6hOTdCStvDC5M KnIz8SxOGvFgebO44C3uZ7qCq5VYdzFGx/PBHEfTdXaqFV/pSkXSMKkXlKZAKQgdpwLu 2n8qy7yTJCIiB3khq1aii7AnUw1p1OZPyEpcxrTMwLHkPzLGNaeXrmun7kqTBA9JVwfy pXk++D5VETyI9lFHXTKvzjNoGw0YTZu60JSOskz8B0uj3LQg+PY+m9HQtjeuSNCo6Xz4 oGHw== X-Gm-Message-State: AOAM532PyHaYtqCGrb9ws3umsMmJlbG+cGFfyBrdI6W5sN88uu6/aNov PESER3Wtp/6Xs40n5Ncj5cZV3j5W087krvH5VWPgEA== X-Received: by 2002:a1c:e0c2:: with SMTP id x185mr9242643wmg.124.1596742950142; Thu, 06 Aug 2020 12:42:30 -0700 (PDT) MIME-Version: 1.0 References: <20200722054314.2103880-1-irogers@google.com> In-Reply-To: From: Ian Rogers Date: Thu, 6 Aug 2020 12:42:17 -0700 Message-ID: Subject: Re: [RFC PATCH] bpftool btf: Add prefix option to dump C To: Andrii Nakryiko Cc: Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andrii Nakryiko , John Fastabend , KP Singh , Quentin Monnet , Jakub Kicinski , Jiri Olsa , =?UTF-8?B?VG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2Vu?= , Networking , bpf , open list , Stanislav Fomichev , Hao Luo Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Aug 6, 2020 at 10:58 AM Andrii Nakryiko wrote: > > On Fri, Jul 31, 2020 at 8:47 PM Andrii Nakryiko > wrote: > > > > On Fri, Jul 31, 2020 at 6:47 PM Ian Rogers wrote: > > > > > > On Tue, Jul 21, 2020 at 11:58 PM Andrii Nakryiko > > > wrote: > > > > > > > > On Tue, Jul 21, 2020 at 10:44 PM Ian Rogers wrote: > > > > > > > > > > When bpftool dumps types and enum members into a header file for > > > > > inclusion the names match those in the original source. If the same > > > > > header file needs to be included in the original source and the bpf > > > > > program, the names of structs, unions, typedefs and enum members will > > > > > have naming collisions. > > > > > > > > vmlinux.h is not really intended to be used from user-space, because > > > > it's incompatible with pretty much any other header that declares any > > > > type. Ideally we should make this better, but that might require some > > > > compiler support. We've been discussing with Yonghong extending Clang > > > > with a compile-time check for whether some type is defined or not, > > > > which would allow to guard every type and only declare it > > > > conditionally, if it's missing. But that's just an idea at this point. > > > > > > Thanks Andrii! We're not looking at user-space code but the BPF code. > > > The prefix idea comes from a way to solve this problem in C++ with > > > namespaces: > > > > > > namespace vmlinux { > > > #include "vmlinux.h" > > > } > > > > > > As the BPF programs are C code then the prefix acts like the > > > namespace. It seems strange to need to extend the language. > > > > This is a classic case of jumping to designing a solution without > > discussing a real problem first :) > > > > You don't need to use any of the kernel headers together with > > vmlinux.h (and it won't work as well), because vmlinux.h is supposed > > to have all the **used** types from the kernel. So BPF programs only > > include vmlinux.h and few libbpf-provided headers with helpers. Which > > is why I assumed that you are trying to use it from user-space. But > > see below on what went wrong. > > > > > > > > > Regardless, vmlinux.h is also very much Clang-specific, and shouldn't > > > > work well with GCC. Could you elaborate on the specifics of the use > > > > case you have in mind? That could help me see what might be the right > > > > solution. Thanks! > > > > > > So the use-case is similar to btf_iter.h: > > > https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/testing/selftests/bpf/progs/bpf_iter.h > > > To avoid collisions with somewhat cleaner macro or not games. > > > > > > Prompted by your concern I was looking into changing bpf_iter.h to use > > > a prefix to show what the difference would be like. I also think that > > > there may be issues with our kernel and tool set up that may mean that > > > the prefix is unnecessary, if I fix something else. Anyway, to give an > > > example I needed to build the selftests but this is failing for me. > > > What I see is: > > > > > > $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git > > > $ cd bpf-next > > > $ make defconfig > > > $ cat >>.config < > > CONFIG_DEBUG_INFO=y > > > CONFIG_DEBUG_INFO_BTF=y > > > EOF > > > $ make -j all > > > $ mkdir /tmp/selftests > > > $ make O=/tmp/selftests/ TARGETS=bpf kselftest > > > ... > > > CLANG /tmp/selftests//kselftest/bpf/tools/build/bpftool/profiler.bpf.o > > > skeleton/profiler.bpf.c:18:21: error: invalid application of 'sizeof' > > > to an incomplete type 'struct bpf_perf_event_value' > > > __uint(value_size, sizeof(struct bpf_perf_event_value)); > > > ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > > > > > Checking with bpftool the vmlinux lacks struct bpf_perf_event_value > > > but as this is unconditionally defined in bpf.h this seems wrong. Do > > > you have any suggestions and getting a working build? > > > > It is unconditionally defined in bpf.h, but unless kernel code really > > uses that type for something, compiler won't generate DWARF > > information for that type, which subsequently won't get into BTF. > > Adding CONFIG_DEBUG_INFO_BTF=y ensures you get BTF type info > > generated, but only for subsystems that were compiled into vmlinux > > according to your kernel config. > > > > In this case, default config doesn't enable CONFIG_BPF_EVENTS, which > > is a requirement to compile kernel/trace/bpf_trace.c, which in turn > > uses struct bpf_perf_event_value in the helper signature. > > > > So the solution in your case would be to use a slightly richer kernel > > config, which enables more of the BPF subsystem. You can check > > selftests/bpf/config for a list of options we typically enable to run > > of selftests, for instance. > > > > So we've discussed this and related issues today at BPF office hours > and few more thoughts occurred to me after I left the call. Thanks for the follow-up. I need to add the office hours to my schedule. > You don't really have to use vmlinux.h, if it's inconvenient. Unless > you want to use some internal kernel type that's not available in > kernel-headers. Otherwise feel free to use normal kernel header > includes and don't use vmlinux.h. If you are using BPF_CORE_READ(), > any type is automatically CO-RE-relocatable, even if they come from > #include . If you need to use direct memory accesses > with programs like fentry/fexit, then adding: > > #pragma clang attribute push (__attribute__((preserve_access_index)), > apply_to = record) > > before you include any headers would make types in those headers > automatically CO-RE-relocatable even for direct memory accesses. So > this is just something to keep in mind. > > > But the way we've been handling this was like this. > > On BPF program side: > > #include "vmlinux.h" > #include "my_custom_types.h" > > ... > > > On user-space program side: > > #include /* and whatever else is needed */ > #include "my_custom_types.h" > > Then in my_custom_types.h you just assume all the needed types are > defined (in either vmlinux.h or in user-space header includes): > > > struct my_struct { > uint64_t whatever; > }; > > So far worked fine. It still sucks you can't include some of the > kernel headers to get some useful macro, but to solve that we'd need > Clang extension to check that some type X is already defined, as we > discussed in the call. > > Hope this helps a bit. Thanks, I was scratching around for examples because I was using a kernel that wasn't providing me even the values present in bpf.h. I looked at the bpf selftests as hopeful best practice, but that's where I saw the use of macros to move definitions out of the way: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/testing/selftests/bpf/progs/bpf_iter.h This felt like my point of pain, so perhaps that code needs to carry a warning. Using #define to rename types, as in that file, doesn't scale for something like bpf.h and so this patch - which is intended to feel like a use of namespaces. There are related style issues (from the #define renaming) in Google's build system because of the use of modules [1] where this kind of "textual" use of headers is considered an issue. I'm wondering, following this conversation whether there is some tech debt cleanup that could be done. For example, on the perf side I found that BPF errors were being swallowed: https://lore.kernel.org/lkml/20200707211449.3868944-1-irogers@google.com/ Perf is defining its own bpf.h: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/perf/include/bpf/bpf.h and perhaps that needs to be rethought to be more aligned with CO-RE and vmlinux.h. It would be nice if selftests could do a better job of building dependencies with the necessary config requirements. There's a lot of feeling around to make these things work, which seems less than ideal. Thanks, Ian [1] https://clang.llvm.org/docs/Modules.html > [...]