Add a test that exercises the ndo_change_rx_flags path through a
macvlan -> bridge -> team -> dummy stack. This triggers dev_uc_add
under addr_list_lock which flips promiscuity on the lower device.
With the new work queue approach, this must not deadlock.

Link: 
https://lore.kernel.org/netdev/[email protected]/
Signed-off-by: Stanislav Fomichev <[email protected]>
---
 tools/testing/selftests/net/config       |  1 +
 tools/testing/selftests/net/rtnetlink.sh | 44 ++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/tools/testing/selftests/net/config 
b/tools/testing/selftests/net/config
index 2a390cae41bf..94d722770420 100644
--- a/tools/testing/selftests/net/config
+++ b/tools/testing/selftests/net/config
@@ -101,6 +101,7 @@ CONFIG_NET_SCH_HTB=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_SCH_NETEM=y
 CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_TEAM=y
 CONFIG_NET_VRF=y
 CONFIG_NF_CONNTRACK=m
 CONFIG_NF_CONNTRACK_OVS=y
diff --git a/tools/testing/selftests/net/rtnetlink.sh 
b/tools/testing/selftests/net/rtnetlink.sh
index 5a5ff88321d5..c499953d4885 100755
--- a/tools/testing/selftests/net/rtnetlink.sh
+++ b/tools/testing/selftests/net/rtnetlink.sh
@@ -23,6 +23,7 @@ ALL_TESTS="
        kci_test_encap
        kci_test_macsec
        kci_test_macsec_vlan
+       kci_test_team_bridge_macvlan
        kci_test_ipsec
        kci_test_ipsec_offload
        kci_test_fdb_get
@@ -636,6 +637,49 @@ kci_test_macsec_vlan()
        end_test "PASS: macsec_vlan"
 }
 
+# Test ndo_change_rx_flags call from dev_uc_add under addr_list_lock spinlock.
+# When we are flipping the promisc, make sure it runs on the work queue.
+#
+# https://lore.kernel.org/netdev/[email protected]/
+# With (more conventional) macvlan instead of macsec.
+# macvlan -> bridge -> team -> dummy
+kci_test_team_bridge_macvlan()
+{
+       local vlan="test_macv1"
+       local bridge="test_br1"
+       local team="test_team1"
+       local dummy="test_dummy1"
+       local ret=0
+
+       run_cmd ip link add $team type team
+       if [ $ret -ne 0 ]; then
+               end_test "SKIP: team_bridge_macvlan: can't add team interface"
+               return $ksft_skip
+       fi
+
+       run_cmd ip link add $dummy type dummy
+       run_cmd ip link set $dummy master $team
+       run_cmd ip link set $team up
+       run_cmd ip link add $bridge type bridge vlan_filtering 1
+       run_cmd ip link set $bridge up
+       run_cmd ip link set $team master $bridge
+       run_cmd ip link add link $bridge name $vlan \
+               address 00:aa:bb:cc:dd:ee type macvlan mode bridge
+       run_cmd ip link set $vlan up
+
+       run_cmd ip link del $vlan
+       run_cmd ip link del $bridge
+       run_cmd ip link del $team
+       run_cmd ip link del $dummy
+
+       if [ $ret -ne 0 ]; then
+               end_test "FAIL: team_bridge_macvlan"
+               return 1
+       fi
+
+       end_test "PASS: team_bridge_macvlan"
+}
+
 #-------------------------------------------------------------------
 # Example commands
 #   ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \
-- 
2.53.0

Reply via email to