mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-14 16:06:15 -05:00
selftests/vsock: avoid multi-VM pidfile collisions with QEMU
Change QEMU to use generated pidfile names instead of just a single globally-defined pidfile. This allows multiple QEMU instances to co-exist with different pidfiles. This is required for future tests that use multiple VMs to check for CID collissions. Additionally, this also places the burden of killing the QEMU process and cleaning up the pidfile on the caller of vm_start(). To help with this, a function terminate_pidfiles() is introduced that callers use to perform the cleanup. The terminate_pidfiles() function supports multiple pidfile removals because future patches will need to process two pidfiles at a time. Change QEMU_OPTS to be initialized inside the vm_start(). This allows the generated pidfile to be passed to the string assignment, and prepares for future vm-specific options as well (e.g., cid). Signed-off-by: Bobby Eshleman <bobbyeshleman@meta.com> Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> Link: https://patch.msgid.link/20251108-vsock-selftests-fixes-and-improvements-v4-4-d5e8d6c87289@meta.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
4f76ff14d3
commit
ac8997e943
@@ -23,7 +23,8 @@ readonly VSOCK_CID=1234
|
||||
readonly WAIT_PERIOD=3
|
||||
readonly WAIT_PERIOD_MAX=60
|
||||
readonly WAIT_TOTAL=$(( WAIT_PERIOD * WAIT_PERIOD_MAX ))
|
||||
readonly QEMU_PIDFILE=$(mktemp /tmp/qemu_vsock_vmtest_XXXX.pid)
|
||||
readonly PIDFILE_TEMPLATE=/tmp/vsock_vmtest_XXXX.pid
|
||||
declare -A PIDFILES
|
||||
|
||||
# virtme-ng offers a netdev for ssh when using "--ssh", but we also need a
|
||||
# control port forwarded for vsock_test. Because virtme-ng doesn't support
|
||||
@@ -33,12 +34,6 @@ readonly QEMU_PIDFILE=$(mktemp /tmp/qemu_vsock_vmtest_XXXX.pid)
|
||||
# add the kernel cmdline options that virtme-init uses to setup the interface.
|
||||
readonly QEMU_TEST_PORT_FWD="hostfwd=tcp::${TEST_HOST_PORT}-:${TEST_GUEST_PORT}"
|
||||
readonly QEMU_SSH_PORT_FWD="hostfwd=tcp::${SSH_HOST_PORT}-:${SSH_GUEST_PORT}"
|
||||
readonly QEMU_OPTS="\
|
||||
-netdev user,id=n0,${QEMU_TEST_PORT_FWD},${QEMU_SSH_PORT_FWD} \
|
||||
-device virtio-net-pci,netdev=n0 \
|
||||
-device vhost-vsock-pci,guest-cid=${VSOCK_CID} \
|
||||
--pidfile ${QEMU_PIDFILE} \
|
||||
"
|
||||
readonly KERNEL_CMDLINE="\
|
||||
virtme.dhcp net.ifnames=0 biosdevname=0 \
|
||||
virtme.ssh virtme_ssh_channel=tcp virtme_ssh_user=$USER \
|
||||
@@ -90,15 +85,7 @@ vm_ssh() {
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
if [[ -s "${QEMU_PIDFILE}" ]]; then
|
||||
pkill -SIGTERM -F "${QEMU_PIDFILE}" > /dev/null 2>&1
|
||||
fi
|
||||
|
||||
# If failure occurred during or before qemu start up, then we need
|
||||
# to clean this up ourselves.
|
||||
if [[ -e "${QEMU_PIDFILE}" ]]; then
|
||||
rm "${QEMU_PIDFILE}"
|
||||
fi
|
||||
terminate_pidfiles "${!PIDFILES[@]}"
|
||||
}
|
||||
|
||||
check_args() {
|
||||
@@ -188,10 +175,37 @@ handle_build() {
|
||||
popd &>/dev/null
|
||||
}
|
||||
|
||||
create_pidfile() {
|
||||
local pidfile
|
||||
|
||||
pidfile=$(mktemp "${PIDFILE_TEMPLATE}")
|
||||
PIDFILES["${pidfile}"]=1
|
||||
|
||||
echo "${pidfile}"
|
||||
}
|
||||
|
||||
terminate_pidfiles() {
|
||||
local pidfile
|
||||
|
||||
for pidfile in "$@"; do
|
||||
if [[ -s "${pidfile}" ]]; then
|
||||
pkill -SIGTERM -F "${pidfile}" > /dev/null 2>&1
|
||||
fi
|
||||
|
||||
if [[ -e "${pidfile}" ]]; then
|
||||
rm -f "${pidfile}"
|
||||
fi
|
||||
|
||||
unset "PIDFILES[${pidfile}]"
|
||||
done
|
||||
}
|
||||
|
||||
vm_start() {
|
||||
local pidfile=$1
|
||||
local logfile=/dev/null
|
||||
local verbose_opt=""
|
||||
local kernel_opt=""
|
||||
local qemu_opts=""
|
||||
local qemu
|
||||
|
||||
qemu=$(command -v "${QEMU}")
|
||||
@@ -201,6 +215,13 @@ vm_start() {
|
||||
logfile=/dev/stdout
|
||||
fi
|
||||
|
||||
qemu_opts="\
|
||||
-netdev user,id=n0,${QEMU_TEST_PORT_FWD},${QEMU_SSH_PORT_FWD} \
|
||||
-device virtio-net-pci,netdev=n0 \
|
||||
-device vhost-vsock-pci,guest-cid=${VSOCK_CID} \
|
||||
--pidfile ${pidfile}
|
||||
"
|
||||
|
||||
if [[ "${BUILD}" -eq 1 ]]; then
|
||||
kernel_opt="${KERNEL_CHECKOUT}"
|
||||
fi
|
||||
@@ -209,14 +230,14 @@ vm_start() {
|
||||
--run \
|
||||
${kernel_opt} \
|
||||
${verbose_opt} \
|
||||
--qemu-opts="${QEMU_OPTS}" \
|
||||
--qemu-opts="${qemu_opts}" \
|
||||
--qemu="${qemu}" \
|
||||
--user root \
|
||||
--append "${KERNEL_CMDLINE}" \
|
||||
--rw &> ${logfile} &
|
||||
|
||||
if ! timeout ${WAIT_TOTAL} \
|
||||
bash -c 'while [[ ! -s '"${QEMU_PIDFILE}"' ]]; do sleep 1; done; exit 0'; then
|
||||
bash -c 'while [[ ! -s '"${pidfile}"' ]]; do sleep 1; done; exit 0'; then
|
||||
die "failed to boot VM"
|
||||
fi
|
||||
}
|
||||
@@ -499,7 +520,8 @@ handle_build
|
||||
echo "1..${#ARGS[@]}"
|
||||
|
||||
log_host "Booting up VM"
|
||||
vm_start
|
||||
pidfile="$(create_pidfile)"
|
||||
vm_start "${pidfile}"
|
||||
vm_wait_for_ssh
|
||||
log_host "VM booted up"
|
||||
|
||||
@@ -523,6 +545,8 @@ for arg in "${ARGS[@]}"; do
|
||||
cnt_total=$(( cnt_total + 1 ))
|
||||
done
|
||||
|
||||
terminate_pidfiles "${pidfile}"
|
||||
|
||||
echo "SUMMARY: PASS=${cnt_pass} SKIP=${cnt_skip} FAIL=${cnt_fail}"
|
||||
echo "Log: ${LOG}"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user