Commit 045bf89b authored by Oleksandr Mazur's avatar Oleksandr Mazur Committed by Zhengchao Shao
Browse files

net: bridge: multicast: notify switchdev driver whenever MC processing gets disabled

mainline inclusion
from mainline-v5.17-rc5
commit c832962a
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7V613

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c832962ac972082b3a1f89775c9d4274c8cb5670



--------------------------------

Whenever bridge driver hits the max capacity of MDBs, it disables
the MC processing (by setting corresponding bridge option), but never
notifies switchdev about such change (the notifiers are called only upon
explicit setting of this option, through the registered netlink interface).

This could lead to situation when Software MDB processing gets disabled,
but this event never gets offloaded to the underlying Hardware.

Fix this by adding a notify message in such case.

Fixes: 147c1e9b ("switchdev: bridge: Offload multicast disabled")
Signed-off-by: default avatarOleksandr Mazur <oleksandr.mazur@plvision.eu>
Acked-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
Link: https://lore.kernel.org/r/20220215165303.31908-1-oleksandr.mazur@plvision.eu


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>

Conflicts:
	net/bridge/br_multicast.c

Signed-off-by: default avatarZhengchao Shao <shaozhengchao@huawei.com>
parent dc715384
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -48,6 +48,8 @@ static const struct rhashtable_params br_sg_port_rht_params = {
	.automatic_shrinking = true,
};

static void br_mc_disabled_update(struct net_device *dev, bool value);

static void br_multicast_start_querier(struct net_bridge *br,
				       struct bridge_mcast_own_query *query);
static void br_multicast_add_router(struct net_bridge *br,
@@ -1040,6 +1042,7 @@ struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br,
		return mp;

	if (atomic_read(&br->mdb_hash_tbl.nelems) >= br->hash_max) {
		br_mc_disabled_update(br->dev, false);
		br_opt_toggle(br, BROPT_MULTICAST_ENABLED, false);
		return ERR_PTR(-E2BIG);
	}