[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Zuw7d9eRGo4wdVP3@shredder.mtl.com>
Date: Thu, 19 Sep 2024 17:55:51 +0300
From: Ido Schimmel <idosch@...dia.com>
To: Jamie Bainbridge <jamie.bainbridge@...il.com>
Cc: "David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>,
Shuah Khan <shuah@...nel.org>,
Nikolay Aleksandrov <razor@...ckwall.org>, netdev@...r.kernel.org,
linux-kselftest@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH net v2] selftests: forwarding: Avoid false MDB
delete/flush failures
Hi,
Thanks for the patch and sorry for the late reply (was OOO).
On Mon, Sep 16, 2024 at 07:49:05PM +1000, Jamie Bainbridge wrote:
> Running this test on a small system produces different failures every
> test checking deletions, and some flushes. From different test runs:
>
> TEST: Common host entries configuration tests (L2) [FAIL]
> Failed to delete L2 host entry
>
> TEST: Common port group entries configuration tests (IPv4 (S, G)) [FAIL]
> IPv4 (S, G) entry with VLAN 10 not deleted when VLAN was not specified
>
> TEST: Common port group entries configuration tests (IPv6 (*, G)) [FAIL]
> IPv6 (*, G) entry with VLAN 10 not deleted when VLAN was not specified
>
> TEST: Flush tests [FAIL]
> Entry not flushed by specified VLAN ID
>
> TEST: Flush tests [FAIL]
> IPv6 host entry not flushed by "nopermanent" state
>
> Add a short sleep after deletion and flush to resolve this.
The port group entry is removed from MDB entry's list synchronously, but
the MDB entry itself is removed from the hash table asynchronously and
the MDB get query will only return an error if an entry was not found
there.
IOW, I think that when you do get a response after deletion, the entry
you get is empty.
Can you please test the following patch [1] (w/o yours, obviously)?
[1]
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
index bc37e47ad829..1a52a0bca086 100644
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
@@ -1674,7 +1674,7 @@ int br_mdb_get(struct net_device *dev, struct nlattr *tb[], u32 portid, u32 seq,
spin_lock_bh(&br->multicast_lock);
mp = br_mdb_ip_get(br, &group);
- if (!mp) {
+ if (!mp || (!mp->ports && !mp->host_joined)) {
NL_SET_ERR_MSG_MOD(extack, "MDB entry not found");
err = -ENOENT;
goto unlock;
Powered by blists - more mailing lists