| 1 |
|
| 2 |
|
| 3 | include ../../../build/Build.include
|
| 4 | include ../../../scripts/Makefile.arch
|
| 5 | include ../../../scripts/Makefile.include
|
| 6 |
|
| 7 | TEST_GEN_PROGS := runner
|
| 8 |
|
| 9 |
|
| 10 | OVERRIDE_TARGETS := 1
|
| 11 | include ../lib.mk
|
| 12 |
|
| 13 | CURDIR := $(abspath .)
|
| 14 | REPOROOT := $(abspath ../../../..)
|
| 15 | TOOLSDIR := $(REPOROOT)/tools
|
| 16 | LIBDIR := $(TOOLSDIR)/lib
|
| 17 | BPFDIR := $(LIBDIR)/bpf
|
| 18 | TOOLSINCDIR := $(TOOLSDIR)/include
|
| 19 | BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
|
| 20 | APIDIR := $(TOOLSINCDIR)/uapi
|
| 21 | GENDIR := $(REPOROOT)/include/generated
|
| 22 | GENHDR := $(GENDIR)/autoconf.h
|
| 23 | SCXTOOLSDIR := $(TOOLSDIR)/sched_ext
|
| 24 | SCXTOOLSINCDIR := $(TOOLSDIR)/sched_ext/include
|
| 25 |
|
| 26 | OUTPUT_DIR := $(OUTPUT)/build
|
| 27 | OBJ_DIR := $(OUTPUT_DIR)/obj
|
| 28 | INCLUDE_DIR := $(OUTPUT_DIR)/include
|
| 29 | BPFOBJ_DIR := $(OBJ_DIR)/libbpf
|
| 30 | SCXOBJ_DIR := $(OBJ_DIR)/sched_ext
|
| 31 | BPFOBJ := $(BPFOBJ_DIR)/libbpf.a
|
| 32 | LIBBPF_OUTPUT := $(OBJ_DIR)/libbpf/libbpf.a
|
| 33 |
|
| 34 | DEFAULT_BPFTOOL := $(OUTPUT_DIR)/host/sbin/bpftool
|
| 35 | HOST_OBJ_DIR := $(OBJ_DIR)/host/bpftool
|
| 36 | HOST_LIBBPF_OUTPUT := $(OBJ_DIR)/host/libbpf/
|
| 37 | HOST_LIBBPF_DESTDIR := $(OUTPUT_DIR)/host/
|
| 38 | HOST_DESTDIR := $(OUTPUT_DIR)/host/
|
| 39 |
|
| 40 | VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
|
| 41 | $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
| 42 | ../../../../vmlinux \
|
| 43 | /sys/kernel/btf/vmlinux \
|
| 44 | /boot/vmlinux-$(shell uname -r)
|
| 45 | VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
|
| 46 | ifeq ($(VMLINUX_BTF),)
|
| 47 | $(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
|
| 48 | endif
|
| 49 |
|
| 50 | BPFTOOL ?= $(DEFAULT_BPFTOOL)
|
| 51 |
|
| 52 | ifneq ($(wildcard $(GENHDR)),)
|
| 53 | GENFLAGS := -DHAVE_GENHDR
|
| 54 | endif
|
| 55 |
|
| 56 | CFLAGS += -g -O2 -rdynamic -pthread -Wall -Werror $(GENFLAGS) \
|
| 57 | -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) \
|
| 58 | -I$(TOOLSINCDIR) -I$(APIDIR) -I$(CURDIR)/include -I$(SCXTOOLSINCDIR)
|
| 59 |
|
| 60 |
|
| 61 | ifneq ($(LLVM),)
|
| 62 | CFLAGS += -Wno-unused-command-line-argument
|
| 63 | endif
|
| 64 |
|
| 65 | LDFLAGS = -lelf -lz -lpthread -lzstd
|
| 66 |
|
| 67 | IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
|
| 68 | grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
|
| 69 |
|
| 70 |
|
| 71 |
|
| 72 |
|
| 73 |
|
| 74 |
|
| 75 |
|
| 76 | define get_sys_includes
|
| 77 | $(shell $(1) $(2) -v -E - </dev/null 2>&1 \
|
| 78 | | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
|
| 79 | $(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')
|
| 80 | endef
|
| 81 |
|
| 82 | ifneq ($(CROSS_COMPILE),)
|
| 83 | CLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%))
|
| 84 | endif
|
| 85 |
|
| 86 | CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))
|
| 87 |
|
| 88 | BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) \
|
| 89 | $(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) \
|
| 90 | -I$(CURDIR)/include -I$(CURDIR)/include/bpf-compat \
|
| 91 | -I$(INCLUDE_DIR) -I$(APIDIR) -I$(SCXTOOLSINCDIR) \
|
| 92 | -I$(REPOROOT)/include \
|
| 93 | $(CLANG_SYS_INCLUDES) \
|
| 94 | -Wall -Wno-compare-distinct-pointer-types \
|
| 95 | -Wno-incompatible-function-pointer-types \
|
| 96 | -Wno-microsoft-anon-tag \
|
| 97 | -fms-extensions \
|
| 98 | -O2 -mcpu=v3
|
| 99 |
|
| 100 |
|
| 101 | MAKE_DIRS := $(sort $(OBJ_DIR)/libbpf $(OBJ_DIR)/libbpf \
|
| 102 | $(OBJ_DIR)/bpftool $(OBJ_DIR)/resolve_btfids \
|
| 103 | $(HOST_OBJ_DIR) $(INCLUDE_DIR) $(SCXOBJ_DIR))
|
| 104 |
|
| 105 | $(MAKE_DIRS):
|
| 106 | $(call msg,MKDIR,,$@)
|
| 107 | $(Q)mkdir -p $@
|
| 108 |
|
| 109 | $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
|
| 110 | $(APIDIR)/linux/bpf.h \
|
| 111 | | $(OBJ_DIR)/libbpf
|
| 112 | $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(OBJ_DIR)/libbpf/ \
|
| 113 | ARCH=$(ARCH) CC="$(CC)" CROSS_COMPILE=$(CROSS_COMPILE) \
|
| 114 | EXTRA_CFLAGS='-g -O0 -fPIC' \
|
| 115 | DESTDIR=$(OUTPUT_DIR) prefix= all install_headers
|
| 116 |
|
| 117 | $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
|
| 118 | $(LIBBPF_OUTPUT) | $(HOST_OBJ_DIR)
|
| 119 | $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \
|
| 120 | ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \
|
| 121 | EXTRA_CFLAGS='-g -O0' \
|
| 122 | OUTPUT=$(HOST_OBJ_DIR)/ \
|
| 123 | LIBBPF_OUTPUT=$(HOST_LIBBPF_OUTPUT) \
|
| 124 | LIBBPF_DESTDIR=$(HOST_LIBBPF_DESTDIR) \
|
| 125 | prefix= DESTDIR=$(HOST_DESTDIR) install-bin
|
| 126 |
|
| 127 | $(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
|
| 128 | ifeq ($(VMLINUX_H),)
|
| 129 | $(call msg,GEN,,$@)
|
| 130 | $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
|
| 131 | else
|
| 132 | $(call msg,CP,,$@)
|
| 133 | $(Q)cp "$(VMLINUX_H)" $@
|
| 134 | endif
|
| 135 |
|
| 136 | $(SCXOBJ_DIR)/%.bpf.o: %.bpf.c $(INCLUDE_DIR)/vmlinux.h | $(BPFOBJ) $(SCXOBJ_DIR)
|
| 137 | $(call msg,CLNG-BPF,,$(notdir $@))
|
| 138 | $(Q)$(CLANG) $(BPF_CFLAGS) -target bpf -c $< -o $@
|
| 139 |
|
| 140 | $(INCLUDE_DIR)/%.bpf.skel.h: $(SCXOBJ_DIR)/%.bpf.o $(INCLUDE_DIR)/vmlinux.h $(BPFTOOL) | $(INCLUDE_DIR)
|
| 141 | $(eval sched=$(notdir $@))
|
| 142 | $(call msg,GEN-SKEL,,$(sched))
|
| 143 | $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $<
|
| 144 | $(Q)$(BPFTOOL) gen object $(<:.o=.linked2.o) $(<:.o=.linked1.o)
|
| 145 | $(Q)$(BPFTOOL) gen object $(<:.o=.linked3.o) $(<:.o=.linked2.o)
|
| 146 | $(Q)diff $(<:.o=.linked2.o) $(<:.o=.linked3.o)
|
| 147 | $(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $@
|
| 148 | $(Q)$(BPFTOOL) gen subskeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $(@:.skel.h=.subskel.h)
|
| 149 |
|
| 150 |
|
| 151 |
|
| 152 |
|
| 153 |
|
| 154 | override define CLEAN
|
| 155 | rm -rf $(OUTPUT_DIR)
|
| 156 | rm -f $(TEST_GEN_PROGS)
|
| 157 | endef
|
| 158 |
|
| 159 |
|
| 160 |
|
| 161 |
|
| 162 | all_test_bpfprogs := $(foreach prog,$(wildcard *.bpf.c),$(INCLUDE_DIR)/$(patsubst %.c,%.skel.h,$(prog)))
|
| 163 |
|
| 164 | auto-test-targets := \
|
| 165 | create_dsq \
|
| 166 | dequeue \
|
| 167 | dequeue_iter \
|
| 168 | dequeue_remote \
|
| 169 | enq_last_no_enq_fails \
|
| 170 | ddsp_bogus_dsq_fail \
|
| 171 | ddsp_vtimelocal_fail \
|
| 172 | dsp_local_on \
|
| 173 | enable_cmask \
|
| 174 | enq_select_cpu \
|
| 175 | exit \
|
| 176 | hotplug \
|
| 177 | init_enable_count \
|
| 178 | maximal \
|
| 179 | maybe_null \
|
| 180 | minimal \
|
| 181 | non_scx_kfunc_deny \
|
| 182 | nohz_tick \
|
| 183 | numa \
|
| 184 | allowed_cpus \
|
| 185 | peek_dsq \
|
| 186 | prog_run \
|
| 187 | reload_loop \
|
| 188 | select_cpu_dfl \
|
| 189 | select_cpu_dfl_nodispatch \
|
| 190 | select_cpu_dispatch \
|
| 191 | select_cpu_dispatch_bad_dsq \
|
| 192 | select_cpu_dispatch_dbl_dsp \
|
| 193 | select_cpu_vtime \
|
| 194 | rt_stall \
|
| 195 | test_example \
|
| 196 | total_bw \
|
| 197 | cyclic_kick_wait \
|
| 198 |
|
| 199 | testcase-targets := $(addsuffix .o,$(addprefix $(SCXOBJ_DIR)/,$(auto-test-targets)))
|
| 200 |
|
| 201 | $(SCXOBJ_DIR)/runner.o: runner.c | $(SCXOBJ_DIR) $(BPFOBJ)
|
| 202 | $(CC) $(CFLAGS) -c $< -o $@
|
| 203 |
|
| 204 |
|
| 205 |
|
| 206 |
|
| 207 |
|
| 208 |
|
| 209 |
|
| 210 | $(testcase-targets): $(SCXOBJ_DIR)/%.o: %.c $(SCXOBJ_DIR)/runner.o $(all_test_bpfprogs) | $(SCXOBJ_DIR)
|
| 211 | $(eval test=$(patsubst %.o,%.c,$(notdir $@)))
|
| 212 | $(CC) $(CFLAGS) -c $< -o $@
|
| 213 |
|
| 214 | $(SCXOBJ_DIR)/util.o: util.c | $(SCXOBJ_DIR)
|
| 215 | $(CC) $(CFLAGS) -c $< -o $@
|
| 216 |
|
| 217 | $(OUTPUT)/runner: $(SCXOBJ_DIR)/runner.o $(SCXOBJ_DIR)/util.o $(BPFOBJ) $(testcase-targets)
|
| 218 | @echo "$(testcase-targets)"
|
| 219 | $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
| 220 |
|
| 221 | .DEFAULT_GOAL := all
|
| 222 |
|
| 223 | .DELETE_ON_ERROR:
|
| 224 |
|
| 225 | .SECONDARY:
|