Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'local-vmtest-enhancement-and-rv64-enabled'

Pu Lehui says:

====================
Local vmtest enhancement and RV64 enabled

Patch 1-3 fix some problem about bpf selftests. Patch 4 add local rootfs
image support for vmtest. Patch 5 enable cross-platform testing for
vmtest. Patch 6-10 enable vmtest on RV64.

We can now perform cross platform testing for riscv64 bpf using the
following command:

PLATFORM=riscv64 CROSS_COMPILE=riscv64-linux-gnu- \
tools/testing/selftests/bpf/vmtest.sh \
-l <path of local rootfs image> -- \
./test_progs -d \
\"$(cat tools/testing/selftests/bpf/DENYLIST.riscv64 \
| cut -d'#' -f1 \
| sed -e 's/^[[:space:]]*//' \
-e 's/[[:space:]]*$//' \
| tr -s '\n' ',' \
)\"

For better regression, we rely on commit [0]. And since the work of riscv
ftrace to remove stop_machine atomic replacement is in progress, we also
need to revert commit [1] [2].

The test platform is x86_64 architecture, and the versions of relevant
components are as follows:
QEMU: 8.2.0
CLANG: 17.0.6 (align to BPF CI)
ROOTFS: ubuntu noble (generated by [3])

Link: https://lore.kernel.org/all/20240831071520.1630360-1-pulehui@huaweicloud.com/ [0]
Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3308172276db [1]
Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7caa9765465f [2]
Link: https://github.com/libbpf/ci/blob/main/rootfs/mkrootfs_debian.sh [3]

v3:
- Use llvm static linking when detecting that feature-llvm is enabled
- Add Acked-by by Eduard

v2: https://lore.kernel.org/all/20240904141951.1139090-1-pulehui@huaweicloud.com/
- Drop patch about relaxing Zbb insns restrictions.
- Add local rootfs image support
- Add description about running vmtest on RV64
- Fix some problem about bpf selftests

v1: https://lore.kernel.org/all/20240328124916.293173-1-pulehui@huaweicloud.com/
====================

Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Tested-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/r/20240905081401.1894789-1-pulehui@huaweicloud.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

+205 -45
+3
tools/testing/selftests/bpf/DENYLIST.riscv64
··· 1 + # riscv64 deny list for BPF CI and local vmtest 2 + exceptions # JIT does not support exceptions 3 + tailcalls/tailcall_bpf2bpf* # JIT does not support mixing bpf2bpf and tailcalls
+9 -5
tools/testing/selftests/bpf/Makefile
··· 187 187 FEATURE_DISPLAY := $(FEATURE_TESTS) 188 188 189 189 # Makefile.feature expects OUTPUT to end with a slash 190 + ifeq ($(shell expr $(MAKE_VERSION) \>= 4.4), 1) 190 191 $(let OUTPUT,$(OUTPUT)/,\ 191 192 $(eval include ../../../build/Makefile.feature)) 193 + else 194 + OUTPUT := $(OUTPUT)/ 195 + $(eval include ../../../build/Makefile.feature) 196 + OUTPUT := $(patsubst %/,%,$(OUTPUT)) 197 + endif 192 198 endif 193 199 194 200 ifeq ($(feature-llvm),1) ··· 202 196 LLVM_CONFIG_LIB_COMPONENTS := mcdisassembler all-targets 203 197 # both llvm-config and lib.mk add -D_GNU_SOURCE, which ends up as conflict 204 198 LLVM_CFLAGS += $(filter-out -D_GNU_SOURCE,$(shell $(LLVM_CONFIG) --cflags)) 205 - LLVM_LDLIBS += $(shell $(LLVM_CONFIG) --libs $(LLVM_CONFIG_LIB_COMPONENTS)) 206 - ifeq ($(shell $(LLVM_CONFIG) --shared-mode),static) 207 - LLVM_LDLIBS += $(shell $(LLVM_CONFIG) --system-libs $(LLVM_CONFIG_LIB_COMPONENTS)) 208 - LLVM_LDLIBS += -lstdc++ 209 - endif 199 + LLVM_LDLIBS += $(shell $(LLVM_CONFIG) --link-static --libs $(LLVM_CONFIG_LIB_COMPONENTS)) 200 + LLVM_LDLIBS += $(shell $(LLVM_CONFIG) --link-static --system-libs $(LLVM_CONFIG_LIB_COMPONENTS)) 201 + LLVM_LDLIBS += -lstdc++ 210 202 LLVM_LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags) 211 203 endif 212 204
+31 -1
tools/testing/selftests/bpf/README.rst
··· 85 85 If you want to change pahole and llvm, you can change `PATH` environment 86 86 variable in the beginning of script. 87 87 88 - .. note:: The script currently only supports x86_64 and s390x architectures. 88 + Running vmtest on RV64 89 + ====================== 90 + To speed up testing and avoid various dependency issues, it is recommended to 91 + run vmtest in a Docker container. Before running vmtest, we need to prepare 92 + Docker container and local rootfs image. The overall steps are as follows: 93 + 94 + 1. Create Docker container as shown in link [0]. 95 + 96 + 2. Use mkrootfs_debian.sh script [1] to build local rootfs image: 97 + 98 + .. code-block:: console 99 + 100 + $ sudo ./mkrootfs_debian.sh --arch riscv64 --distro noble 101 + 102 + 3. Start Docker container [0] and run vmtest in the container: 103 + 104 + .. code-block:: console 105 + 106 + $ PLATFORM=riscv64 CROSS_COMPILE=riscv64-linux-gnu- \ 107 + tools/testing/selftests/bpf/vmtest.sh \ 108 + -l <path of local rootfs image> -- \ 109 + ./test_progs -d \ 110 + \"$(cat tools/testing/selftests/bpf/DENYLIST.riscv64 \ 111 + | cut -d'#' -f1 \ 112 + | sed -e 's/^[[:space:]]*//' \ 113 + -e 's/[[:space:]]*$//' \ 114 + | tr -s '\n' ',' \ 115 + )\" 116 + 117 + Link: https://github.com/pulehui/riscv-bpf-vmtest.git [0] 118 + Link: https://github.com/libbpf/ci/blob/main/rootfs/mkrootfs_debian.sh [1] 89 119 90 120 Additional information about selftest failures are 91 121 documented here.
+84
tools/testing/selftests/bpf/config.riscv64
··· 1 + CONFIG_AUDIT=y 2 + CONFIG_BLK_CGROUP=y 3 + CONFIG_BLK_DEV_INITRD=y 4 + CONFIG_BLK_DEV_RAM=y 5 + CONFIG_BONDING=y 6 + CONFIG_BPF_JIT_ALWAYS_ON=y 7 + CONFIG_BPF_PRELOAD=y 8 + CONFIG_BPF_PRELOAD_UMD=y 9 + CONFIG_CGROUPS=y 10 + CONFIG_CGROUP_CPUACCT=y 11 + CONFIG_CGROUP_DEVICE=y 12 + CONFIG_CGROUP_FREEZER=y 13 + CONFIG_CGROUP_HUGETLB=y 14 + CONFIG_CGROUP_NET_CLASSID=y 15 + CONFIG_CGROUP_PERF=y 16 + CONFIG_CGROUP_PIDS=y 17 + CONFIG_CGROUP_SCHED=y 18 + CONFIG_CPUSETS=y 19 + CONFIG_DEBUG_ATOMIC_SLEEP=y 20 + CONFIG_DEBUG_FS=y 21 + CONFIG_DETECT_HUNG_TASK=y 22 + CONFIG_DEVTMPFS=y 23 + CONFIG_DEVTMPFS_MOUNT=y 24 + CONFIG_EXPERT=y 25 + CONFIG_EXT4_FS=y 26 + CONFIG_EXT4_FS_POSIX_ACL=y 27 + CONFIG_EXT4_FS_SECURITY=y 28 + CONFIG_FRAME_POINTER=y 29 + CONFIG_HARDLOCKUP_DETECTOR=y 30 + CONFIG_HIGH_RES_TIMERS=y 31 + CONFIG_HUGETLBFS=y 32 + CONFIG_INET=y 33 + CONFIG_IPV6_SEG6_LWTUNNEL=y 34 + CONFIG_IP_ADVANCED_ROUTER=y 35 + CONFIG_IP_MULTICAST=y 36 + CONFIG_IP_MULTIPLE_TABLES=y 37 + CONFIG_JUMP_LABEL=y 38 + CONFIG_KALLSYMS_ALL=y 39 + CONFIG_KPROBES=y 40 + CONFIG_MEMCG=y 41 + CONFIG_NAMESPACES=y 42 + CONFIG_NET=y 43 + CONFIG_NETDEVICES=y 44 + CONFIG_NETFILTER_XT_MATCH_BPF=y 45 + CONFIG_NET_ACT_BPF=y 46 + CONFIG_NET_L3_MASTER_DEV=y 47 + CONFIG_NET_VRF=y 48 + CONFIG_NONPORTABLE=y 49 + CONFIG_NO_HZ_IDLE=y 50 + CONFIG_NR_CPUS=256 51 + CONFIG_PACKET=y 52 + CONFIG_PANIC_ON_OOPS=y 53 + CONFIG_PARTITION_ADVANCED=y 54 + CONFIG_PCI=y 55 + CONFIG_PCI_HOST_GENERIC=y 56 + CONFIG_POSIX_MQUEUE=y 57 + CONFIG_PRINTK_TIME=y 58 + CONFIG_PROC_KCORE=y 59 + CONFIG_PROFILING=y 60 + CONFIG_RCU_CPU_STALL_TIMEOUT=60 61 + CONFIG_RISCV_EFFICIENT_UNALIGNED_ACCESS=y 62 + CONFIG_RISCV_ISA_C=y 63 + CONFIG_RISCV_PMU=y 64 + CONFIG_RISCV_PMU_SBI=y 65 + CONFIG_RT_GROUP_SCHED=y 66 + CONFIG_SECURITY_NETWORK=y 67 + CONFIG_SERIAL_8250=y 68 + CONFIG_SERIAL_8250_CONSOLE=y 69 + CONFIG_SERIAL_OF_PLATFORM=y 70 + CONFIG_SMP=y 71 + CONFIG_SOC_VIRT=y 72 + CONFIG_SYSVIPC=y 73 + CONFIG_TCP_CONG_ADVANCED=y 74 + CONFIG_TLS=y 75 + CONFIG_TMPFS=y 76 + CONFIG_TMPFS_POSIX_ACL=y 77 + CONFIG_TUN=y 78 + CONFIG_UNIX=y 79 + CONFIG_UPROBES=y 80 + CONFIG_USER_NS=y 81 + CONFIG_VETH=y 82 + CONFIG_VLAN_8021Q=y 83 + CONFIG_VSOCKETS_LOOPBACK=y 84 + CONFIG_XFRM_USER=y
+1 -1
tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
··· 285 285 dctcp_skel = bpf_dctcp__open(); 286 286 if (!ASSERT_OK_PTR(dctcp_skel, "dctcp_skel")) 287 287 return; 288 - strcpy(dctcp_skel->rodata->fallback, "cubic"); 288 + strcpy(dctcp_skel->rodata->fallback_cc, "cubic"); 289 289 if (!ASSERT_OK(bpf_dctcp__load(dctcp_skel), "bpf_dctcp__load")) 290 290 goto done; 291 291
+4 -4
tools/testing/selftests/bpf/progs/bpf_dctcp.c
··· 26 26 27 27 char _license[] SEC("license") = "GPL"; 28 28 29 - volatile const char fallback[TCP_CA_NAME_MAX]; 29 + volatile const char fallback_cc[TCP_CA_NAME_MAX]; 30 30 const char bpf_dctcp[] = "bpf_dctcp"; 31 31 const char tcp_cdg[] = "cdg"; 32 32 char cc_res[TCP_CA_NAME_MAX]; ··· 71 71 struct bpf_dctcp *ca = inet_csk_ca(sk); 72 72 int *stg; 73 73 74 - if (!(tp->ecn_flags & TCP_ECN_OK) && fallback[0]) { 74 + if (!(tp->ecn_flags & TCP_ECN_OK) && fallback_cc[0]) { 75 75 /* Switch to fallback */ 76 76 if (bpf_setsockopt(sk, SOL_TCP, TCP_CONGESTION, 77 - (void *)fallback, sizeof(fallback)) == -EBUSY) 77 + (void *)fallback_cc, sizeof(fallback_cc)) == -EBUSY) 78 78 ebusy_cnt++; 79 79 80 80 /* Switch back to myself and the recurred bpf_dctcp_init() ··· 87 87 88 88 /* Switch back to fallback */ 89 89 if (bpf_setsockopt(sk, SOL_TCP, TCP_CONGESTION, 90 - (void *)fallback, sizeof(fallback)) == -EBUSY) 90 + (void *)fallback_cc, sizeof(fallback_cc)) == -EBUSY) 91 91 ebusy_cnt++; 92 92 93 93 /* Expecting -ENOTSUPP for tcp_cdg_res */
+73 -34
tools/testing/selftests/bpf/vmtest.sh
··· 1 1 #!/bin/bash 2 2 # SPDX-License-Identifier: GPL-2.0 3 3 4 - set -u 5 4 set -e 6 5 7 - # This script currently only works for x86_64 and s390x, as 8 - # it is based on the VM image used by the BPF CI, which is 9 - # available only for these architectures. 10 - ARCH="$(uname -m)" 11 - case "${ARCH}" in 6 + # This script currently only works for the following platforms, 7 + # as it is based on the VM image used by the BPF CI, which is 8 + # available only for these architectures. We can also specify 9 + # the local rootfs image generated by the following script: 10 + # https://github.com/libbpf/ci/blob/main/rootfs/mkrootfs_debian.sh 11 + PLATFORM="${PLATFORM:-$(uname -m)}" 12 + case "${PLATFORM}" in 12 13 s390x) 13 14 QEMU_BINARY=qemu-system-s390x 14 15 QEMU_CONSOLE="ttyS1" 15 - QEMU_FLAGS=(-smp 2) 16 + HOST_FLAGS=(-smp 2 -enable-kvm) 17 + CROSS_FLAGS=(-smp 2) 16 18 BZIMAGE="arch/s390/boot/vmlinux" 19 + ARCH="s390" 17 20 ;; 18 21 x86_64) 19 22 QEMU_BINARY=qemu-system-x86_64 20 23 QEMU_CONSOLE="ttyS0,115200" 21 - QEMU_FLAGS=(-cpu host -smp 8) 24 + HOST_FLAGS=(-cpu host -enable-kvm -smp 8) 25 + CROSS_FLAGS=(-smp 8) 22 26 BZIMAGE="arch/x86/boot/bzImage" 27 + ARCH="x86" 23 28 ;; 24 29 aarch64) 25 30 QEMU_BINARY=qemu-system-aarch64 26 31 QEMU_CONSOLE="ttyAMA0,115200" 27 - QEMU_FLAGS=(-M virt,gic-version=3 -cpu host -smp 8) 32 + HOST_FLAGS=(-M virt,gic-version=3 -cpu host -enable-kvm -smp 8) 33 + CROSS_FLAGS=(-M virt,gic-version=3 -cpu cortex-a76 -smp 8) 28 34 BZIMAGE="arch/arm64/boot/Image" 35 + ARCH="arm64" 36 + ;; 37 + riscv64) 38 + # required qemu version v7.2.0+ 39 + QEMU_BINARY=qemu-system-riscv64 40 + QEMU_CONSOLE="ttyS0,115200" 41 + HOST_FLAGS=(-M virt -cpu host -enable-kvm -smp 8) 42 + CROSS_FLAGS=(-M virt -cpu rv64,sscofpmf=true -smp 8) 43 + BZIMAGE="arch/riscv/boot/Image" 44 + ARCH="riscv" 29 45 ;; 30 46 *) 31 47 echo "Unsupported architecture" ··· 50 34 esac 51 35 DEFAULT_COMMAND="./test_progs" 52 36 MOUNT_DIR="mnt" 37 + LOCAL_ROOTFS_IMAGE="" 53 38 ROOTFS_IMAGE="root.img" 54 39 OUTPUT_DIR="$HOME/.bpf_selftests" 55 40 KCONFIG_REL_PATHS=("tools/testing/selftests/bpf/config" 56 41 "tools/testing/selftests/bpf/config.vm" 57 - "tools/testing/selftests/bpf/config.${ARCH}") 42 + "tools/testing/selftests/bpf/config.${PLATFORM}") 58 43 INDEX_URL="https://raw.githubusercontent.com/libbpf/ci/master/INDEX" 59 44 NUM_COMPILE_JOBS="$(nproc)" 60 45 LOG_FILE_BASE="$(date +"bpf_selftests.%Y-%m-%d_%H-%M-%S")" ··· 75 58 If no command is specified and a debug shell (-s) is not requested, 76 59 "${DEFAULT_COMMAND}" will be run by default. 77 60 61 + Using PLATFORM= and CROSS_COMPILE= options will enable cross platform testing: 62 + 63 + PLATFORM=<platform> CROSS_COMPILE=<toolchain> $0 -- ./test_progs -t test_lsm 64 + 78 65 If you build your kernel using KBUILD_OUTPUT= or O= options, these 79 66 can be passed as environment variables to the script: 80 67 ··· 90 69 91 70 Options: 92 71 72 + -l) Specify the path to the local rootfs image. 93 73 -i) Update the rootfs image with a newer version. 94 74 -d) Update the output directory (default: ${OUTPUT_DIR}) 95 75 -j) Number of jobs for compilation, similar to -j in make ··· 114 92 fi 115 93 } 116 94 117 - download() 95 + newest_rootfs_version() 118 96 { 119 - local file="$1" 97 + { 98 + for file in "${!URLS[@]}"; do 99 + if [[ $file =~ ^"${PLATFORM}"/libbpf-vmtest-rootfs-(.*)\.tar\.zst$ ]]; then 100 + echo "${BASH_REMATCH[1]}" 101 + fi 102 + done 103 + } | sort -rV | head -1 104 + } 105 + 106 + download_rootfs() 107 + { 108 + populate_url_map 109 + 110 + local rootfsversion="$(newest_rootfs_version)" 111 + local file="${PLATFORM}/libbpf-vmtest-rootfs-$rootfsversion.tar.zst" 120 112 121 113 if [[ ! -v URLS[$file] ]]; then 122 114 echo "$file not found" >&2 ··· 141 105 curl -Lsf "${URLS[$file]}" "${@:2}" 142 106 } 143 107 144 - newest_rootfs_version() 108 + load_rootfs() 145 109 { 146 - { 147 - for file in "${!URLS[@]}"; do 148 - if [[ $file =~ ^"${ARCH}"/libbpf-vmtest-rootfs-(.*)\.tar\.zst$ ]]; then 149 - echo "${BASH_REMATCH[1]}" 150 - fi 151 - done 152 - } | sort -rV | head -1 153 - } 154 - 155 - download_rootfs() 156 - { 157 - local rootfsversion="$1" 158 - local dir="$2" 110 + local dir="$1" 159 111 160 112 if ! which zstd &> /dev/null; then 161 113 echo 'Could not find "zstd" on the system, please install zstd' 162 114 exit 1 163 115 fi 164 116 165 - download "${ARCH}/libbpf-vmtest-rootfs-$rootfsversion.tar.zst" | 166 - zstd -d | sudo tar -C "$dir" -x 117 + if [[ -n "${LOCAL_ROOTFS_IMAGE}" ]]; then 118 + cat "${LOCAL_ROOTFS_IMAGE}" | zstd -d | sudo tar -C "$dir" -x 119 + else 120 + download_rootfs | zstd -d | sudo tar -C "$dir" -x 121 + fi 167 122 } 168 123 169 124 recompile_kernel() ··· 254 227 mkfs.ext4 -q "${rootfs_img}" 255 228 256 229 mount_image 257 - download_rootfs "$(newest_rootfs_version)" "${mount_dir}" 230 + load_rootfs "${mount_dir}" 258 231 unmount_image 259 232 } 260 233 ··· 271 244 exit 1 272 245 fi 273 246 247 + if [[ "${PLATFORM}" != "$(uname -m)" ]]; then 248 + QEMU_FLAGS=("${CROSS_FLAGS[@]}") 249 + else 250 + QEMU_FLAGS=("${HOST_FLAGS[@]}") 251 + fi 252 + 274 253 ${QEMU_BINARY} \ 275 254 -nodefaults \ 276 255 -display none \ 277 256 -serial mon:stdio \ 278 257 "${QEMU_FLAGS[@]}" \ 279 - -enable-kvm \ 280 258 -m 4G \ 281 259 -drive file="${rootfs_img}",format=raw,index=1,media=disk,if=virtio,cache=none \ 282 260 -kernel "${kernel_bzimage}" \ ··· 373 341 local exit_command="poweroff -f" 374 342 local debug_shell="no" 375 343 376 - while getopts ':hskid:j:' opt; do 344 + while getopts ':hskl:id:j:' opt; do 377 345 case ${opt} in 346 + l) 347 + LOCAL_ROOTFS_IMAGE="$OPTARG" 348 + ;; 378 349 i) 379 350 update_image="yes" 380 351 ;; ··· 412 377 413 378 trap 'catch "$?"' EXIT 414 379 380 + if [[ "${PLATFORM}" != "$(uname -m)" ]] && [[ -z "${CROSS_COMPILE}" ]]; then 381 + echo "Cross-platform testing needs to specify CROSS_COMPILE" 382 + exit 1 383 + fi 384 + 415 385 if [[ $# -eq 0 && "${debug_shell}" == "no" ]]; then 416 386 echo "No command specified, will run ${DEFAULT_COMMAND} in the vm" 417 387 else ··· 424 384 fi 425 385 426 386 local kconfig_file="${OUTPUT_DIR}/latest.config" 427 - local make_command="make -j ${NUM_COMPILE_JOBS} KCONFIG_CONFIG=${kconfig_file}" 387 + local make_command="make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} \ 388 + -j ${NUM_COMPILE_JOBS} KCONFIG_CONFIG=${kconfig_file}" 428 389 429 390 # Figure out where the kernel is being built. 430 391 # O takes precedence over KBUILD_OUTPUT. ··· 442 401 kernel_bzimage="${KBUILD_OUTPUT}/${BZIMAGE}" 443 402 make_command="${make_command} KBUILD_OUTPUT=${KBUILD_OUTPUT}" 444 403 fi 445 - 446 - populate_url_map 447 404 448 405 local rootfs_img="${OUTPUT_DIR}/${ROOTFS_IMAGE}" 449 406 local mount_dir="${OUTPUT_DIR}/${MOUNT_DIR}"