linux-yocto/tools/testing/selftests/sched_ext/Makefile
Björn Töpel 7941b83bce selftests: sched_ext: Add sched_ext as proper selftest target
The sched_ext selftests is missing proper cross-compilation support, a
proper target entry, and out-of-tree build support.

When building the kselftest suite, e.g.:

  make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu-  \
    TARGETS=sched_ext SKIP_TARGETS="" O=/output/foo \
    -C tools/testing/selftests install

or:

  make ARCH=arm64 LLVM=1 TARGETS=sched_ext SKIP_TARGETS="" \
    O=/output/foo -C tools/testing/selftests install

The expectation is that the sched_ext is included, cross-built, the
correct toolchain is picked up, and placed into /output/foo.

In contrast to the BPF selftests, the sched_ext suite does not use
bpftool at test run-time, so it is sufficient to build bpftool for the
build host only.

Add ARCH, CROSS_COMPILE, OUTPUT, and TARGETS support to the sched_ext
selftest. Also, remove some variables that were unused by the
Makefile.

Signed-off-by: Björn Töpel <bjorn@rivosinc.com>
Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
Acked-by: David Vernet <void@manifault.com>
Tested-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Tejun Heo <tj@kernel.org>
2024-10-09 06:42:51 -10:00

7.1 KiB

SPDX-License-Identifier: GPL-2.0

Copyright (c) 2022 Meta Platforms, Inc. and affiliates.

include ../../../build/Build.include include ../../../scripts/Makefile.arch include ../../../scripts/Makefile.include

TEST_GEN_PROGS := runner

override lib.mk's default rules

OVERRIDE_TARGETS := 1 include ../lib.mk

CURDIR := $(abspath .) REPOROOT := $(abspath ../../../..) TOOLSDIR := $(REPOROOT)/tools LIBDIR := $(TOOLSDIR)/lib BPFDIR := $(LIBDIR)/bpf TOOLSINCDIR := $(TOOLSDIR)/include BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool APIDIR := $(TOOLSINCDIR)/uapi GENDIR := $(REPOROOT)/include/generated GENHDR := $(GENDIR)/autoconf.h SCXTOOLSDIR := $(TOOLSDIR)/sched_ext SCXTOOLSINCDIR := $(TOOLSDIR)/sched_ext/include

OUTPUT_DIR := $(OUTPUT)/build OBJ_DIR := $(OUTPUT_DIR)/obj INCLUDE_DIR := $(OUTPUT_DIR)/include BPFOBJ_DIR := $(OBJ_DIR)/libbpf SCXOBJ_DIR := $(OBJ_DIR)/sched_ext BPFOBJ := $(BPFOBJ_DIR)/libbpf.a LIBBPF_OUTPUT := $(OBJ_DIR)/libbpf/libbpf.a

DEFAULT_BPFTOOL := $(OUTPUT_DIR)/host/sbin/bpftool HOST_OBJ_DIR := $(OBJ_DIR)/host/bpftool HOST_LIBBPF_OUTPUT := $(OBJ_DIR)/host/libbpf/ HOST_LIBBPF_DESTDIR := $(OUTPUT_DIR)/host/ HOST_DESTDIR := $(OUTPUT_DIR)/host/

VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux)
$(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux)
../../../../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

BPFTOOL ?= $(DEFAULT_BPFTOOL)

ifneq ($(wildcard $(GENHDR)),) GENFLAGS := -DHAVE_GENHDR endif

CFLAGS += -g -O2 -rdynamic -pthread -Wall -Werror $(GENFLAGS)
-I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR)
-I$(TOOLSINCDIR) -I$(APIDIR) -I$(CURDIR)/include -I$(SCXTOOLSINCDIR)

Silence some warnings when compiled with clang

ifneq ($(LLVM),) CFLAGS += -Wno-unused-command-line-argument endif

LDFLAGS = -lelf -lz -lpthread -lzstd

IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null |
grep 'define BYTE_ORDER ORDER_LITTLE_ENDIAN')

Get Clang's default includes on this system, as opposed to those seen by

'-target bpf'. This fixes "missing" files on some architectures/distros,

such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.

Use '-idirafter': Don't interfere with include mechanics except where the

build would have failed anyways.

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))

BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH)
$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)
-I$(CURDIR)/include -I$(CURDIR)/include/bpf-compat
-I$(INCLUDE_DIR) -I$(APIDIR) -I$(SCXTOOLSINCDIR)
-I$(REPOROOT)/include
$(CLANG_SYS_INCLUDES)
-Wall -Wno-compare-distinct-pointer-types
-Wno-incompatible-function-pointer-types
-O2 -mcpu=v3

