On 8/3/20 8:33 PM, Alexei Starovoitov wrote: > On Mon, Aug 3, 2020 at 10:40 AM Daniel Borkmann wrote: >> >> On 8/3/20 7:34 PM, Daniel Borkmann wrote: >>> On 8/3/20 7:15 PM, Daniel Borkmann wrote: >>>> On 8/3/20 12:29 AM, Alexei Starovoitov wrote: >>>>> From: Alexei Starovoitov >>>>> >>>>> Add kernel module with user mode driver that populates bpffs with >>>>> BPF iterators. >>>>> >>>>> $ mount bpffs /my/bpffs/ -t bpf >>>>> $ ls -la /my/bpffs/ >>>>> total 4 >>>>> drwxrwxrwt 2 root root 0 Jul 2 00:27 . >>>>> drwxr-xr-x 19 root root 4096 Jul 2 00:09 .. >>>>> -rw------- 1 root root 0 Jul 2 00:27 maps.debug >>>>> -rw------- 1 root root 0 Jul 2 00:27 progs.debug >>>>> >>>>> The user mode driver will load BPF Type Formats, create BPF maps, populate BPF >>>>> maps, load two BPF programs, attach them to BPF iterators, and finally send two >>>>> bpf_link IDs back to the kernel. >>>>> The kernel will pin two bpf_links into newly mounted bpffs instance under >>>>> names "progs.debug" and "maps.debug". These two files become human readable. >>>>> >>>>> $ cat /my/bpffs/progs.debug >>>>> id name attached >>>>> 11 dump_bpf_map bpf_iter_bpf_map >>>>> 12 dump_bpf_prog bpf_iter_bpf_prog >>>>> 27 test_pkt_access >>>>> 32 test_main test_pkt_access test_pkt_access >>>>> 33 test_subprog1 test_pkt_access_subprog1 test_pkt_access >>>>> 34 test_subprog2 test_pkt_access_subprog2 test_pkt_access >>>>> 35 test_subprog3 test_pkt_access_subprog3 test_pkt_access >>>>> 36 new_get_skb_len get_skb_len test_pkt_access >>>>> 37 new_get_skb_ifindex get_skb_ifindex test_pkt_access >>>>> 38 new_get_constant get_constant test_pkt_access >>>>> >>>>> The BPF program dump_bpf_prog() in iterators.bpf.c is printing this data about >>>>> all BPF programs currently loaded in the system. This information is unstable >>>>> and will change from kernel to kernel as ".debug" suffix conveys. >>>>> >>>>> Signed-off-by: Alexei Starovoitov >>>> [...] >>>>> diff --git a/kernel/bpf/preload/Kconfig b/kernel/bpf/preload/Kconfig >>>>> new file mode 100644 >>>>> index 000000000000..b8ba5a9398ed >>>>> --- /dev/null >>>>> +++ b/kernel/bpf/preload/Kconfig >>>>> @@ -0,0 +1,18 @@ >>>>> +# SPDX-License-Identifier: GPL-2.0-only >>>>> +menuconfig BPF_PRELOAD >>>>> + bool "Preload BPF file system with kernel specific program and map iterators" >>>>> + depends on BPF >>>>> + help >>>>> + This builds kernel module with several embedded BPF programs that are >>>>> + pinned into BPF FS mount point as human readable files that are >>>>> + useful in debugging and introspection of BPF programs and maps. >>>>> + >>>>> +if BPF_PRELOAD >>>>> +config BPF_PRELOAD_UMD >>>>> + tristate "bpf_preload kernel module with user mode driver" >>>>> + depends on CC_CAN_LINK >>>>> + depends on m || CC_CAN_LINK_STATIC >>>>> + default m >>>>> + help >>>>> + This builds bpf_preload kernel module with embedded user mode driver. >>>>> +endif >>>> [...] >>>> When I applied this set locally to run build & selftests I noticed that the above >>>> kconfig will appear in the top-level menuconfig. This is how it looks in menuconfig: >>>> >>>> │ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ >>>> │ │ General setup ---> │ │ >>>> │ │ [*] 64-bit kernel │ │ >>>> │ │ Processor type and features ---> │ │ >>>> │ │ Power management and ACPI options ---> │ │ >>>> │ │ Bus options (PCI etc.) ---> │ │ >>>> │ │ Binary Emulations ---> │ │ >>>> │ │ Firmware Drivers ---> │ │ >>>> │ │ [*] Virtualization ---> │ │ >>>> │ │ General architecture-dependent options ---> │ │ >>>> │ │ [*] Enable loadable module support ---> │ │ >>>> │ │ -*- Enable the block layer ---> │ │ >>>> │ │ IO Schedulers ---> │ │ >>>> │ │ [ ] Preload BPF file system with kernel specific program and map iterators ---- │ │ >>>> │ │ Executable file formats ---> │ │ >>>> │ │ Memory Management options ---> │ │ >>>> │ │ [*] Networking support ---> │ │ >>>> │ │ Device Drivers ---> │ │ >>>> │ │ File systems ---> │ │ >>>> │ │ Security options ---> │ │ >>>> [...] >>>> >>>> I assume the original intention was to have it under 'general setup' on a similar level for >>>> the JIT settings, or is this intentional to have it at this high level next to 'networking >>>> support' and others? > > I don't remember when last time I did menuconfig. > How do you propose to move it? > Any particular suggestion how kconfig suppose to look like? See the init/Kconfig e.g. BPF_JIT_ALWAYS_ON. This is under `menu "General setup"`. One option is to move it there too. OT: independent of this, maybe in next cycle it would make sense to add a BPF subcategory under 'general setup' where we place all the BPF related items including the JIT which is still under networking. Given there are more and more BPF kconfig knobs that would improve the user experience a bit as well. >>> Hm, my config has: >>> >>> CONFIG_BPF_PRELOAD=y >>> CONFIG_BPF_PRELOAD_UMD=y >>> >>> I'm getting the following 3 warnings and build error below: >>> >>> root@tank:~/bpf-next# make -j8 > /dev/null >>> arch/x86/hyperv/hv_apic.c: In function ‘hv_send_ipi_mask_allbutself’: >>> arch/x86/hyperv/hv_apic.c:236:1: warning: the frame size of 1032 bytes is larger than 1024 bytes [-Wframe-larger-than=] >>> } >>> ^ >>> make[3]: *** No rule to make target 'kernel/bpf/preload/./../../tools/lib/bpf/bpf.c', needed by 'kernel/bpf/preload/./../../tools/lib/bpf/bpf.o'. Stop. >>> make[3]: *** Waiting for unfinished jobs.... >>> kernel/bpf/preload/iterators/iterators.c: In function ‘main’: >>> kernel/bpf/preload/iterators/iterators.c:50:2: warning: ignoring return value of ‘dup’, declared with attribute warn_unused_result [-Wunused-result] >>> dup(debug_fd); >>> ^~~~~~~~~~~~~ >>> kernel/bpf/preload/iterators/iterators.c:53:2: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] >>> read(from_kernel, &magic, sizeof(magic)); >>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> kernel/bpf/preload/iterators/iterators.c:85:2: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] >>> read(from_kernel, &magic, sizeof(magic)); >>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> make[2]: *** [kernel/bpf/preload] Error 2 >>> make[1]: *** [kernel/bpf] Error 2 >>> make: *** [kernel] Error 2 >>> make: *** Waiting for unfinished jobs.... >>> [...] >>> >>> Have you seen the target error before, what am I missing? >> >> Looks like the path in this patch is wrong: >> >> diff --git a/kernel/bpf/preload/Makefile b/kernel/bpf/preload/Makefile >> index 191d82209842..136c6ca0c196 100644 >> --- a/kernel/bpf/preload/Makefile >> +++ b/kernel/bpf/preload/Makefile >> @@ -1,6 +1,6 @@ >> # SPDX-License-Identifier: GPL-2.0 >> >> -LIBBPF := $(srctree)/../../tools/lib/bpf >> +LIBBPF := $(srctree)/../../../tools/lib/bpf > > hmm. that's very odd. > Are you building in-src-tree ? Yes, I always build in src tree. Odd. > I'm building out-of-src-tree with KBUILD_OUTPUT. > And two pairs of dots would be correct. > make V=1 kernel/bpf/preload/ > gcc -m64 -lelf -lz -o kernel/bpf/preload/bpf_preload_umd > kernel/bpf/preload/iterators/iterators.o > kernel/bpf/preload/../../../tools/lib/bpf/bpf.o > > see three pairs above. the first pair comes from $(srctree) somehow. > >> userccflags += -I $(srctree)/tools/include/ -I $(srctree)/tools/include/uapi -I $(LIBBPF) \ >> -I $(srctree)/tools/lib/ \ >> -I $(srctree)/kernel/bpf/preload/iterators/ -Wno-int-conversion \ >> >> With that, I'm now getting the following error: >> >> root@tank:~/bpf-next# make -j8 >> DESCEND objtool >> DESCEND bpf/resolve_btfids >> CALL scripts/atomic/check-atomics.sh >> CALL scripts/checksyscalls.sh >> CHK include/generated/compile.h >> CC kernel/events/core.o >> CC [U] kernel/bpf/preload/iterators/iterators.o >> kernel/bpf/preload/iterators/iterators.c: In function ‘main’: >> kernel/bpf/preload/iterators/iterators.c:50:2: warning: ignoring return value of ‘dup’, declared with attribute warn_unused_result [-Wunused-result] >> dup(debug_fd); >> ^~~~~~~~~~~~~ >> kernel/bpf/preload/iterators/iterators.c:53:2: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] >> read(from_kernel, &magic, sizeof(magic)); >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> kernel/bpf/preload/iterators/iterators.c:85:2: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] >> read(from_kernel, &magic, sizeof(magic)); >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> CC kernel/events/ring_buffer.o >> CC [U] kernel/bpf/preload/./../../../tools/lib/bpf/bpf.o >> CC [U] kernel/bpf/preload/./../../../tools/lib/bpf/libbpf.o >> In file included from kernel/bpf/preload/./../../../tools/lib/bpf/libbpf.c:47:0: >> ./tools/include/tools/libc_compat.h:11:21: error: static declaration of ‘reallocarray’ follows non-static declaration >> static inline void *reallocarray(void *ptr, size_t nmemb, size_t size) >> ^~~~~~~~~~~~ > > I saw this in the past when makefile was wrong. I suspect it's related > to the above issue. > Could you send me your build script / command line and make version? Config attached. root@tank:~/bpf-next# make --version GNU Make 4.1 I always build manually, so plain in src tree build with just make -jX. Thanks, Daniel