blob: 216b6bc09610e794d7953a4fa10edc6697fe69c6 [file]
#!/bin/bash
XFSTESTS_FLAVOR=kvm
t=$(echo ${XFSTESTS_FLAVOR}_xfstests_dir | tr "[:lower:]" "[:upper:]")
eval DIR="\$$t"
if test -z "$DIR"
then
DIR="$(dirname "$(readlink -f "$0")")"
fi
if test ! -f "$DIR/util/get-config"
then
echo "$(basename "$0"): couldn't find $DIR/util/get-config"
exit 1
fi
. "$DIR/util/get-config"
. "$DIR/util/parse_opt_funcs"
. "$DIR/util/arch-funcs"
case "$1" in
install-kconfig)
shift
if test ! -x "$KBUILD_DIR/install-kconfig"
then
echo "Kernel configuration not supported in this installation"
exit 1
fi
"$KBUILD_DIR/install-kconfig" "$@"
exit $?
;;
kbuild)
shift
if test ! -x "$KBUILD_DIR/kbuild"
then
echo "kbuild not supported in this installation"
exit 1
fi
"$KBUILD_DIR/kbuild" "$@"
exit $?
;;
setup)
shift
export KVM_XFSTESTS_DIR="$DIR"
XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/kvm-do-setup" "$@"
exit $?
;;
esac
QUIET="quiet loglevel=0"
. $DIR/util/parse_cli
DOWNLOAD_BASE_URL="https://mirrors.kernel.org/pub/linux/kernel/people/tytso/kvm-xfstests"
if test -z "$EXPLICIT_ROOT_FS" ; then
ROOT_FS="$(dirname $DIR)/test-appliance/root_fs.img.$ARCH"
if ! test -f "$ROOT_FS" ; then
ROOT_FS="$(dirname $DIR)/test-appliance/root_fs.img"
fi
if ! test -f "$ROOT_FS" ; then
f=root_fs.img.$ARCH
ROOT_FS="$(dirname $DIR)/test-appliance/$f"
echo "Downloading $f..."
# wget1 and 2 have different flags to show progress bar
WGET_VERSION=$(wget --version | head -n1 | awk '{print $3}' | cut -d. -f1)
if [[ "$WGET_VERSION" -eq 1 ]]; then
PROGRESS_FLAG="--show-progress"
elif [[ "$WGET_VERSION" -eq 2 ]]; then
PROGRESS_FLAG="--force-progress"
else
# don't show progress bar if we can't determine version
PROGRESS_FLAG=""
fi
wget -nv $PROGRESS_FLAG -O "$ROOT_FS.new" "$DOWNLOAD_BASE_URL/$f"
mv "$ROOT_FS.new" "$ROOT_FS"
fi
fi
if ! test -f "$ROOT_FS" ; then
echo "Can't find root_fs image: $ROOT_FS"
exit 1
fi
if test -n "$DO_KERNEL_BUILD"; then
echo "Building kernel before running test"
"$DIR/../kernel-build/install-kconfig" --arch "$ARCH" || exit 125
"$DIR/../kernel-build/kbuild" --no-dpkg --arch "$ARCH" || exit 125
fi
if ! test -f "$KERNEL"; then
echo "$KERNEL: kernel not found"
exit 1
fi
if test -n "$NO_ACTION" ; then
echo "Using kernel $KERNEL"
fi
if test -z "$DO_NET" ; then
echo "Networking disabled."
NET="-net none "
else
ARG="$ARG net.ifnames=0"
if test $(whoami) = "root" ; then
NET="-net nic,model=virtio -net tap,script=$IFUP,downscript=$IFDOWN "
else
NET="-netdev user,id=mynet0,net=172.20.0.0/24 -device virtio-net,netdev=mynet0 "
fi
fi
EXTRA_ARG=$(echo "$EXTRA_ARG" | sed -e 's/:/ /')
if test -z "$TESTRUNID" ; then
TESTRUNID=$(date +%Y%m%d%H%M)
fi
if test -n "$SKIP_LOG" ; then
LOGFILE=/tmp/log.$TESTRUNID
else
mkdir -p "$DIR/logs"
LOGFILE="$DIR/logs/log.$TESTRUNID"
fi
RESULTFILE="$DIR/logs/results-$TESTRUNID.tar.xz"
if test -n "$VIRTCONSOLE" ; then
vc=$(echo "$VIRTCONSOLE" | sed -e "s;VIRTCONFILE;/tmp/console.$TESTRUNID;")
VIRTCONSOLE="$vc"
fi
if test -n "$INITRD" ; then
INITRD="--initrd $INITRD"
fi
if ! test -e $VDB -a -e $VDC -a -e $VDD -a -e $VDE -a -e $VDF -a -e $VDG \
-a -e $VDI -a -e $VDJ
then
echo "Test disks don't exist, running setup..."
$DIR/util/kvm-do-setup
fi
for i in "$VDB" "$VDC" "$VDD" "$VDE" "$VDF" "$VDG" "$VDI" "$VDJ"
do
if ! test -e "$i"
then
echo "Fatal error: disk $i does not exit. Config error?"
exit 1;
fi
done
if type ionice >& /dev/null ; then
IONICE="ionice -n 5"
fi
if test -z "$VIRTIOFSD" ; then
for i in /usr/libexec/virtiofsd /usr/lib/virtiofsd /usr/lib/qemu/virtiofsd
do
if test -x "$i" ; then
VIRTIOFSD="$i"
break
fi
done
else
if ! test -x "$VIRTIOFSD" ; then
echo "Virtiofsd daemon $VIRTIOFSD not available"
exit 1
fi
fi
if test -z "$VIRTFS_TYPE"; then
case "$FSTESTCFG" in
virtiofs*|*virtiofs*|*virtiofs)
VIRTFS_TYPE=virtiofs
;;
*)
VIRTFS_TYPE=9p
;;
esac
else
case "$VIRTFS_TYPE" in
9p) ;;
virtiofs)
if test -z "$VIRTIOFSD" ; then
echo "virtiofsd not available can't use virtiofs"
exit 1
fi
;;
*)
echo "Unsupported virtfs type: $VIRTFS_TYPE"
exit 1
esac
fi
if test -z "$VIRTFS_PATH"; then
VIRTFS_PATH=/tmp/kvm-xfstests-$USER
mkdir -p "$VIRTFS_PATH"
fi
if test "$VIRTFS_TYPE" = "9p" ; then
VIRTFS="-fsdev local,id=v_tmp,path=$VIRTFS_PATH,security_model=none "
VIRTFS+="-device virtio-9p-pci,fsdev=v_tmp,mount_tag=v_tmp "
else
V_SOCK_PATH="/tmp/virtiofs-$USER"
"$VIRTIOFSD" --shared-dir $VIRTFS_PATH --socket-path "$V_SOCK_PATH" \
>& /tmp/virtiofsd-$USER.log &
VIRTFS="-chardev socket,id=char0,path=$V_SOCK_PATH "
VIRTFS+="-device vhost-user-fs-pci,queue-size=1024,chardev=char0,tag=vtmp "
VIRTFS+="-object memory-backend-file,id=mem,size=${MEM}m,mem-path=/dev/shm,share=on -numa node,memdev=mem "
fi
if test -z "$VIRTFS_MODEL"; then
VIRTFS_MODEL=none
fi
case "$FSTESTCFG" in
virtiofs*|*virtiofs*|*virtiofs|9p*|*9p*|*9p)
if test -z "$VIRTFS_TEST_PATH" ; then
VIRTFS_TEST_PATH=/tmp/virtfs-$USER-testdir
fi
if test -z "$VIRTFS_SCRATCHTEST_PATH" ; then
VIRTFS_SCRATCH_PATH=/tmp/virtfs-$USER-scratchdir
fi
;;
esac
if test -n "$VIRTFS_TEST_PATH"; then
mkdir -p "$VIRTFS_TEST_PATH"
if test "$VIRTFS_TYPE" = "9p" ; then
VIRTFS+="-fsdev local,id=p9test,path=$VIRTFS_TEST_PATH,"
VIRTFS+="security_model=$VIRTFS_MODEL "
VIRTFS+="-device virtio-9p-pci,fsdev=p9test,mount_tag=9ptest "
else
V_SOCK_PATH="/tmp/virtiofs-test-$USER"
"$VIRTIOFSD" --shared-dir "$VIRTFS_TEST_PATH" \
--socket-path "$V_SOCK_PATH" \
>& /tmp/virtiofsd-test-$USER.log &
VIRTFS+="-chardev socket,id=char1,path=$V_SOCK_PATH "
VIRTFS+="-device vhost-user-fs-pci,queue-size=1024,"
VIRTFS+="chardev=char1,tag=virtiofs-test "
fi
fi
if test -n "$VIRTFS_SCRATCH_PATH"; then
mkdir -p "$VIRTFS_SCRATCH_PATH"
if test "$VIRTFS_TYPE" = "9p" ; then
VIRTFS+=" -fsdev local,id=p9scratch,path=$VIRTFS_SCRATCH_PATH,"
VIRTFS+="security_model=$VIRTFS_MODEL "
VIRTFS+="-device virtio-9p-pci,fsdev=p9scratch,mount_tag=9pscratch "
else
V_SOCK_PATH="/tmp/virtiofs-scratch-$USER"
"$VIRTIOFSD" --shared-dir "$VIRTFS_SCRATCH_PATH" \
--socket-path "$V_SOCK_PATH" \
>& /tmp/virtiofsd-scratch-$USER.log &
VIRTFS+="-chardev socket,id=char2,path=$V_SOCK_PATH "
VIRTFS+="-device vhost-user-fs-pci,queue-size=1024,"
VIRTFS+="chardev=char2,tag=virtiofs-scratch "
fi
fi
VDH="$ourtmp/kvm-vdh"
tar -c -f "$VDH" -T /dev/null
if test -z "$NO_ACTION" -a "$UPDATE_XFSTESTS" = "yes"
then
tar -r -f $VDH -C "$DIR/../fstests-bld" xfstests.tar.gz
fi
if test -z "$NO_ACTION" -a "$UPDATE_EXTRA_TESTS" = "yes"
then
tar -r -f $VDH -C "$ourtmp" extra-tests.tar.gz
fi
if test -z "$NO_ACTION" -a "$UPDATE_FILES" = "yes"
then
TDIR=$(mktemp -d /tmp/files.XXXXXXXX)
if test -z "$TDIR"; then
echo "Couldn't create temp directory"
exit 1
fi
(cd "$DIR/../test-appliance"; \
tar -X kvm-exclude-files -C files \
--owner=root --group=root --mode=go+u-w -cf - . | \
gzip -9n > "$TDIR/files.tar.gz")
tar -r -f $VDH -C "$TDIR" files.tar.gz
rm -rf "$TDIR"
fi
if test -n "$MODULES" -a -f "$MODULES"
then
if test -z "$NO_ACTION" ; then
tar -r -f $VDH -C $(dirname "$MODULES") \
--transform="s/.*/modules.tar.xz/" $(basename "$MODULES")
else
echo "Using modules from $MODULES"
fi
fi
truncate -s 256M "$VDH"
chmod 600 "$VDH"
mkdir -p /tmp/kvm-xfstests-$USER
case "$ARCH" in
i386|amd64)
QEMU_ARCH=x86_64
ACCEL=kvm:tcg
CONSOLE_DEV=ttyS0
MACHINE_TYPE=${KVM_MACHTYPE:-q35}
CPU_TYPE=max
;;
arm64)
QEMU_ARCH=aarch64
if test "$(uname -o)" = "Darwin" ; then
ACCEL=hvf
GDB=
else
ACCEL=tcg
fi
CONSOLE_DEV=ttyAMA0
MACHINE_TYPE=virt
CPU_TYPE=max
;;
*)
echo "Unsupported architecture: $ARCH"
exit 1;
esac
QEMU="qemu-system-$QEMU_ARCH"
if test "$CACHE" != "none" ; then
AIO=
fi
if test -n "$CACHE" ; then
CACHE="cache=$CACHE,"
fi
CONARG="console=$CONSOLE_DEV,115200"
if test -n "$VIRTCONSOLE" ; then
CONARG="console=hvc0 $CONARG"
fi
$NO_ACTION $IONICE $QEMU -boot order=c $NET \
-machine $MACHINE_TYPE,accel=$ACCEL -cpu $CPU_TYPE \
-drive file=$ROOT_FS,if=virtio$SNAPSHOT \
-drive file=$VDB,${CACHE}if=virtio,format=raw$AIO \
-drive file=$VDC,${CACHE}if=virtio,format=raw$AIO \
-drive file=$VDD,${CACHE}if=virtio,format=raw$AIO \
-drive file=$VDE,${CACHE}if=virtio,format=raw$AIO \
-drive file=$VDF,${CACHE}if=virtio,format=raw$AIO \
-drive file=$VDG,${CACHE}if=virtio,format=raw$AIO \
-drive file=$VDH,if=virtio,format=raw \
-drive file=$VDI,${CACHE}if=virtio,format=raw$AIO \
-drive file=$VDJ,${CACHE}if=virtio,format=raw$AIO \
-vga none -nographic -smp $NR_CPU -m $MEM \
$VIRTFS \
$VIRTIO_RNG \
$VIRTCONSOLE \
$CONSOLE \
$MONITOR \
$SERIAL \
$GDB \
$NUMA \
--kernel $KERNEL \
$INITRD \
--append "$QUIET root=$ROOT_DEV $CONARG nokaslr $ARG $EXTRA_ARG" |\
tee $LOGFILE
TDIR=$(mktemp -d /tmp/files.XXXXXXXX)
if test -z "$NO_ACTION" ; then
tar -C "$TDIR" -xf "$VDH" .
fi
if test -f "$TDIR/exit_code" ; then
read exit_code < "$TDIR/exit_code"
fi
if test -f "$TDIR/results.tar.xz" ; then
mv "$TDIR/results.tar.xz" $RESULTFILE
echo "result in $RESULTFILE"
fi
rm -rf "$TDIR"
if test -n "$SKIP_LOG" ; then
rm $LOGFILE
else
sed -i -e '/^-------------------- Summary report/,$d' $LOGFILE
echo "logfile in $LOGFILE"
fi
# Fix line wrap from qemu
echo -ne '\e[?7h'
exit $exit_code