summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorPaolo Abeni <pabeni@redhat.com>2026-02-26 13:10:05 +0300
committerPaolo Abeni <pabeni@redhat.com>2026-02-26 13:10:06 +0300
commitf0a2f2aadbef0d44e6df7b43a32b509fbbf39349 (patch)
treed00d3bb96d13214ca2a927071ef16b3e8d135c95 /tools
parent97f87e578883abe2c8bec947dbdfdc4bf624f796 (diff)
parentb6302e057fdc8f199ddae736ecdf45029f892e5c (diff)
downloadlinux-f0a2f2aadbef0d44e6df7b43a32b509fbbf39349.tar.xz
Merge branch 'vsock-add-write-once-semantics-to-child_ns_mode'
Bobby Eshleman says: ==================== vsock: add write-once semantics to child_ns_mode Two administrator processes may race when setting child_ns_mode: one sets it to "local" and creates a namespace, but another changes it to "global" in between. The first process ends up with a namespace in the wrong mode. Make child_ns_mode write-once so that a namespace manager can set it once, check the value, and be guaranteed it won't change before creating its namespaces. Writing a different value after the first write returns -EBUSY. One patch for the implementation, one for docs, and one for tests. v2: https://lore.kernel.org/r/20260218-vsock-ns-write-once-v2-0-19e4c50d509a@meta.com v1: https://lore.kernel.org/r/20260217-vsock-ns-write-once-v1-1-a1fb30f289a9@meta.com ==================== Link: https://patch.msgid.link/20260223-vsock-ns-write-once-v3-0-c0cde6959923@meta.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'tools')
-rwxr-xr-xtools/testing/selftests/vsock/vmtest.sh41
1 files changed, 21 insertions, 20 deletions
diff --git a/tools/testing/selftests/vsock/vmtest.sh b/tools/testing/selftests/vsock/vmtest.sh
index dc8dbe74a6d0..86e338886b33 100755
--- a/tools/testing/selftests/vsock/vmtest.sh
+++ b/tools/testing/selftests/vsock/vmtest.sh
@@ -210,16 +210,21 @@ check_result() {
}
add_namespaces() {
- local orig_mode
- orig_mode=$(cat /proc/sys/net/vsock/child_ns_mode)
-
- for mode in "${NS_MODES[@]}"; do
- echo "${mode}" > /proc/sys/net/vsock/child_ns_mode
- ip netns add "${mode}0" 2>/dev/null
- ip netns add "${mode}1" 2>/dev/null
- done
-
- echo "${orig_mode}" > /proc/sys/net/vsock/child_ns_mode
+ ip netns add "global-parent" 2>/dev/null
+ echo "global" | ip netns exec "global-parent" \
+ tee /proc/sys/net/vsock/child_ns_mode &>/dev/null
+ ip netns add "local-parent" 2>/dev/null
+ echo "local" | ip netns exec "local-parent" \
+ tee /proc/sys/net/vsock/child_ns_mode &>/dev/null
+
+ nsenter --net=/var/run/netns/global-parent \
+ ip netns add "global0" 2>/dev/null
+ nsenter --net=/var/run/netns/global-parent \
+ ip netns add "global1" 2>/dev/null
+ nsenter --net=/var/run/netns/local-parent \
+ ip netns add "local0" 2>/dev/null
+ nsenter --net=/var/run/netns/local-parent \
+ ip netns add "local1" 2>/dev/null
}
init_namespaces() {
@@ -237,6 +242,8 @@ del_namespaces() {
log_host "removed ns ${mode}0"
log_host "removed ns ${mode}1"
done
+ ip netns del "global-parent" &>/dev/null
+ ip netns del "local-parent" &>/dev/null
}
vm_ssh() {
@@ -287,7 +294,7 @@ check_args() {
}
check_deps() {
- for dep in vng ${QEMU} busybox pkill ssh ss socat; do
+ for dep in vng ${QEMU} busybox pkill ssh ss socat nsenter; do
if [[ ! -x $(command -v "${dep}") ]]; then
echo -e "skip: dependency ${dep} not found!\n"
exit "${KSFT_SKIP}"
@@ -1231,12 +1238,8 @@ test_ns_local_same_cid_ok() {
}
test_ns_host_vsock_child_ns_mode_ok() {
- local orig_mode
- local rc
-
- orig_mode=$(cat /proc/sys/net/vsock/child_ns_mode)
+ local rc="${KSFT_PASS}"
- rc="${KSFT_PASS}"
for mode in "${NS_MODES[@]}"; do
local ns="${mode}0"
@@ -1246,15 +1249,13 @@ test_ns_host_vsock_child_ns_mode_ok() {
continue
fi
- if ! echo "${mode}" > /proc/sys/net/vsock/child_ns_mode; then
- log_host "child_ns_mode should be writable to ${mode}"
+ if ! echo "${mode}" | ip netns exec "${ns}" \
+ tee /proc/sys/net/vsock/child_ns_mode &>/dev/null; then
rc="${KSFT_FAIL}"
continue
fi
done
- echo "${orig_mode}" > /proc/sys/net/vsock/child_ns_mode
-
return "${rc}"
}