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://cloud-hypervisor.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-20230119-0.qcow2" 53JAMMY_OS_IMAGE_URL="https://cloud-hypervisor.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-20230119-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 build_custom_linux 106fi 107 108VIRTIOFSD="$WORKLOADS_DIR/virtiofsd" 109VIRTIOFSD_DIR="virtiofsd_build" 110if [ ! -f "$VIRTIOFSD" ]; then 111 pushd "$WORKLOADS_DIR" || exit 112 git clone "https://gitlab.com/virtio-fs/virtiofsd.git" $VIRTIOFSD_DIR 113 pushd $VIRTIOFSD_DIR || exit 114 git checkout v1.8.0 115 time cargo build --release 116 cp target/release/virtiofsd "$VIRTIOFSD" || exit 1 117 popd || exit 118 rm -rf $VIRTIOFSD_DIR 119 popd || exit 120fi 121 122BLK_IMAGE="$WORKLOADS_DIR/blk.img" 123MNT_DIR="mount_image" 124if [ ! -f "$BLK_IMAGE" ]; then 125 pushd "$WORKLOADS_DIR" || exit 126 fallocate -l 16M "$BLK_IMAGE" 127 mkfs.ext4 -j "$BLK_IMAGE" 128 mkdir $MNT_DIR 129 sudo mount -t ext4 "$BLK_IMAGE" $MNT_DIR 130 sudo bash -c "echo bar > $MNT_DIR/foo" || exit 1 131 sudo umount "$BLK_IMAGE" 132 rm -r $MNT_DIR 133 popd || exit 134fi 135 136SHARED_DIR="$WORKLOADS_DIR/shared_dir" 137if [ ! -d "$SHARED_DIR" ]; then 138 mkdir -p "$SHARED_DIR" 139 echo "foo" >"$SHARED_DIR/file1" 140 echo "bar" >"$SHARED_DIR/file3" || exit 1 141fi 142 143VFIO_DIR="$WORKLOADS_DIR/vfio" 144VFIO_DISK_IMAGE="$WORKLOADS_DIR/vfio.img" 145rm -rf "$VFIO_DIR" "$VFIO_DISK_IMAGE" 146mkdir -p "$VFIO_DIR" 147cp "$FOCAL_OS_RAW_IMAGE" "$VFIO_DIR" 148cp "$FW" "$VFIO_DIR" 149cp "$VMLINUX_IMAGE" "$VFIO_DIR" || exit 1 150 151cargo build --features mshv --all --release --target "$BUILD_TARGET" 152 153# We always copy a fresh version of our binary for our L2 guest. 154cp target/"$BUILD_TARGET"/release/cloud-hypervisor "$VFIO_DIR" 155cp target/"$BUILD_TARGET"/release/ch-remote "$VFIO_DIR" 156 157# Enable KSM with some reasonable parameters so that it won't take too long 158# for the memory to be merged between two processes. 159sudo bash -c "echo 1000000 > /sys/kernel/mm/ksm/pages_to_scan" 160sudo bash -c "echo 10 > /sys/kernel/mm/ksm/sleep_millisecs" 161sudo bash -c "echo 1 > /sys/kernel/mm/ksm/run" 162 163# Both test_vfio, ovs-dpdk and vDPA tests rely on hugepages 164HUGEPAGESIZE=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') 165PAGE_NUM=$((12288 * 1024 / HUGEPAGESIZE)) 166echo "$PAGE_NUM" | sudo tee /proc/sys/vm/nr_hugepages 167sudo chmod a+rwX /dev/hugepages 168 169# Update max locked memory to 'unlimited' to avoid issues with vDPA 170ulimit -l unlimited 171 172# Set number of open descriptors high enough for VFIO tests to run 173ulimit -n 4096 174 175export RUST_BACKTRACE=1 176time cargo test $test_features "common_parallel::$test_filter" -- ${test_binary_args[*]} 177RES=$? 178 179# Run some tests in sequence since the result could be affected by other tests 180# running in parallel. 181if [ $RES -eq 0 ]; then 182 export RUST_BACKTRACE=1 183 time cargo test $test_features "common_sequential::$test_filter" -- --test-threads=1 ${test_binary_args[*]} 184 RES=$? 185fi 186 187# Run tests on dbus_api 188if [ $RES -eq 0 ]; then 189 cargo build --features "mshv,dbus_api" --all --release --target "$BUILD_TARGET" 190 export RUST_BACKTRACE=1 191 # integration tests now do not reply on build feature "dbus_api" 192 time cargo test $test_features "dbus_api::$test_filter" -- ${test_binary_args[*]} 193 RES=$? 194fi 195 196exit $RES 197