selftests/vsock: add namespace tests for CID collisions

Add tests to verify CID collision rules across different vsock namespace
modes.

1. Two VMs with the same CID cannot start in different global namespaces
   (ns_global_same_cid_fails)
2. Two VMs with the same CID can start in different local namespaces
   (ns_local_same_cid_ok)
3. VMs with the same CID can coexist when one is in a global namespace
   and another is in a local namespace (ns_global_local_same_cid_ok and
   ns_local_global_same_cid_ok)

The tests ns_global_local_same_cid_ok and ns_local_global_same_cid_ok
make sure that ordering does not matter.

The tests use a shared helper function namespaces_can_boot_same_cid()
that attempts to start two VMs with identical CIDs in the specified
namespaces and verifies whether VM initialization failed or succeeded.

Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Bobby Eshleman <bobbyeshleman@meta.com>
Link: https://patch.msgid.link/20260121-vsock-vmtest-v16-10-2859a7512097@meta.com
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Bobby Eshleman
2026-01-21 14:11:50 -08:00
committed by Paolo Abeni
parent 06cf7895ab
commit 605caec5ad

View File

@@ -50,6 +50,10 @@ readonly TEST_NAMES=(
vm_loopback
ns_host_vsock_ns_mode_ok
ns_host_vsock_child_ns_mode_ok
ns_global_same_cid_fails
ns_local_same_cid_ok
ns_global_local_same_cid_ok
ns_local_global_same_cid_ok
)
readonly TEST_DESCS=(
# vm_server_host_client
@@ -66,6 +70,18 @@ readonly TEST_DESCS=(
# ns_host_vsock_child_ns_mode_ok
"Check /proc/sys/net/vsock/ns_mode is read-only and child_ns_mode is writable."
# ns_global_same_cid_fails
"Check QEMU fails to start two VMs with same CID in two different global namespaces."
# ns_local_same_cid_ok
"Check QEMU successfully starts two VMs with same CID in two different local namespaces."
# ns_global_local_same_cid_ok
"Check QEMU successfully starts one VM in a global ns and then another VM in a local ns with the same CID."
# ns_local_global_same_cid_ok
"Check QEMU successfully starts one VM in a local ns and then another VM in a global ns with the same CID."
)
readonly USE_SHARED_VM=(
@@ -577,6 +593,68 @@ test_ns_host_vsock_ns_mode_ok() {
return "${KSFT_PASS}"
}
namespaces_can_boot_same_cid() {
local ns0=$1
local ns1=$2
local pidfile1 pidfile2
local rc
pidfile1="$(create_pidfile)"
# The first VM should be able to start. If it can't then we have
# problems and need to return non-zero.
if ! vm_start "${pidfile1}" "${ns0}"; then
return 1
fi
pidfile2="$(create_pidfile)"
vm_start "${pidfile2}" "${ns1}"
rc=$?
terminate_pidfiles "${pidfile1}" "${pidfile2}"
return "${rc}"
}
test_ns_global_same_cid_fails() {
init_namespaces
if namespaces_can_boot_same_cid "global0" "global1"; then
return "${KSFT_FAIL}"
fi
return "${KSFT_PASS}"
}
test_ns_local_global_same_cid_ok() {
init_namespaces
if namespaces_can_boot_same_cid "local0" "global0"; then
return "${KSFT_PASS}"
fi
return "${KSFT_FAIL}"
}
test_ns_global_local_same_cid_ok() {
init_namespaces
if namespaces_can_boot_same_cid "global0" "local0"; then
return "${KSFT_PASS}"
fi
return "${KSFT_FAIL}"
}
test_ns_local_same_cid_ok() {
init_namespaces
if namespaces_can_boot_same_cid "local0" "local1"; then
return "${KSFT_PASS}"
fi
return "${KSFT_FAIL}"
}
test_ns_host_vsock_child_ns_mode_ok() {
local orig_mode
local rc