1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# Bridge FDB entries can be offloaded to DSA switches without holding the
5# rtnl_mutex. Traditionally this mutex has conferred drivers implicit
6# serialization, which means their code paths are not well tested in the
7# presence of concurrency.
8# This test creates a background task that stresses the FDB by adding and
9# deleting an entry many times in a row without the rtnl_mutex held.
10# It then tests the driver resistance to concurrency by calling .ndo_fdb_dump
11# (with rtnl_mutex held) from a foreground task.
12# Since either the FDB dump or the additions/removals can fail, but the
13# additions and removals are performed in deferred as opposed to process
14# context, we cannot simply check for user space error codes.
15
16WAIT_TIME=1
17NUM_NETIFS=1
18REQUIRE_JQ="no"
19REQUIRE_MZ="no"
20NETIF_CREATE="no"
21lib_dir=$(dirname "$0")
22source "$lib_dir"/lib.sh
23
24cleanup() {
25	echo "Cleaning up"
26	kill $pid && wait $pid &> /dev/null
27	ip link del br0
28	echo "Please check kernel log for errors"
29}
30trap 'cleanup' EXIT
31
32eth=${NETIFS[p1]}
33
34ip link del br0 2>&1 >/dev/null || :
35ip link add br0 type bridge && ip link set $eth master br0
36
37(while :; do
38	bridge fdb add 00:01:02:03:04:05 dev $eth master static
39	bridge fdb del 00:01:02:03:04:05 dev $eth master static
40done) &
41pid=$!
42
43for i in $(seq 1 50); do
44	bridge fdb show > /dev/null
45	sleep 3
46	echo "$((${i} * 2))% complete..."
47done
48