Skip to content

Commit 1aff0c3

Browse files
committed
Merge branch 'mlxsw-Couple-of-fixes'
Jiri Pirko says: ==================== mlxsw: Couple of fixes Ido says: The first patch prevents us from warning about valid situations that can happen due to the fact that some operations in switchdev are deferred. Second patch fixes a long standing problem in which we didn't correctly free resources upon module removal, resulting in a memory leak. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 337f1b0 + 852cfee commit 1aff0c3

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -626,8 +626,8 @@ static int mlxsw_sp_port_attr_br_flags_set(struct mlxsw_sp_port *mlxsw_sp_port,
626626

627627
bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
628628
orig_dev);
629-
if (WARN_ON(!bridge_port))
630-
return -EINVAL;
629+
if (!bridge_port)
630+
return 0;
631631

632632
err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port, bridge_port,
633633
MLXSW_SP_FLOOD_TYPE_UC,
@@ -711,8 +711,8 @@ static int mlxsw_sp_port_attr_mc_router_set(struct mlxsw_sp_port *mlxsw_sp_port,
711711

712712
bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
713713
orig_dev);
714-
if (WARN_ON(!bridge_port))
715-
return -EINVAL;
714+
if (!bridge_port)
715+
return 0;
716716

717717
if (!bridge_port->bridge_device->multicast_enabled)
718718
return 0;
@@ -1283,15 +1283,15 @@ static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
12831283
return 0;
12841284

12851285
bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1286-
if (WARN_ON(!bridge_port))
1287-
return -EINVAL;
1286+
if (!bridge_port)
1287+
return 0;
12881288

12891289
bridge_device = bridge_port->bridge_device;
12901290
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
12911291
bridge_device,
12921292
mdb->vid);
1293-
if (WARN_ON(!mlxsw_sp_port_vlan))
1294-
return -EINVAL;
1293+
if (!mlxsw_sp_port_vlan)
1294+
return 0;
12951295

12961296
fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
12971297

@@ -1407,15 +1407,15 @@ static int mlxsw_sp_port_mdb_del(struct mlxsw_sp_port *mlxsw_sp_port,
14071407
int err = 0;
14081408

14091409
bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1410-
if (WARN_ON(!bridge_port))
1411-
return -EINVAL;
1410+
if (!bridge_port)
1411+
return 0;
14121412

14131413
bridge_device = bridge_port->bridge_device;
14141414
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
14151415
bridge_device,
14161416
mdb->vid);
1417-
if (WARN_ON(!mlxsw_sp_port_vlan))
1418-
return -EINVAL;
1417+
if (!mlxsw_sp_port_vlan)
1418+
return 0;
14191419

14201420
fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
14211421

@@ -1974,6 +1974,17 @@ static void mlxsw_sp_fdb_fini(struct mlxsw_sp *mlxsw_sp)
19741974

19751975
}
19761976

1977+
static void mlxsw_sp_mids_fini(struct mlxsw_sp *mlxsw_sp)
1978+
{
1979+
struct mlxsw_sp_mid *mid, *tmp;
1980+
1981+
list_for_each_entry_safe(mid, tmp, &mlxsw_sp->bridge->mids_list, list) {
1982+
list_del(&mid->list);
1983+
clear_bit(mid->mid, mlxsw_sp->bridge->mids_bitmap);
1984+
kfree(mid);
1985+
}
1986+
}
1987+
19771988
int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp)
19781989
{
19791990
struct mlxsw_sp_bridge *bridge;
@@ -1996,7 +2007,7 @@ int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp)
19962007
void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp)
19972008
{
19982009
mlxsw_sp_fdb_fini(mlxsw_sp);
1999-
WARN_ON(!list_empty(&mlxsw_sp->bridge->mids_list));
2010+
mlxsw_sp_mids_fini(mlxsw_sp);
20002011
WARN_ON(!list_empty(&mlxsw_sp->bridge->bridges_list));
20012012
kfree(mlxsw_sp->bridge);
20022013
}

0 commit comments

Comments
 (0)