The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: Ziyang Men <ziyang.meme@gmail.com>
To: Viktor Malik <vmalik@redhat.com>
Cc: "Shuah Khan" <shuah@kernel.org>, "Tejun Heo" <tj@kernel.org>,
	"Johannes Weiner" <hannes@cmpxchg.org>,
	"Michal Koutný" <mkoutny@suse.com>,
	"Jiri Kosina" <jikos@kernel.org>,
	"Benjamin Tissoires" <bentiss@kernel.org>,
	"David Vernet" <void@manifault.com>,
	"Eduard Zingerman" <eddyz87@gmail.com>,
	"Andrea Righi" <arighi@nvidia.com>,
	"Changwoo Min" <changwoo@igalia.com>,
	"Michal Hocko" <mhocko@kernel.org>,
	"Roman Gushchin" <roman.gushchin@linux.dev>,
	"Shakeel Butt" <shakeel.butt@linux.dev>,
	"Muchun Song" <muchun.song@linux.dev>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"JP Kobryn" <inwardvessel@gmail.com>,
	"Mykola Lysenko" <mykolal@meta.com>,
	"Nathan Chancellor" <nathan@kernel.org>,
	linux-kselftest@vger.kernel.org, cgroups@vger.kernel.org,
	linux-input@vger.kernel.org, sched-ext@lists.linux.dev,
	linux-mm@kvack.org, kernel-team@meta.com, bpf@vger.kernel.org,
	llvm@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 1/4] selftests: add shared lib.bpf.mk to build BPF progs and skeletons
Date: Thu, 6 Aug 2026 12:48:37 -0700	[thread overview]
Message-ID: <anTlFSsr5FqQt+o8@devvm16600.scu0.facebook.com> (raw)
In-Reply-To: <f2a0db3b-ac66-4b29-9dff-a691d9464123@redhat.com>

