1#!/usr/bin/env bash 2# shellcheck disable=SC2048,SC2086 3set -x 4 5# shellcheck source=/dev/null 6source "$HOME"/.cargo/env 7source "$(dirname "$0")"/test-util.sh 8 9WORKLOADS_DIR="$HOME/workloads" 10mkdir -p "$WORKLOADS_DIR" 11 12process_common_args "$@" 13 14# For now these values are default for kvm 15test_features="" 16 17if [ "$hypervisor" = "mshv" ]; then 18 test_features="--features mshv" 19fi 20 21cp scripts/sha1sums-x86_64 "$WORKLOADS_DIR" 22 23download_hypervisor_fw 24 25download_ovmf 26 27FOCAL_OS_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.qcow2" 28FOCAL_OS_IMAGE_URL="https://ch-images.azureedge.net/$FOCAL_OS_IMAGE_NAME" 29FOCAL_OS_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_IMAGE_NAME" 30if [ ! -f "$FOCAL_OS_IMAGE" ]; then 31 pushd "$WORKLOADS_DIR" || exit 32 time wget --quiet $FOCAL_OS_IMAGE_URL || exit 1 33 popd || exit 34fi 35 36FOCAL_OS_RAW_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.raw" 37FOCAL_OS_RAW_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_RAW_IMAGE_NAME" 38if [ ! -f "$FOCAL_OS_RAW_IMAGE" ]; then 39 pushd "$WORKLOADS_DIR" || exit 40 time qemu-img convert -p -f qcow2 -O raw $FOCAL_OS_IMAGE_NAME $FOCAL_OS_RAW_IMAGE_NAME || exit 1 41 popd || exit 42fi 43 44FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0-backing.qcow2" 45FOCAL_OS_QCOW_BACKING_FILE_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME" 46if [ ! -f "$FOCAL_OS_QCOW_BACKING_FILE_IMAGE" ]; then 47 pushd "$WORKLOADS_DIR" || exit 48 time qemu-img create -f qcow2 -b "$FOCAL_OS_IMAGE" -F qcow2 $FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME 49 popd || exit 50fi 51 52JAMMY_OS_IMAGE_NAME="jammy-server-cloudimg-amd64-custom-20241017-0.qcow2" 53JAMMY_OS_IMAGE_URL="https://ch-images.azureedge.net/$JAMMY_OS_IMAGE_NAME" 54JAMMY_OS_IMAGE="$WORKLOADS_DIR/$JAMMY_OS_IMAGE_NAME" 55if [ ! -f "$JAMMY_OS_IMAGE" ]; then 56 pushd "$WORKLOADS_DIR" || exit 57 time wget --quiet $JAMMY_OS_IMAGE_URL || exit 1 58 popd || exit 59fi 60 61JAMMY_OS_RAW_IMAGE_NAME="jammy-server-cloudimg-amd64-custom-20241017-0.raw" 62JAMMY_OS_RAW_IMAGE="$WORKLOADS_DIR/$JAMMY_OS_RAW_IMAGE_NAME" 63if [ ! -f "$JAMMY_OS_RAW_IMAGE" ]; then 64 pushd "$WORKLOADS_DIR" || exit 65 time qemu-img convert -p -f qcow2 -O raw $JAMMY_OS_IMAGE_NAME $JAMMY_OS_RAW_IMAGE_NAME || exit 1 66 popd || exit 67fi 68 69ALPINE_MINIROOTFS_URL="http://dl-cdn.alpinelinux.org/alpine/v3.11/releases/x86_64/alpine-minirootfs-3.11.3-x86_64.tar.gz" 70ALPINE_MINIROOTFS_TARBALL="$WORKLOADS_DIR/alpine-minirootfs-x86_64.tar.gz" 71if [ ! -f "$ALPINE_MINIROOTFS_TARBALL" ]; then 72 pushd "$WORKLOADS_DIR" || exit 73 time wget --quiet $ALPINE_MINIROOTFS_URL -O "$ALPINE_MINIROOTFS_TARBALL" || exit 1 74 popd || exit 75fi 76 77ALPINE_INITRAMFS_IMAGE="$WORKLOADS_DIR/alpine_initramfs.img" 78if [ ! -f "$ALPINE_INITRAMFS_IMAGE" ]; then 79 pushd "$WORKLOADS_DIR" || exit 80 mkdir alpine-minirootfs 81 tar xf "$ALPINE_MINIROOTFS_TARBALL" -C alpine-minirootfs 82 cat >alpine-minirootfs/init <<-EOF 83 #! /bin/sh 84 mount -t devtmpfs dev /dev 85 echo \$TEST_STRING > /dev/console 86 poweroff -f 87 EOF 88 chmod +x alpine-minirootfs/init 89 cd alpine-minirootfs || exit 90 find . -print0 | 91 cpio --null --create --verbose --owner root:root --format=newc >"$ALPINE_INITRAMFS_IMAGE" 92 popd || exit 93fi 94 95pushd "$WORKLOADS_DIR" || exit 96if ! sha1sum sha1sums-x86_64 --check; then 97 echo "sha1sum validation of images failed, remove invalid images to fix the issue." 98 exit 1 99fi 100popd || exit 101 102# Build custom kernel based on virtio-pmem and virtio-fs upstream patches 103VMLINUX_IMAGE="$WORKLOADS_DIR/vmlinux" 104if [ ! -f "$VMLINUX_IMAGE" ]; then 105 # Download prebuild linux binaries 106 download_linux 107fi 108 109VIRTIOFSD="$WORKLOADS_DIR/virtiofsd" 110VIRTIOFSD_DIR="virtiofsd_build" 111if [ ! -f "$VIRTIOFSD" ]; then 112 pushd "$WORKLOADS_DIR" || exit 113 git clone "https://gitlab.com/virtio-fs/virtiofsd.git" $VIRTIOFSD_DIR 114 pushd $VIRTIOFSD_DIR || exit 115 git checkout v1.8.0 116 time cargo build --release 117 cp target/release/virtiofsd "$VIRTIOFSD" || exit 1 118 popd || exit 119 rm -rf $VIRTIOFSD_DIR 120 popd || exit 121fi 122 123BLK_IMAGE="$WORKLOADS_DIR/blk.img" 124MNT_DIR="mount_image" 125if [ ! -f "$BLK_IMAGE" ]; then 126 pushd "$WORKLOADS_DIR" || exit 127 fallocate -l 16M "$BLK_IMAGE" 128 mkfs.ext4 -j "$BLK_IMAGE" 129 mkdir $MNT_DIR 130 sudo mount -t ext4 "$BLK_IMAGE" $MNT_DIR 131 sudo bash -c "echo bar > $MNT_DIR/foo" || exit 1 132 sudo umount "$BLK_IMAGE" 133 rm -r $MNT_DIR 134 popd || exit 135fi 136 137SHARED_DIR="$WORKLOADS_DIR/shared_dir" 138if [ ! -d "$SHARED_DIR" ]; then 139 mkdir -p "$SHARED_DIR" 140 echo "foo" >"$SHARED_DIR/file1" 141 echo "bar" >"$SHARED_DIR/file3" || exit 1 142fi 143 144VFIO_DIR="$WORKLOADS_DIR/vfio" 145VFIO_DISK_IMAGE="$WORKLOADS_DIR/vfio.img" 146rm -rf "$VFIO_DIR" "$VFIO_DISK_IMAGE" 147mkdir -p "$VFIO_DIR" 148cp "$FOCAL_OS_RAW_IMAGE" "$VFIO_DIR" 149cp "$FW" "$VFIO_DIR" 150cp "$VMLINUX_IMAGE" "$VFIO_DIR" || exit 1 151 152cargo build --features mshv --all --release --target "$BUILD_TARGET" 153 154# We always copy a fresh version of our binary for our L2 guest. 155cp target/"$BUILD_TARGET"/release/cloud-hypervisor "$VFIO_DIR" 156cp target/"$BUILD_TARGET"/release/ch-remote "$VFIO_DIR" 157 158# Enable KSM with some reasonable parameters so that it won't take too long 159# for the memory to be merged between two processes. 160sudo bash -c "echo 1000000 > /sys/kernel/mm/ksm/pages_to_scan" 161sudo bash -c "echo 10 > /sys/kernel/mm/ksm/sleep_millisecs" 162sudo bash -c "echo 1 > /sys/kernel/mm/ksm/run" 163 164# Both test_vfio, ovs-dpdk and vDPA tests rely on hugepages 165HUGEPAGESIZE=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') 166PAGE_NUM=$((12288 * 1024 / HUGEPAGESIZE)) 167echo "$PAGE_NUM" | sudo tee /proc/sys/vm/nr_hugepages 168sudo chmod a+rwX /dev/hugepages 169 170# Update max locked memory to 'unlimited' to avoid issues with vDPA 171ulimit -l unlimited 172 173# Set number of open descriptors high enough for VFIO tests to run 174ulimit -n 4096 175 176export RUST_BACKTRACE=1 177time cargo test --release --target "$BUILD_TARGET" $test_features "common_parallel::$test_filter" -- ${test_binary_args[*]} 178RES=$? 179 180# Run some tests in sequence since the result could be affected by other tests 181# running in parallel. 182if [ $RES -eq 0 ]; then 183 export RUST_BACKTRACE=1 184 time cargo test --release --target "$BUILD_TARGET" $test_features "common_sequential::$test_filter" -- --test-threads=1 ${test_binary_args[*]} 185 RES=$? 186fi 187 188# Run tests on dbus_api 189if [ $RES -eq 0 ]; then 190 cargo build --features "mshv,dbus_api" --all --release --target "$BUILD_TARGET" 191 export RUST_BACKTRACE=1 192 # integration tests now do not reply on build feature "dbus_api" 193 time cargo test $test_features "dbus_api::$test_filter" -- ${test_binary_args[*]} 194 RES=$? 195fi 196 197exit $RES 198