80 lines
2.2 KiB
Bash
Executable File
80 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
readonly ksft_skip=4
|
|
readonly cpus=$(nproc)
|
|
ret=0
|
|
|
|
[ $cpus -gt 2 ] || exit $ksft_skip
|
|
|
|
readonly INITIAL_RPS_DEFAULT_MASK=$(cat /proc/sys/net/core/rps_default_mask)
|
|
readonly TAG="$(mktemp -u XXXXXX)"
|
|
readonly VETH="veth${TAG}"
|
|
readonly NETNS="ns-${TAG}"
|
|
|
|
setup() {
|
|
ip netns add "${NETNS}"
|
|
ip -netns "${NETNS}" link set lo up
|
|
}
|
|
|
|
cleanup() {
|
|
echo $INITIAL_RPS_DEFAULT_MASK > /proc/sys/net/core/rps_default_mask
|
|
ip netns del $NETNS
|
|
}
|
|
|
|
chk_rps() {
|
|
local rps_mask expected_rps_mask=$4
|
|
local dev_name=$3
|
|
local netns=$2
|
|
local cmd="cat"
|
|
local msg=$1
|
|
|
|
[ -n "$netns" ] && cmd="ip netns exec $netns $cmd"
|
|
|
|
rps_mask=$($cmd /sys/class/net/$dev_name/queues/rx-0/rps_cpus)
|
|
printf "%-60s" "$msg"
|
|
|
|
# In case there is more than 32 CPUs we need to remove commas from masks
|
|
rps_mask=${rps_mask//,}
|
|
expected_rps_mask=${expected_rps_mask//,}
|
|
if [ $rps_mask -eq $expected_rps_mask ]; then
|
|
echo "[ ok ]"
|
|
else
|
|
echo "[fail] expected $expected_rps_mask found $rps_mask"
|
|
ret=1
|
|
fi
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
echo 0 > /proc/sys/net/core/rps_default_mask
|
|
setup
|
|
chk_rps "empty rps_default_mask" $NETNS lo 0
|
|
cleanup
|
|
|
|
echo 1 > /proc/sys/net/core/rps_default_mask
|
|
setup
|
|
chk_rps "changing rps_default_mask dont affect existing devices" "" lo $INITIAL_RPS_DEFAULT_MASK
|
|
|
|
echo 3 > /proc/sys/net/core/rps_default_mask
|
|
chk_rps "changing rps_default_mask dont affect existing netns" $NETNS lo 0
|
|
|
|
ip link add name $VETH type veth peer netns $NETNS name $VETH
|
|
ip link set dev $VETH up
|
|
ip -n $NETNS link set dev $VETH up
|
|
chk_rps "changing rps_default_mask affect newly created devices" "" $VETH 3
|
|
chk_rps "changing rps_default_mask don't affect newly child netns[II]" $NETNS $VETH 0
|
|
ip link del dev $VETH
|
|
ip netns del $NETNS
|
|
|
|
setup
|
|
chk_rps "rps_default_mask is 0 by default in child netns" "$NETNS" lo 0
|
|
|
|
ip netns exec $NETNS sysctl -qw net.core.rps_default_mask=1
|
|
ip link add name $VETH type veth peer netns $NETNS name $VETH
|
|
chk_rps "changing rps_default_mask in child ns don't affect the main one" "" lo $INITIAL_RPS_DEFAULT_MASK
|
|
chk_rps "changing rps_default_mask in child ns affects new childns devices" $NETNS $VETH 1
|
|
chk_rps "changing rps_default_mask in child ns don't affect existing devices" $NETNS lo 0
|
|
|
|
exit $ret
|