| From c832962ac972082b3a1f89775c9d4274c8cb5670 Mon Sep 17 00:00:00 2001 |
| From: Oleksandr Mazur <oleksandr.mazur@plvision.eu> |
| Date: Tue, 15 Feb 2022 18:53:03 +0200 |
| Subject: net: bridge: multicast: notify switchdev driver whenever MC processing gets disabled |
| |
| From: Oleksandr Mazur <oleksandr.mazur@plvision.eu> |
| |
| commit c832962ac972082b3a1f89775c9d4274c8cb5670 upstream. |
| |
| 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: 147c1e9b902c ("switchdev: bridge: Offload multicast disabled") |
| Signed-off-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu> |
| Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com> |
| Link: https://lore.kernel.org/r/20220215165303.31908-1-oleksandr.mazur@plvision.eu |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/bridge/br_multicast.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/net/bridge/br_multicast.c |
| +++ b/net/bridge/br_multicast.c |
| @@ -82,6 +82,9 @@ static void br_multicast_find_del_pg(str |
| struct net_bridge_port_group *pg); |
| static void __br_multicast_stop(struct net_bridge_mcast *brmctx); |
| |
| +static int br_mc_disabled_update(struct net_device *dev, bool value, |
| + struct netlink_ext_ack *extack); |
| + |
| static struct net_bridge_port_group * |
| br_sg_port_find(struct net_bridge *br, |
| struct net_bridge_port_group_sg_key *sg_p) |
| @@ -1156,6 +1159,7 @@ struct net_bridge_mdb_entry *br_multicas |
| return mp; |
| |
| if (atomic_read(&br->mdb_hash_tbl.nelems) >= br->hash_max) { |
| + br_mc_disabled_update(br->dev, false, NULL); |
| br_opt_toggle(br, BROPT_MULTICAST_ENABLED, false); |
| return ERR_PTR(-E2BIG); |
| } |