[PATCH virtme-docker 3/3] bpf: add bpftests support

Geliang Tang posted 3 patches 7 months, 1 week ago
[PATCH virtme-docker 3/3] bpf: add bpftests support
Posted by Geliang Tang 7 months, 1 week ago
This patch builds bpf tests after building other mptcp selftests in bft
mode. And add run_bpftest_all to run bpftests.

Disable IA32_EMULATION config to fix this error:

./include/linux/if.h:28:10: fatal error: sys/socket.h: no such file or directory

Signed-off-by: Geliang Tang <geliang@kernel.org>
---
 Dockerfile    |  1 +
 entrypoint.sh | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/Dockerfile b/Dockerfile
index cbc11f7..77d7423 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -26,6 +26,7 @@ RUN apt-get update && \
 		wget xz-utils lftp cpio u-boot-tools \
 		cscope \
 		bpftrace \
+		python3-docutils \
 		&& \
 	apt-get clean
 
diff --git a/entrypoint.sh b/entrypoint.sh
index caddd5f..c334cf6 100755
--- a/entrypoint.sh
+++ b/entrypoint.sh
@@ -87,6 +87,8 @@ VIRTME_RUN_EXPECT="${VIRTME_SCRIPTS_DIR}/virtme.expect"
 
 SELFTESTS_DIR="${INPUT_SELFTESTS_DIR:-tools/testing/selftests/net/mptcp}"
 SELFTESTS_CONFIG="${SELFTESTS_DIR}/config"
+BPFTESTS_DIR="${INPUT_BPFTESTS_DIR:-tools/testing/selftests/bpf}"
+BPFTESTS_CONFIG="${BPFTESTS_DIR}/config"
 
 export CCACHE_MAXSIZE="${INPUT_CCACHE_MAXSIZE}"
 export CCACHE_DIR="${VIRTME_WORKDIR}/ccache"
@@ -349,6 +351,13 @@ gen_kconfig() { local mode kconfig=()
 	# Extra options are needed for kselftests
 	./scripts/kconfig/merge_config.sh -m "${VIRTME_KCONFIG}" "${SELFTESTS_CONFIG}"
 
+	if [ "${mode}" = "btf" ]; then
+		# Extra options are needed for bpftests
+		./scripts/kconfig/merge_config.sh -m "${VIRTME_KCONFIG}" "${BPFTESTS_CONFIG}"
+		kconfig+=(-e DEBUG_INFO_BTF_MODULES -e MODULE_ALLOW_BTF_MISMATCH)
+		kconfig+=(-d IA32_EMULATION)
+	fi
+
 	./scripts/config --file "${VIRTME_KCONFIG}" "${kconfig[@]}"
 
 	_make_o olddefconfig
@@ -416,6 +425,21 @@ build_selftests() {
 	_make_o KHDR_INCLUDES="-I${VIRTME_BUILD_DIR}/include" -C "${SELFTESTS_DIR}"
 }
 
+build_bpftests() {
+	if [ "${INPUT_BUILD_SKIP_BPFTESTS}" = 1 ]; then
+		printinfo "Skip bpftests build"
+		return 0
+	fi
+
+	rm -rf ${BPFTESTS_DIR}/{test_progs,bpf_testmod.ko,test_progs-no_alu32,no_alu32}
+
+	_make_o KHDR_INCLUDES="-I${VIRTME_BUILD_DIR}/include" -C "${BPFTESTS_DIR}"
+
+	ln -s ${VIRTME_BUILD_DIR}/{test_progs,bpf_testmod.ko,test_progs-no_alu32,no_alu32} ${BPFTESTS_DIR}/
+	printf "#!/bin/sh\n\n./test_progs -t mptcp\n./test_progs-no_alu32 -t mptcp" > ${BPFTESTS_DIR}/bpf_selftest.sh
+	chmod +x ${BPFTESTS_DIR}/bpf_selftest.sh
+}
+
 build_packetdrill() { local old_pwd kversion kver_maj kver_min branch
 	if [ "${INPUT_BUILD_SKIP_PACKETDRILL}" = 1 ]; then
 		printinfo "Skip Packetdrill build"
@@ -503,6 +527,9 @@ prepare() { local mode no_tap=1
 	printinfo "Prepare the environment"
 
 	build_selftests
+	if [ "${mode}" = "btf" ]; then
+		build_bpftests
+	fi
 	build_packetdrill
 	prepare_hosts_file
 
@@ -760,11 +787,39 @@ run_packetdrill_all() { local pktd_dir rc=0
 	return \${rc}
 }
 
+# \$1: output tap file; rest: command to launch
+_run_bpftest_one_tap() {
+	cd "${KERNEL_SRC}/${BPFTESTS_DIR}"
+	_tap "\${@}"
+}
+
+# \$1: script file; rest: command to launch
+run_bpftest_one() { local sf tap
+	sf=\$(basename \${1})
+	tap=bpftest_\${sf:0:-3}
+	shift
+
+	_can_run "\${tap}" || return 0
+
+	_run_bpftest_one_tap "${RESULTS_DIR}/\${tap}" "./\${sf}" "\${@}"
+}
+
+run_bpftest_all() { local sf rc=0
+	sf=${KERNEL_SRC}/${BPFTESTS_DIR}/bpf_selftest.sh
+	if [ -e "\${sf}" ]; then
+		run_bpftest_one "\${sf}" || rc=\${?}
+		rm -rf "\${sf}"
+	fi
+
+	return \${rc}
+}
+
 run_all() {
 	run_kunit_all
 	run_selftest_all
 	run_mptcp_connect_mmap
 	run_packetdrill_all
+	run_bpftest_all
 }
 
 has_call_trace() {
-- 
2.40.1