191fe48d5SPhilipp Schuster#!/usr/bin/env bash 22b2d0065SRuslan Mstoi# shellcheck disable=SC2048,SC2086 3ddce3df8SRob Bradfordset -x 4ddce3df8SRob Bradford 52b2d0065SRuslan Mstoi# shellcheck source=/dev/null 62b2d0065SRuslan Mstoisource "$HOME"/.cargo/env 72b2d0065SRuslan Mstoisource "$(dirname "$0")"/test-util.sh 8ddce3df8SRob Bradford 9ddce3df8SRob BradfordWORKLOADS_DIR="$HOME/workloads" 10ddce3df8SRob Bradfordmkdir -p "$WORKLOADS_DIR" 11ddce3df8SRob Bradford 1227b5f8d7SMuminul Islamprocess_common_args "$@" 1327b5f8d7SMuminul Islam 145b05e0cdSBo Chen# For now these values are default for kvm 151faaa2cdSBo Chentest_features="" 1627b5f8d7SMuminul Islam 176454c677SMuminul Islamif [ "$hypervisor" = "mshv" ]; then 18219716c3SBo Chen test_features="--features mshv" 196454c677SMuminul Islamfi 206454c677SMuminul Islam 212b2d0065SRuslan Mstoicp scripts/sha1sums-x86_64 "$WORKLOADS_DIR" 220223cf8cSSebastien Boeuf 2372e213ebSRob Bradforddownload_hypervisor_fw 24ddce3df8SRob Bradford 2576dbe660SThomas Barrettdownload_ovmf 26eea2907dSRob Bradford 279dba0972SSebastien BoeufFOCAL_OS_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.qcow2" 2805ec6190SRavi kumar VeeramallyFOCAL_OS_IMAGE_URL="https://ch-images.azureedge.net/$FOCAL_OS_IMAGE_NAME" 29c790bba9SRob BradfordFOCAL_OS_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_IMAGE_NAME" 30c790bba9SRob Bradfordif [ ! -f "$FOCAL_OS_IMAGE" ]; then 312b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 32c790bba9SRob Bradford time wget --quiet $FOCAL_OS_IMAGE_URL || exit 1 332b2d0065SRuslan Mstoi popd || exit 34df3e5c87SRob Bradfordfi 35df3e5c87SRob Bradford 369dba0972SSebastien BoeufFOCAL_OS_RAW_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.raw" 37c790bba9SRob BradfordFOCAL_OS_RAW_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_RAW_IMAGE_NAME" 38c790bba9SRob Bradfordif [ ! -f "$FOCAL_OS_RAW_IMAGE" ]; then 392b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 40c790bba9SRob Bradford time qemu-img convert -p -f qcow2 -O raw $FOCAL_OS_IMAGE_NAME $FOCAL_OS_RAW_IMAGE_NAME || exit 1 412b2d0065SRuslan Mstoi popd || exit 42df3e5c87SRob Bradfordfi 43df3e5c87SRob Bradford 444ef388b6SYu LiFOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0-backing.qcow2" 454ef388b6SYu LiFOCAL_OS_QCOW_BACKING_FILE_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME" 464ef388b6SYu Liif [ ! -f "$FOCAL_OS_QCOW_BACKING_FILE_IMAGE" ]; then 472b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 482b2d0065SRuslan Mstoi time qemu-img create -f qcow2 -b "$FOCAL_OS_IMAGE" -F qcow2 $FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME 492b2d0065SRuslan Mstoi popd || exit 504ef388b6SYu Lifi 514ef388b6SYu Li 52b1547c4cSRob BradfordJAMMY_OS_IMAGE_NAME="jammy-server-cloudimg-amd64-custom-20241017-0.qcow2" 5305ec6190SRavi kumar VeeramallyJAMMY_OS_IMAGE_URL="https://ch-images.azureedge.net/$JAMMY_OS_IMAGE_NAME" 540e2cb9fdSBo ChenJAMMY_OS_IMAGE="$WORKLOADS_DIR/$JAMMY_OS_IMAGE_NAME" 550e2cb9fdSBo Chenif [ ! -f "$JAMMY_OS_IMAGE" ]; then 562b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 570e2cb9fdSBo Chen time wget --quiet $JAMMY_OS_IMAGE_URL || exit 1 582b2d0065SRuslan Mstoi popd || exit 590e2cb9fdSBo Chenfi 600e2cb9fdSBo Chen 61b1547c4cSRob BradfordJAMMY_OS_RAW_IMAGE_NAME="jammy-server-cloudimg-amd64-custom-20241017-0.raw" 620e2cb9fdSBo ChenJAMMY_OS_RAW_IMAGE="$WORKLOADS_DIR/$JAMMY_OS_RAW_IMAGE_NAME" 630e2cb9fdSBo Chenif [ ! -f "$JAMMY_OS_RAW_IMAGE" ]; then 642b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 650e2cb9fdSBo Chen time qemu-img convert -p -f qcow2 -O raw $JAMMY_OS_IMAGE_NAME $JAMMY_OS_RAW_IMAGE_NAME || exit 1 662b2d0065SRuslan Mstoi popd || exit 670e2cb9fdSBo Chenfi 680e2cb9fdSBo Chen 693b470d4fSDamjan GeorgievskiALPINE_MINIROOTFS_URL="http://dl-cdn.alpinelinux.org/alpine/v3.11/releases/x86_64/alpine-minirootfs-3.11.3-x86_64.tar.gz" 703b470d4fSDamjan GeorgievskiALPINE_MINIROOTFS_TARBALL="$WORKLOADS_DIR/alpine-minirootfs-x86_64.tar.gz" 713b470d4fSDamjan Georgievskiif [ ! -f "$ALPINE_MINIROOTFS_TARBALL" ]; then 722b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 732b2d0065SRuslan Mstoi time wget --quiet $ALPINE_MINIROOTFS_URL -O "$ALPINE_MINIROOTFS_TARBALL" || exit 1 742b2d0065SRuslan Mstoi popd || exit 753b470d4fSDamjan Georgievskifi 763b470d4fSDamjan Georgievski 773b470d4fSDamjan GeorgievskiALPINE_INITRAMFS_IMAGE="$WORKLOADS_DIR/alpine_initramfs.img" 783b470d4fSDamjan Georgievskiif [ ! -f "$ALPINE_INITRAMFS_IMAGE" ]; then 792b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 803b470d4fSDamjan Georgievski mkdir alpine-minirootfs 813b470d4fSDamjan Georgievski tar xf "$ALPINE_MINIROOTFS_TARBALL" -C alpine-minirootfs 823b470d4fSDamjan Georgievski cat >alpine-minirootfs/init <<-EOF 833b470d4fSDamjan Georgievski #! /bin/sh 843b470d4fSDamjan Georgievski mount -t devtmpfs dev /dev 853b470d4fSDamjan Georgievski echo \$TEST_STRING > /dev/console 863b470d4fSDamjan Georgievski poweroff -f 873b470d4fSDamjan Georgievski EOF 883b470d4fSDamjan Georgievski chmod +x alpine-minirootfs/init 892b2d0065SRuslan Mstoi cd alpine-minirootfs || exit 903b470d4fSDamjan Georgievski find . -print0 | 913b470d4fSDamjan Georgievski cpio --null --create --verbose --owner root:root --format=newc >"$ALPINE_INITRAMFS_IMAGE" 922b2d0065SRuslan Mstoi popd || exit 933b470d4fSDamjan Georgievskifi 943b470d4fSDamjan Georgievski 952b2d0065SRuslan Mstoipushd "$WORKLOADS_DIR" || exit 962b2d0065SRuslan Mstoiif ! sha1sum sha1sums-x86_64 --check; then 97694da826SSebastien Boeuf echo "sha1sum validation of images failed, remove invalid images to fix the issue." 98694da826SSebastien Boeuf exit 1 99694da826SSebastien Boeuffi 1002b2d0065SRuslan Mstoipopd || exit 101df3e5c87SRob Bradford 102ebe04f6dSRob Bradford# Build custom kernel based on virtio-pmem and virtio-fs upstream patches 103*2b057537SBo ChenVMLINUX_IMAGE="$WORKLOADS_DIR/vmlinux-x86_64" 104103fe1f4SRob Bradfordif [ ! -f "$VMLINUX_IMAGE" ]; then 1053c05626aSRuoqing He # Prepare linux image (build from source or download pre-built) 1063c05626aSRuoqing He prepare_linux 107103fe1f4SRob Bradfordfi 108efb24478SAlejandro Jimenez 10954474519SRob BradfordVIRTIOFSD="$WORKLOADS_DIR/virtiofsd" 11054474519SRob BradfordVIRTIOFSD_DIR="virtiofsd_build" 11154474519SRob Bradfordif [ ! -f "$VIRTIOFSD" ]; then 1122b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 11354474519SRob Bradford git clone "https://gitlab.com/virtio-fs/virtiofsd.git" $VIRTIOFSD_DIR 1142b2d0065SRuslan Mstoi pushd $VIRTIOFSD_DIR || exit 11524f384d2SRavi kumar Veeramally git checkout v1.8.0 1161908f488SRob Bradford time cargo build --release 1172b2d0065SRuslan Mstoi cp target/release/virtiofsd "$VIRTIOFSD" || exit 1 1182b2d0065SRuslan Mstoi popd || exit 11954474519SRob Bradford rm -rf $VIRTIOFSD_DIR 1202b2d0065SRuslan Mstoi popd || exit 1211908f488SRob Bradfordfi 1221908f488SRob Bradford 1230a229ef4SSebastien BoeufBLK_IMAGE="$WORKLOADS_DIR/blk.img" 1240a229ef4SSebastien BoeufMNT_DIR="mount_image" 1250a229ef4SSebastien Boeufif [ ! -f "$BLK_IMAGE" ]; then 1262b2d0065SRuslan Mstoi pushd "$WORKLOADS_DIR" || exit 1272b2d0065SRuslan Mstoi fallocate -l 16M "$BLK_IMAGE" 1282b2d0065SRuslan Mstoi mkfs.ext4 -j "$BLK_IMAGE" 1290a229ef4SSebastien Boeuf mkdir $MNT_DIR 1302b2d0065SRuslan Mstoi sudo mount -t ext4 "$BLK_IMAGE" $MNT_DIR 131e5180986SRob Bradford sudo bash -c "echo bar > $MNT_DIR/foo" || exit 1 1322b2d0065SRuslan Mstoi sudo umount "$BLK_IMAGE" 1330a229ef4SSebastien Boeuf rm -r $MNT_DIR 1342b2d0065SRuslan Mstoi popd || exit 1356b06cec6SYang Zhongfi 1366b06cec6SYang Zhong 1370fcca3edSSebastien BoeufSHARED_DIR="$WORKLOADS_DIR/shared_dir" 1380fcca3edSSebastien Boeufif [ ! -d "$SHARED_DIR" ]; then 1392b2d0065SRuslan Mstoi mkdir -p "$SHARED_DIR" 1400fcca3edSSebastien Boeuf echo "foo" >"$SHARED_DIR/file1" 141e5180986SRob Bradford echo "bar" >"$SHARED_DIR/file3" || exit 1 1420fcca3edSSebastien Boeuffi 14372f3a697SRob Bradford 1445ae3144fSSamuel OrtizVFIO_DIR="$WORKLOADS_DIR/vfio" 1454ef702eaSRob BradfordVFIO_DISK_IMAGE="$WORKLOADS_DIR/vfio.img" 1462b2d0065SRuslan Mstoirm -rf "$VFIO_DIR" "$VFIO_DISK_IMAGE" 1472b2d0065SRuslan Mstoimkdir -p "$VFIO_DIR" 1482b2d0065SRuslan Mstoicp "$FOCAL_OS_RAW_IMAGE" "$VFIO_DIR" 1492b2d0065SRuslan Mstoicp "$FW" "$VFIO_DIR" 1502b2d0065SRuslan Mstoicp "$VMLINUX_IMAGE" "$VFIO_DIR" || exit 1 1515ae3144fSSamuel Ortiz 1522b2d0065SRuslan Mstoicargo build --features mshv --all --release --target "$BUILD_TARGET" 1536fde2d18SRob Bradford 1545ae3144fSSamuel Ortiz# We always copy a fresh version of our binary for our L2 guest. 1552b2d0065SRuslan Mstoicp target/"$BUILD_TARGET"/release/cloud-hypervisor "$VFIO_DIR" 1562b2d0065SRuslan Mstoicp target/"$BUILD_TARGET"/release/ch-remote "$VFIO_DIR" 1575ae3144fSSamuel Ortiz 158bdb7bcdbSSebastien Boeuf# Enable KSM with some reasonable parameters so that it won't take too long 159bdb7bcdbSSebastien Boeuf# for the memory to be merged between two processes. 160f6686036SSebastien Boeufsudo bash -c "echo 1000000 > /sys/kernel/mm/ksm/pages_to_scan" 161bdb7bcdbSSebastien Boeufsudo bash -c "echo 10 > /sys/kernel/mm/ksm/sleep_millisecs" 162bdb7bcdbSSebastien Boeufsudo bash -c "echo 1 > /sys/kernel/mm/ksm/run" 163bdb7bcdbSSebastien Boeuf 16403014e2eSSebastien Boeuf# Both test_vfio, ovs-dpdk and vDPA tests rely on hugepages 165318caeb9SRuslan MstoiHUGEPAGESIZE=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') 1662b2d0065SRuslan MstoiPAGE_NUM=$((12288 * 1024 / HUGEPAGESIZE)) 1672b2d0065SRuslan Mstoiecho "$PAGE_NUM" | sudo tee /proc/sys/vm/nr_hugepages 168e8e4f43dSRob Bradfordsudo chmod a+rwX /dev/hugepages 169e8e4f43dSRob Bradford 17003014e2eSSebastien Boeuf# Update max locked memory to 'unlimited' to avoid issues with vDPA 17103014e2eSSebastien Boeufulimit -l unlimited 17203014e2eSSebastien Boeuf 1730b6bc75dSAnatol Belski# Set number of open descriptors high enough for VFIO tests to run 1740b6bc75dSAnatol Belskiulimit -n 4096 1750b6bc75dSAnatol Belski 176f0082fecSRob Bradfordexport RUST_BACKTRACE=1 1770a3ad615SSongqian Litime cargo test --release --target "$BUILD_TARGET" $test_features "common_parallel::$test_filter" -- ${test_binary_args[*]} 17891ce39e2SRob BradfordRES=$? 1795ae3144fSSamuel Ortiz 180bb917460SSebastien Boeuf# Run some tests in sequence since the result could be affected by other tests 181bb917460SSebastien Boeuf# running in parallel. 182bb917460SSebastien Boeufif [ $RES -eq 0 ]; then 183bb917460SSebastien Boeuf export RUST_BACKTRACE=1 1840a3ad615SSongqian Li time cargo test --release --target "$BUILD_TARGET" $test_features "common_sequential::$test_filter" -- --test-threads=1 ${test_binary_args[*]} 185bb917460SSebastien Boeuf RES=$? 186bb917460SSebastien Boeuffi 187bb917460SSebastien Boeuf 1881faaa2cdSBo Chen# Run tests on dbus_api 1891faaa2cdSBo Chenif [ $RES -eq 0 ]; then 1902b2d0065SRuslan Mstoi cargo build --features "mshv,dbus_api" --all --release --target "$BUILD_TARGET" 1911faaa2cdSBo Chen export RUST_BACKTRACE=1 1921faaa2cdSBo Chen # integration tests now do not reply on build feature "dbus_api" 1931faaa2cdSBo Chen time cargo test $test_features "dbus_api::$test_filter" -- ${test_binary_args[*]} 1941faaa2cdSBo Chen RES=$? 1951faaa2cdSBo Chenfi 1961faaa2cdSBo Chen 19791ce39e2SRob Bradfordexit $RES 198