sort removes libbpf duplicates when not cross-building

MAKE_DIRS := $(sort $(OBJ_DIR)/libbpf $(OBJ_DIR)/libbpf
$(OBJ_DIR)/bpftool $(OBJ_DIR)/resolve_btfids
$(HOST_OBJ_DIR) $(INCLUDE_DIR) $(SCXOBJ_DIR))

$(MAKE_DIRS): $(call msg,MKDIR,,$@) $(Q)mkdir -p $@

$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile)
$(APIDIR)/linux/bpf.h
| $(OBJ_DIR)/libbpf $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(OBJ_DIR)/libbpf/
ARCH=$(ARCH) CC="$(CC)" CROSS_COMPILE=$(CROSS_COMPILE)
EXTRA_CFLAGS='-g -O0 -fPIC'
DESTDIR=$(OUTPUT_DIR) prefix= all install_headers

$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile)
$(LIBBPF_OUTPUT) | $(HOST_OBJ_DIR) $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR)
ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD)
EXTRA_CFLAGS='-g -O0'
OUTPUT=$(HOST_OBJ_DIR)/
LIBBPF_OUTPUT=$(HOST_LIBBPF_OUTPUT)
LIBBPF_DESTDIR=$(HOST_LIBBPF_DESTDIR)
prefix= DESTDIR=$(HOST_DESTDIR) install-bin

$(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

$(SCXOBJ_DIR)/%.bpf.o: %.bpf.c $(INCLUDE_DIR)/vmlinux.h | $(BPFOBJ) $(SCXOBJ_DIR) $(call msg,CLNG-BPF,,$(notdir $@)) $(Q)$(CLANG) $(BPF_CFLAGS) -target bpf -c $< -o $@

$(INCLUDE_DIR)/%.bpf.skel.h: $(SCXOBJ_DIR)/%.bpf.o $(INCLUDE_DIR)/vmlinux.h $(BPFTOOL) | $(INCLUDE_DIR) $(eval sched=$(notdir $@)) $(call msg,GEN-SKEL,,$(sched)) $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $< $(Q)$(BPFTOOL) gen object $(<:.o=.linked2.o) $(<:.o=.linked1.o) $(Q)$(BPFTOOL) gen object $(<:.o=.linked3.o) $(<:.o=.linked2.o) $(Q)diff $(<:.o=.linked2.o) $(<:.o=.linked3.o) $(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $@ $(Q)$(BPFTOOL) gen subskeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $(@:.skel.h=.subskel.h)

################

C schedulers

################

override define CLEAN rm -rf $(OUTPUT_DIR) rm -f $(TEST_GEN_PROGS) endef

Every testcase takes all of the BPF progs are dependencies by default. This

allows testcases to load any BPF scheduler, which is useful for testcases

that don't need their own prog to run their test.

all_test_bpfprogs := $(foreach prog,$(wildcard *.bpf.c),$(INCLUDE_DIR)/$(patsubst %.c,%.skel.h,$(prog)))

auto-test-targets :=
create_dsq
enq_last_no_enq_fails
enq_select_cpu_fails
ddsp_bogus_dsq_fail
ddsp_vtimelocal_fail
dsp_local_on
exit
hotplug
init_enable_count
maximal
maybe_null
minimal
prog_run
reload_loop
select_cpu_dfl
select_cpu_dfl_nodispatch
select_cpu_dispatch
select_cpu_dispatch_bad_dsq
select_cpu_dispatch_dbl_dsp
select_cpu_vtime
test_example \

testcase-targets := $(addsuffix .o,$(addprefix $(SCXOBJ_DIR)/,$(auto-test-targets)))

$(SCXOBJ_DIR)/runner.o: runner.c | $(SCXOBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@

Create all of the test targets object files, whose testcase objects will be

registered into the runner in ELF constructors.

Note that we must do double expansion here in order to support conditionally

compiling BPF object files only if one is present, as the wildcard Make

function doesn't support using implicit rules otherwise.

$(testcase-targets): $(SCXOBJ_DIR)/%.o: %.c $(SCXOBJ_DIR)/runner.o $(all_test_bpfprogs) | $(SCXOBJ_DIR) $(eval test=$(patsubst %.o,%.c,$(notdir $@))) $(CC) $(CFLAGS) -c $< -o $@

$(SCXOBJ_DIR)/util.o: util.c | $(SCXOBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@

$(OUTPUT)/runner: $(SCXOBJ_DIR)/runner.o $(SCXOBJ_DIR)/util.o $(BPFOBJ) $(testcase-targets) @echo "$(testcase-targets)" $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

.DEFAULT_GOAL := all

.DELETE_ON_ERROR:

.SECONDARY: