On Sat, Nov 18, 2023 at 08:38:41PM +0100, Janpieter Sollie wrote:
> Allow the tests to run on a non-ABI-compatible cpu,
> verify code when the architecture isn't physically available.
> in the future, bcachefs-tools should be cross-compiled,
> and the list of CPU types should be expanded
>
> Signed-off-by: jpsollie <[email protected]>
> ---
> build-test-kernel | 10 ++++------
> lib/common.sh | 11 ++++++++---
> lib/libktest.sh | 8 ++++++--
> lib/testrunner | 4 ++++
> root_image | 8 +++++++-
> tests/bcachefs/bcachefs-test-libs.sh | 8 ++++++++
> tests/kconfig.sh | 2 ++
> 7 files changed, 39 insertions(+), 12 deletions(-)
>
> diff --git a/build-test-kernel b/build-test-kernel
> index 72990ba..b7dd70c 100755
> --- a/build-test-kernel
> +++ b/build-test-kernel
> @@ -107,7 +107,7 @@ ktest_kernel_source=$(readlink -e "$ktest_kernel_source")
> ktest_kernel_build="$ktest_out/kernel_build.$ktest_arch"
> mkdir -p "$ktest_kernel_build"
>
> -if [[ -n $CROSS_COMPILE ]]; then
> +if [[ ${CROSS_COMPILE+x} ]]; then
This change is uneccesary when we're using bash's [[
> checkdep "$ARCH_TRIPLE-gcc" "gcc-$ARCH_TRIPLE"
> fi
>
> @@ -121,10 +121,8 @@ run_ktest()
>
> do_make()
> {
> - if [[ -n $CROSS_COMPILE ]]; then
> - export ARCH="$KERNEL_ARCH"
> - export CROSS_COMPILE="$ARCH_TRIPLE-"
> - fi
> + local ARCH="$KERNEL_ARCH"
> + local CROSS_COMPILE="$ARCH_TRIPLE-"
Why are these needed? I don't see them referenced, since you're just
spcifying them as make args now (which is good)
>
> make --jobs="$ktest_njobs" \
> --directory="$ktest_kernel_source" \
> @@ -192,7 +190,7 @@ build_kernel()
>
> log_verbose "kernel_config_require: ${ktest_kernel_config_require[@]}"
>
> - MAKEARGS+=("LOCALVERSION=-ktest")
> + MAKEARGS+=("LOCALVERSION=-ktest" ARCH="$KERNEL_ARCH"
> CROSS_COMPILE="$ARCH_TRIPLE-")
>
> for opt in "${ktest_kernel_config_require[@]}"; do
> [[ -n $opt ]] && kernel_opt set "$opt"
> diff --git a/lib/common.sh b/lib/common.sh
> index 078f512..b94557d 100644
> --- a/lib/common.sh
> +++ b/lib/common.sh
> @@ -80,9 +80,6 @@ join_by()
> echo "$*"
> }
>
> -ktest_arch=$(uname -m)
> -CROSS_COMPILE=""
> -
> parse_arch()
> {
> case $1 in
> @@ -191,6 +188,14 @@ parse_arch()
> if [[ $ktest_arch != $(uname -m) ]]; then
> CROSS_COMPILE=1
> fi
> +
> + export DEBIAN_ARCH
> + export MIRROR
> + export ARCH_TRIPLE
> + export KERNEL_ARCH
> + export QEMU_PACKAGE
> + export QEMU_BIN
> + export ktest_arch
> }
>
> find_command() {
> diff --git a/lib/libktest.sh b/lib/libktest.sh
> index 9b4931d..8ead78b 100644
> --- a/lib/libktest.sh
> +++ b/lib/libktest.sh
> @@ -85,6 +85,7 @@ parse_ktest_arg()
>
> parse_args_post()
> {
> + [ -z ${ktest_arch:+x} ] && ktest_arch=$(uname -m)
> parse_arch "$ktest_arch"
>
> ktest_out=$(readlink -f "$ktest_out")
> @@ -306,12 +307,15 @@ start_vm()
> kernelargs+=("${ktest_kernel_append[@]}")
>
> local qemu_cmd=("$QEMU_BIN" -nodefaults -nographic)
> + local accel=kvm
> + local cputype=host
> + [[ $(uname -m) == $ktest_arch ]] || accel=tcg && cputype=max
> case $ktest_arch in
> x86|x86_64)
> - qemu_cmd+=(-cpu host -machine type=q35,accel=kvm,nvdimm=on)
> + qemu_cmd+=(-cpu $cputype -machine type=q35,accel=$accel,nvdimm=on)
> ;;
> aarch64)
> - qemu_cmd+=(-cpu host -machine type=virt,gic-version=max,accel=kvm)
> + qemu_cmd+=(-cpu $cputype -machine
> type=virt,gic-version=max,accel=$accel)
> ;;
> mips)
> qemu_cmd+=(-cpu 24Kf -machine malta)
> diff --git a/lib/testrunner b/lib/testrunner
> index acbc45f..4eb73f2 100755
> --- a/lib/testrunner
> +++ b/lib/testrunner
> @@ -20,6 +20,10 @@ ktest_out="/host/$ktest_out"
> ln -sf $ktest_dir /ktest
> ln -sf $ktest_out /ktest-out
>
> +. /ktest/lib/common.sh
> +
> +parse_arch $(uname -m)
> +
> # Some home directories are in weird places:
> mkdir -p $(dirname $home)
> ln -sf /host/$home $home
> diff --git a/root_image b/root_image
> index 26c99fe..a881714 100755
> --- a/root_image
> +++ b/root_image
> @@ -118,7 +118,12 @@ PACKAGES+=(cryptsetup)
> PACKAGES+=(multipath-tools sg3-utils srptools)
>
> # ZFS support
> -PACKAGES+=("linux-headers-generic" dkms zfsutils-linux zfs-dkms)
> +PACKAGES+=("linux-headers-generic")
> +# unless no other option when cross-compiling, ignore ZFS
> +# DKMS needs to cross-compile the module,
> +# against a different kernel on a different CPUarchitecture.
> +# this has to cause errors
> +[[ -n $CROSS_COMPILE ] && PACKAGES+=(dkms zfsutils-linux zfs-dkms)
>
> # suspend testing:
> # [[ $KERNEL_ARCH = x86 ]] && PACKAGES+=(uswsusp)
> @@ -302,6 +307,7 @@ cmd_create()
> --components='main,contrib,non-free,bullseye-backports' \
> bullseye "$MNT" "$MIRROR"
>
> + [[ -n ${CROSS_COMPILE} ]] || cp $(which qemu-${ktest_arch})
> ${MNT}$(which qemu-${ktest_arch})
What? Please explain.
> _chroot "$MNT" /debootstrap/debootstrap --second-stage
> _chroot "$MNT" dpkg --configure -a
>
> diff --git a/tests/bcachefs/bcachefs-test-libs.sh
> b/tests/bcachefs/bcachefs-test-libs.sh
> index 7167856..05996b1 100644
> --- a/tests/bcachefs/bcachefs-test-libs.sh
> +++ b/tests/bcachefs/bcachefs-test-libs.sh
> @@ -5,8 +5,16 @@
> #
>
> . $(dirname $(readlink -e "${BASH_SOURCE[0]}"))/../test-libs.sh
> +bch_loc=$(dirname $(readlink -e "${BASH_SOURCE[0]}"))/bcachefs-tools
>
> require-git http://evilpiepirate.org/git/bcachefs-tools.git
> +if [[ ! -f "${bch_loc}/.last_arch_for_compile" || "$(cat
> ${bch_loc}/.last_arch_for_compile)" != $ktest_arch ]]; then
> + make -C ${bch_loc} clean >/dev/null 2>&1;
> + rm -rf "${bch_loc}/rust-src/target/*";
> + find ${bch_loc} -name "*.o" -exec rm {} \;
> + find ${bch_loc} -name "*.a" -exec rm {} \;
> + echo $ktest_arch > ${bch_loc}/.last_arch_for_compile
make clean doesn't properly clean rust build outputs (which is a bug);
either use git clean -xfd, or fix make clean in bcachefs-tools.
> +fi
> require-make bcachefs-tools
>
> require-kernel-config BCACHEFS_FS
> diff --git a/tests/kconfig.sh b/tests/kconfig.sh
> index 68005fc..73e93db 100644
> --- a/tests/kconfig.sh
> +++ b/tests/kconfig.sh
> @@ -4,6 +4,8 @@ have_kvmguest=0
> have_virtio=0
> have_suspend=0
>
> +[ -z ${ktest_arch:+x} ] && ktest_arch=$(uname -m)
> +
> case $ktest_arch in
> x86)
> require-kernel-config SMP
> --
> 2.42.1
>