mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Cover three recent cases: 1. missing ops locking for the lowers during netdev_sync_lower_features 2. missing locking for dev_set_promiscuity (plus netdev_ops_assert_locked with a comment on why/when it's needed) 3. rcu lock during team_change_rx_flags Verified that each one triggers when the respective fix is reverted. Not sure about the placement, but since it all relies on teaming, added to the teaming directory. One ugly bit is that I add NETIF_F_LRO to netdevsim; there is no way to trigger netdev_sync_lower_features without it. Signed-off-by: Stanislav Fomichev <stfomichev@gmail.com> Link: https://patch.msgid.link/20250516232205.539266-1-stfomichev@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
80 lines
2 KiB
Bash
Executable file
80 lines
2 KiB
Bash
Executable file
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
set -e
|
|
|
|
NSIM_LRO_ID=$((256 + RANDOM % 256))
|
|
NSIM_LRO_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_LRO_ID
|
|
|
|
NSIM_DEV_SYS_NEW=/sys/bus/netdevsim/new_device
|
|
NSIM_DEV_SYS_DEL=/sys/bus/netdevsim/del_device
|
|
|
|
cleanup()
|
|
{
|
|
set +e
|
|
ip link del dummyteam &>/dev/null
|
|
ip link del team0 &>/dev/null
|
|
echo $NSIM_LRO_ID > $NSIM_DEV_SYS_DEL
|
|
modprobe -r netdevsim
|
|
}
|
|
|
|
# Trigger LRO propagation to the lower.
|
|
# https://lore.kernel.org/netdev/aBvOpkIoxcr9PfDg@mini-arch/
|
|
team_lro()
|
|
{
|
|
# using netdevsim because it supports NETIF_F_LRO
|
|
NSIM_LRO_NAME=$(find $NSIM_LRO_SYS/net -maxdepth 1 -type d ! \
|
|
-path $NSIM_LRO_SYS/net -exec basename {} \;)
|
|
|
|
ip link add name team0 type team
|
|
ip link set $NSIM_LRO_NAME down
|
|
ip link set dev $NSIM_LRO_NAME master team0
|
|
ip link set team0 up
|
|
ethtool -K team0 large-receive-offload off
|
|
|
|
ip link del team0
|
|
}
|
|
|
|
# Trigger promisc propagation to the lower during IFLA_MASTER.
|
|
# https://lore.kernel.org/netdev/20250506032328.3003050-1-sdf@fomichev.me/
|
|
team_promisc()
|
|
{
|
|
ip link add name dummyteam type dummy
|
|
ip link add name team0 type team
|
|
ip link set dummyteam down
|
|
ip link set team0 promisc on
|
|
ip link set dev dummyteam master team0
|
|
ip link set team0 up
|
|
|
|
ip link del team0
|
|
ip link del dummyteam
|
|
}
|
|
|
|
# Trigger promisc propagation to the lower via netif_change_flags (aka
|
|
# ndo_change_rx_flags).
|
|
# https://lore.kernel.org/netdev/20250514220319.3505158-1-stfomichev@gmail.com/
|
|
team_change_flags()
|
|
{
|
|
ip link add name dummyteam type dummy
|
|
ip link add name team0 type team
|
|
ip link set dummyteam down
|
|
ip link set dev dummyteam master team0
|
|
ip link set team0 up
|
|
ip link set team0 promisc on
|
|
|
|
# Make sure we can add more L2 addresses without any issues.
|
|
ip link add link team0 address 00:00:00:00:00:01 team0.1 type macvlan
|
|
ip link set team0.1 up
|
|
|
|
ip link del team0.1
|
|
ip link del team0
|
|
ip link del dummyteam
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
modprobe netdevsim || :
|
|
echo $NSIM_LRO_ID > $NSIM_DEV_SYS_NEW
|
|
udevadm settle
|
|
team_lro
|
|
team_promisc
|
|
team_change_flags
|