On Wed, Jul 22, 2026 at 08:50:06AM +0200, Viktor Malik wrote:
>On 7/21/26 19:48, Ziyang Men wrote:
>> The libbpf + bpftool + vmlinux.h + BPF-object + skeleton build tool-chain
>> is currently duplicated across tools/testing/selftests/{bpf,sched_ext,
>> hid}/, each carrying ~100-140 lines of near-identical Makefile.  As more
>> subsystems grow BPF-based selftests, the duplication scales poorly.
>>
>> Add tools/testing/selftests/lib.bpf.mk, a single includable fragment that
>> provides the whole chain end-to-end. It builds the in-tree libbpf.a and a
>> host bpftool, generates vmlinux.h from the kernel's BTF, compiles *.bpf.c
>> into BPF objects (clang --target=bpf) and generates their skeletons. It
>> also provides what the user-space test binary needs to build: the header
>> search paths (so #includes resolve), a bpf_link macro that wraps the link
>> command, and BPF_LDLIBS, so the test can be statically linked against
>> libbpf.a.
>>
>> To use: set BPF_SRCS and OVERRIDE_TARGETS := 1 before including ../lib.mk
>> (so lib.mk's default link rule is suppressed), then include ../lib.bpf.mk
>> and list $(BPF_SKELS) as prerequisites of the test binary, e.g.,:
>>
>>     BPF_SRCS         := progs/foo.bpf.c
>>     OVERRIDE_TARGETS := 1
>>     include ../lib.mk
>>     include ../lib.bpf.mk
>>     $(OUTPUT)/foo_test: foo_test.c $(BPF_SKELS)
>>             $(call bpf_link,$@,$<)
>>
>> This saves much work for configuring selftests in other folder, such the cgroup.
>>
>> net/bpf.mk (which only builds *.bpf.o, without skeleton or vmlinux.h
>> generation) is left unchanged; replacing the existing duplication
>> mentioned above is the next step.
>>
>> Suggested-by: Shakeel Butt <shakeel.butt@linux.dev>
>> Suggested-by: Eduard Zingerman <eddyz87@gmail.com>
>> Suggested-by: Mykola Lysenko <mykolal@meta.com>
>> Assisted-by: Claude:claude-opus-4-8
>> Signed-off-by: Ziyang Men <ziyang.meme@gmail.com>
>> ---
>>  tools/testing/selftests/lib.bpf.mk | 247 +++++++++++++++++++++++++++++
>>  1 file changed, 247 insertions(+)
>>  create mode 100644 tools/testing/selftests/lib.bpf.mk
>>
>> diff --git a/tools/testing/selftests/lib.bpf.mk b/tools/testing/selftests/lib.bpf.mk
>> new file mode 100644
>> index 000000000000..6f175c6568e9
>> --- /dev/null
>> +++ b/tools/testing/selftests/lib.bpf.mk
>> @@ -0,0 +1,247 @@
>> +# SPDX-License-Identifier: GPL-2.0
>> +#
>> +# Shared fragment for selftests that compile *.bpf.c into BPF objects +
>> +# skeletons and link them into userspace test binaries, without each
>> +# subsystem's Makefile re-implementing the libbpf/bpftool/vmlinux.h machinery.
>> +#
>> +# Caller contract (per-test Makefile):
>> +#
>> +#     BPF_SRCS         := foo.bpf.c bar.bpf.c
>> +#     TEST_GEN_PROGS   := foo_test
>> +#     OVERRIDE_TARGETS := 1              # MUST be set before lib.mk
>> +#     include ../lib.mk                  # defines OUTPUT, CC, Q, msg,
>> +#     include ../lib.bpf.mk              #   selfdir, top_srcdir; honours OVERRIDE
>> +#
>> +#     $(OUTPUT)/foo_test: foo_test.c $(BPF_SKELS)
>> +#         $(call bpf_link,$@,$<)
>> +#
>> +# Optional knobs (set before including lib.bpf.mk):
>> +#   BPF_PROG_EXT     - source suffix, default .bpf.c; set to .c for the legacy
>> +#                      "progs/foo.c -> foo.bpf.o" layout.
>> +#   BPF_EXTRA_HDRS   - extra prerequisites (headers) for the BPF objects.
>> +#   BPF_EXTRA_CFLAGS - appended to BPF_CFLAGS for the BPF compile.
>> +#   BPF_SKEL_EXT     - skeleton suffix, default .skel.h (e.g. .bpf.skel.h).
>> +#   BPF_GEN_SUBSKEL  - if set, also emit a subskeleton next to each skeleton.
>> +#   BPF_OBJ_DIR      - dir for generated *.bpf.o (default $(OUTPUT)).
>> +#   BPF_SKEL_DIR     - dir for generated skeletons (default $(OUTPUT)).
>> +# A caller with unusual compile needs may override BPF_CFLAGS wholesale after
>> +# the include (the object recipe expands it lazily).
>> +# BPF_SRCS entries may live in a subdirectory (e.g. progs/foo.bpf.c); the
>> +# objects and skeletons are always emitted flat under $(OUTPUT), keyed by the
>> +# source basename (foo.bpf.o / foo.skel.h).
>> +#
>> +# lib.mk MUST be included first: this fragment consumes the vars it defines
>> +# (OUTPUT, top_srcdir, CC, CLANG, Q, msg) and needs OVERRIDE_TARGETS to have
>> +# already suppressed lib.mk's default link rule.
>> +
>> +include $(top_srcdir)/tools/scripts/Makefile.arch	# ARCH / SRCARCH
>> +# Pull in the shared toolchain definitions (HOSTCC/HOSTLD/CLANG) so this
>> +# fragment picks the *same* host compiler the libbpf and bpftool sub-makes
>> +# will: in particular HOSTCC becomes clang under LLVM=1 (gcc otherwise).
>> +# Without this the host bpftool and its bootstrap libbpf can end up built with
>> +# a mix of gcc and clang, which trips clang on gcc-only flags (-Wstrict-aliasing=3).
>> +#
>> +# Makefile.include's allow-override resets CC to a bare "clang", which would
>> +# drop the --target=<arch> flag lib.mk set for LLVM=1 cross builds (make LLVM=1
>> +# ARCH=arm64).  lib.mk ran first and configured CC for the target, so save it
>> +# across the include and restore it afterwards.
>> +lib_bpf_mk_saved_cc := $(CC)
>> +include $(top_srcdir)/tools/scripts/Makefile.include
>> +CC := $(lib_bpf_mk_saved_cc)
>> +
>> +CLANG  ?= clang
>> +HOSTCC ?= gcc
>> +HOSTLD ?= ld
>> +ifneq ($(V),1)
>> +submake_extras := feature_display=0
>> +endif
>> +
>> +# ---- paths & tools --------------------------------------------------------
>> +TOOLSDIR    := $(top_srcdir)/tools
>> +LIBDIR      := $(TOOLSDIR)/lib
>> +BPFDIR      := $(LIBDIR)/bpf
>> +TOOLSINCDIR := $(TOOLSDIR)/include
>> +BPFTOOLDIR  := $(TOOLSDIR)/bpf/bpftool
>> +APIDIR      := $(TOOLSINCDIR)/uapi
>> +
>> +# Everything generated lives under $(OUTPUT) so O= and in-tree both work and
>> +# per-test builds (distinct $(OUTPUT)) never collide.
>> +SCRATCH_DIR := $(OUTPUT)/tools
>> +BUILD_DIR   := $(SCRATCH_DIR)/build
>> +INCLUDE_DIR := $(SCRATCH_DIR)/include
>> +BPFOBJ      := $(BUILD_DIR)/libbpf/libbpf.a
>> +
>> +# bpftool must run on the *host*; split the host toolchain out when cross-building.
>> +ifneq ($(CROSS_COMPILE),)
>> +HOST_BUILD_DIR   := $(BUILD_DIR)/host
>> +HOST_SCRATCH_DIR := $(OUTPUT)/host-tools
>> +else
>> +HOST_BUILD_DIR   := $(BUILD_DIR)
>> +HOST_SCRATCH_DIR := $(SCRATCH_DIR)
>> +endif
>> +HOST_BPFOBJ     := $(HOST_BUILD_DIR)/libbpf/libbpf.a
>> +DEFAULT_BPFTOOL := $(HOST_SCRATCH_DIR)/sbin/bpftool
>> +BPFTOOL         ?= $(DEFAULT_BPFTOOL)
>> +
>> +# ---- vmlinux BTF discovery -----------------------------------------------
>> +VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux)				\
>> +		     $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux)	\
>> +		     $(top_srcdir)/vmlinux				\
>> +		     /sys/kernel/btf/vmlinux				\
>> +		     /boot/vmlinux-$(shell uname -r)
>> +VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
>> +ifeq ($(VMLINUX_BTF),)
>> +$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
>> +endif
>> +
>> +# ---- clang flags ----------------------------------------------------------
>> +# Clang's default system includes (not the ones seen under --target=bpf); fixes
>> +# "missing" asm/byteorder.h etc. '-idirafter' so we never shadow real includes.
>> +define get_sys_includes
>> +$(shell $(1) $(2) -v -E - </dev/null 2>&1 \
>> +	| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
>> +$(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')
>> +endef
>> +ifneq ($(CROSS_COMPILE),)
>> +CLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%))
>> +endif
>> +CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))
>> +
>> +IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
>> +			grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
>> +MENDIAN = $(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)
>> +
>> +# Prefer -mcpu=v3; fall back to v2 on clang too old to know it (probed once).
>> +CLANG_BPF_CPU := $(shell $(CLANG) --target=bpf -mcpu=help 2>&1 | grep -q 'v3' \
>> +			 && echo v3 || echo v2)
>> +
>> +# -fms-extensions + -Wno-microsoft-anon-tag: required so clang accepts the
>> +# anonymous nested struct/union members bpftool emits into vmlinux.h.
>> +BPF_CFLAGS = -g -Wall -Werror -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN)	\
>> +	     -I$(INCLUDE_DIR) -I$(APIDIR) -I$(TOOLSINCDIR)		\
>> +	     -std=gnu11							\
>> +	     -fno-strict-aliasing					\
>> +	     -fms-extensions -Wno-microsoft-anon-tag			\
>> +	     -Wno-compare-distinct-pointer-types			\
>> +	     $(CLANG_SYS_INCLUDES) $(BPF_EXTRA_CFLAGS)
>> +
>> +# $1 = src .bpf.c, $2 = dst .bpf.o
>> +define BPF_BUILD_RULE
>> +	$(call msg,CLNG-BPF,,$2)
>> +	$(Q)$(CLANG) $(BPF_CFLAGS) -O2 --target=bpf -mcpu=$(CLANG_BPF_CPU) -c $1 -o $2
>> +endef
>> +
>> +# ---- output dirs for generated objects/skeletons --------------------------
>> +# Default: flat under $(OUTPUT) (what bpf/, hid/, cgroup/ do).  A caller may
>> +# segregate the generated files into subdirs, e.g. BPF_SKEL_DIR := $(OUTPUT)/...
>> +BPF_OBJ_DIR  ?= $(OUTPUT)
>> +BPF_SKEL_DIR ?= $(OUTPUT)
>> +
>> +# ---- scratch dirs ---------------------------------------------------------
>> +MAKE_DIRS := $(sort $(BUILD_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf		\
>> +		    $(HOST_BUILD_DIR)/bpftool $(INCLUDE_DIR)		\
>> +		    $(filter-out $(OUTPUT),$(BPF_OBJ_DIR) $(BPF_SKEL_DIR)))
>> +$(MAKE_DIRS):
>> +	$(call msg,MKDIR,,$@)
>> +	$(Q)mkdir -p $@
>> +
>> +# ---- libbpf (target) ------------------------------------------------------
>> +# Pass ARCH/CROSS_COMPILE/CC through: lib.mk's CC is file-origin and is not
>> +# exported, so without this the libbpf sub-make would rebuild for the host under
>> +# a pure-LLVM cross build (make LLVM=1 ARCH=<arch>).  -fPIC keeps the static
>> +# libbpf linkable into position-independent (PIE) test binaries.
>> +$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
>> +	   $(APIDIR)/linux/bpf.h | $(BUILD_DIR)/libbpf
>> +	$(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \
>> +		    ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) CC="$(CC)"     \
>> +		    EXTRA_CFLAGS='-g -O0 -fPIC'				      \
Hi Viktor, 

Thanks for your suggestions!
>
>Looking at the same line in tools/testing/selftests/bpf/Makefile:
>
>            EXTRA_CFLAGS='-g $(OPT_FLAGS) $(SAN_CFLAGS) $(EXTRA_CFLAGS)' \
>
>is there a reason why this is not respected and -O0 and -fPIC are
>hard-coded?
Yes it is true that there is no good reason. I will fix it in the next version.

>What if someone wants to build selftests (including libbpf)
>with -O2 and some additional flags?
I will add a flag such as OPT_FLAGS ?= $(if $(RELEASE),-O2,O0), which follows
the pattern in the bpf/Makefile:37. So if we run 
$ make -> -g -O0 -fPIC (taget libbpf) and -g -O0 (host bpftool)
$ make RELEASE=1 -> -g -O2 -fPIC (taget libbpf) and -g -O2 (host bpftool)

>Is that possible with the new
>lib.bpf.mk? It would be nice if it used at least EXTRA_CFLAGS or
>USERCFLAGS defined in lib.mk.
Good idea. I will add the EXTRA_CFLAGS for target libbpf, host libbpf and host
bpgtool. Such that: 
$ make OPT_FLAGS=-O2 EXTRA_CFLAGS=-DFOO -> -g -O2 -fPIC -DFOO (for target
libbpf) and -g -O2 -DFOO (for host bpftool)

>
>Same questions would apply to other rules for libbpf and bpftool below.
I would check it them as as well in next version.

>Thanks!
>Viktor
>
>
Thanks for your time and reviewing. Please let me know your concerns. Thanks!

Best,
Ziyang

>> +		    DESTDIR=$(SCRATCH_DIR) prefix= all install_headers
>> +
>> +# ---- libbpf (host) -- a distinct rule only when cross-compiling -----------
>> +ifneq ($(BPFOBJ),$(HOST_BPFOBJ))
>> +$(HOST_BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
>> +		| $(HOST_BUILD_DIR)/libbpf
>> +	$(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) ARCH= CROSS_COMPILE=	      \
>> +		    OUTPUT=$(HOST_BUILD_DIR)/libbpf/ CC=$(HOSTCC) LD=$(HOSTLD) \
>> +		    EXTRA_CFLAGS='-g -O0'				      \
>> +		    DESTDIR=$(HOST_SCRATCH_DIR) prefix= all install_headers
>> +endif
>> +
>> +# ---- bpftool (host) -------------------------------------------------------
>> +$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
>> +		    $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool
>> +	$(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR)		  \
>> +		    ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \
>> +		    EXTRA_CFLAGS='-g -O0'			  \
>> +		    OUTPUT=$(HOST_BUILD_DIR)/bpftool/		  \
>> +		    LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/	  \
>> +		    LIBBPF_DESTDIR=$(HOST_SCRATCH_DIR)/		  \
>> +		    prefix= DESTDIR=$(HOST_SCRATCH_DIR)/ install-bin
>> +
>> +# ---- vmlinux.h ------------------------------------------------------------
>> +$(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
>> +ifeq ($(VMLINUX_H),)
>> +	$(call msg,GEN,,$@)
>> +	$(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
>> +else
>> +	$(call msg,CP,,$@)
>> +	$(Q)cp "$(VMLINUX_H)" $@
>> +endif
>> +
>> +# ---- BPF objects + skeletons ---------------------------------------------
>> +# Sources may sit in a subdir and use the modern *.bpf.c or the legacy *.c
>> +# suffix (BPF_PROG_EXT); objects go in $(BPF_OBJ_DIR) and skeletons in
>> +# $(BPF_SKEL_DIR) (both default to $(OUTPUT)), keyed by the source basename.
>> +BPF_PROG_EXT ?= .bpf.c
>> +bpf_stems := $(patsubst %$(BPF_PROG_EXT),%,$(notdir $(BPF_SRCS)))
>> +# The output namespace is flat, so two sources with the same basename would
>> +# collapse into one object/skeleton; fail loudly instead of silently dropping.
>> +ifneq ($(words $(bpf_stems)),$(words $(sort $(bpf_stems))))
>> +$(error lib.bpf.mk: BPF_SRCS has colliding basenames: $(BPF_SRCS))
>> +endif
>> +# BPF_SKEL_EXT lets a caller pick the skeleton suffix (default .skel.h; e.g.
>> +# .bpf.skel.h).  With BPF_GEN_SUBSKEL set, a matching subskeleton is emitted
>> +# alongside (foo.subskel.h / foo.bpf.subskel.h).
>> +BPF_SKEL_EXT    ?= .skel.h
>> +BPF_SUBSKEL_EXT := $(patsubst %skel.h,%subskel.h,$(BPF_SKEL_EXT))
>> +BPF_OBJS  := $(addprefix $(BPF_OBJ_DIR)/,$(addsuffix .bpf.o,$(bpf_stems)))
>> +BPF_SKELS := $(addprefix $(BPF_SKEL_DIR)/,$(addsuffix $(BPF_SKEL_EXT),$(bpf_stems)))
>> +
>> +# Locate the sources wherever the caller keeps them (e.g. progs/).
>> +vpath %$(BPF_PROG_EXT) $(sort $(dir $(BPF_SRCS)))
>> +
>> +$(BPF_OBJS): $(BPF_OBJ_DIR)/%.bpf.o: %$(BPF_PROG_EXT) $(BPF_EXTRA_HDRS) \
>> +	     $(wildcard *.bpf.h) $(INCLUDE_DIR)/vmlinux.h | $(BPF_OBJ_DIR) $(BPFOBJ)
>> +	$(call BPF_BUILD_RULE,$<,$@)
>> +
>> +$(BPF_SKELS): $(BPF_SKEL_DIR)/%$(BPF_SKEL_EXT): $(BPF_OBJ_DIR)/%.bpf.o $(BPFTOOL) | $(BPF_SKEL_DIR)
>> +	$(call msg,GEN-SKEL,,$@)
>> +	$(Q)$(BPFTOOL) gen object $(<:.o=.linked.o) $<
>> +	$(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked.o) name $(notdir $(<:.bpf.o=)) > $@
>> +ifneq ($(BPF_GEN_SUBSKEL),)
>> +	$(Q)$(BPFTOOL) gen subskeleton $(<:.o=.linked.o) name $(notdir $(<:.bpf.o=)) > $(@:$(BPF_SKEL_EXT)=$(BPF_SUBSKEL_EXT))
>> +endif
>> +
>> +# ---- exports consumed by the caller --------------------------------------
>> +# -I$(OUTPUT)/-I$(BPF_SKEL_DIR): so the test .c can #include "foo.skel.h".
>> +# -I$(INCLUDE_DIR): so userspace can pull in the generated vmlinux.h if needed.
>> +CFLAGS += -I$(OUTPUT) -I$(BPF_SKEL_DIR) -I$(INCLUDE_DIR)
>> +
>> +# Static libbpf.a first, then its deps. libbpf may pull in zstd (BTF decompress)
>> +# only when built against it; link -lzstd only if libzstd is present.
>> +BPF_LDLIBS := $(BPFOBJ) -lelf -lz
>> +ifneq ($(shell pkg-config --exists libzstd 2>/dev/null && echo y),)
>> +BPF_LDLIBS += -lzstd
>> +endif
>> +
>> +TEST_GEN_FILES += $(BPF_OBJS)
>> +
>> +# Link helper: $1 = output binary, $2 = test .c (skels are the target's deps).
>> +define bpf_link
>> +	$(call msg,BINARY,,$1)
>> +	$(Q)$(CC) $(CFLAGS) $2 $(BPF_LDLIBS) $(LDLIBS) -o $1
>> +endef
>> +
>> +EXTRA_CLEAN += $(SCRATCH_DIR) $(HOST_SCRATCH_DIR)			\
>> +	       $(addprefix $(BPF_OBJ_DIR)/,*.bpf.o *.linked.o)		\
>> +	       $(addprefix $(BPF_SKEL_DIR)/,*$(BPF_SKEL_EXT) *$(BPF_SUBSKEL_EXT))
>

  reply	other threads:[~2026-08-06 19:48 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-21 17:48 [PATCH v2 0/4] selftests: shared lib.bpf.mk for building BPF progs and skeletons Ziyang Men
2026-07-21 17:48 ` [PATCH v2 1/4] selftests: add shared lib.bpf.mk to build " Ziyang Men
2026-07-22  6:50   ` Viktor Malik
2026-08-06 19:48     ` Ziyang Men [this message]
2026-07-22  9:56   ` bot+bpf-ci
2026-07-21 17:48 ` [PATCH v2 2/4] selftests/cgroup: add memcg_stat_cross_cpu correctness test for flush Ziyang Men
2026-07-22  9:43   ` Michal Koutný
2026-08-06 22:18     ` Ziyang Men
2026-07-22 18:42   ` JP Kobryn
2026-08-06 18:25     ` Ziyang Men
2026-07-21 17:48 ` [PATCH v2 3/4] selftests/hid: build the BPF program via the shared lib.bpf.mk Ziyang Men
2026-07-21 17:48 ` [PATCH v2 4/4] selftests/sched_ext: build BPF schedulers " Ziyang Men

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=anTlFSsr5FqQt+o8@devvm16600.scu0.facebook.com \
    --to=ziyang.meme@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=arighi@nvidia.com \
    --cc=bentiss@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=cgroups@vger.kernel.org \
    --cc=changwoo@igalia.com \
    --cc=eddyz87@gmail.com \
    --cc=hannes@cmpxchg.org \
    --cc=inwardvessel@gmail.com \
    --cc=jikos@kernel.org \
    --cc=kernel-team@meta.com \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=llvm@lists.linux.dev \
    --cc=mhocko@kernel.org \
    --cc=mkoutny@suse.com \
    --cc=muchun.song@linux.dev \
    --cc=mykolal@meta.com \
    --cc=nathan@kernel.org \
    --cc=roman.gushchin@linux.dev \
    --cc=sched-ext@lists.linux.dev \
    --cc=shakeel.butt@linux.dev \
    --cc=shuah@kernel.org \
    --cc=tj@kernel.org \
    --cc=vmalik@redhat.com \
    --cc=void@manifault.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