Skip to content

Commit f0cebd8

Browse files
idoschdavem330
authored andcommitted
mlxsw: spectrum: Don't lose bridge port device during enslavement
Currently, when port netdevs (or their uppers) are enslaved to a bridge, we simply propagate the CHANGEUPPER event all the way down and lose the context of the actual netdevice used as the bridge port. This leads to a lot of information hanging off the ports (and vPorts), which doesn't logically belong there, such as mrouter indication and unknown unicast flood state. Following patches are going to put the mlxsw_sp_port struct on diet and instead introduce a bridge port struct, where the above mentioned information belongs. But in order to do that, we need to be able to determine the bridge port netdevice, so propagate it down. Signed-off-by: Ido Schimmel <[email protected]> Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7cbecf2 commit f0cebd8

File tree

1 file changed

+44
-23
lines changed

1 file changed

+44
-23
lines changed

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

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4026,6 +4026,7 @@ static void mlxsw_sp_master_bridge_dec(struct mlxsw_sp *mlxsw_sp)
40264026
}
40274027

40284028
static int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
4029+
struct net_device *brport_dev,
40294030
struct net_device *br_dev)
40304031
{
40314032
struct net_device *dev = mlxsw_sp_port->dev;
@@ -4053,7 +4054,9 @@ static int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
40534054
return 0;
40544055
}
40554056

4056-
static void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port)
4057+
static void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
4058+
struct net_device *brport_dev,
4059+
struct net_device *br_dev)
40574060
{
40584061
struct net_device *dev = mlxsw_sp_port->dev;
40594062

@@ -4302,7 +4305,7 @@ static void mlxsw_sp_port_lag_leave(struct mlxsw_sp_port *mlxsw_sp_port,
43024305

43034306
if (mlxsw_sp_port->bridged) {
43044307
mlxsw_sp_port_active_vlans_del(mlxsw_sp_port);
4305-
mlxsw_sp_port_bridge_leave(mlxsw_sp_port);
4308+
mlxsw_sp_port_bridge_leave(mlxsw_sp_port, NULL, NULL);
43064309
}
43074310

43084311
if (lag->ref_count == 1)
@@ -4439,7 +4442,8 @@ static void mlxsw_sp_port_ovs_leave(struct mlxsw_sp_port *mlxsw_sp_port)
44394442
mlxsw_sp_port_vp_mode_set(mlxsw_sp_port, false);
44404443
}
44414444

4442-
static int mlxsw_sp_netdevice_port_upper_event(struct net_device *dev,
4445+
static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev,
4446+
struct net_device *dev,
44434447
unsigned long event, void *ptr)
44444448
{
44454449
struct netdev_notifier_changeupper_info *info;
@@ -4492,9 +4496,12 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *dev,
44924496
} else if (netif_is_bridge_master(upper_dev)) {
44934497
if (info->linking)
44944498
err = mlxsw_sp_port_bridge_join(mlxsw_sp_port,
4499+
lower_dev,
44954500
upper_dev);
44964501
else
4497-
mlxsw_sp_port_bridge_leave(mlxsw_sp_port);
4502+
mlxsw_sp_port_bridge_leave(mlxsw_sp_port,
4503+
lower_dev,
4504+
upper_dev);
44984505
} else if (netif_is_lag_master(upper_dev)) {
44994506
if (info->linking)
45004507
err = mlxsw_sp_port_lag_join(mlxsw_sp_port,
@@ -4541,15 +4548,18 @@ static int mlxsw_sp_netdevice_port_lower_event(struct net_device *dev,
45414548
return 0;
45424549
}
45434550

4544-
static int mlxsw_sp_netdevice_port_event(struct net_device *dev,
4551+
static int mlxsw_sp_netdevice_port_event(struct net_device *lower_dev,
4552+
struct net_device *port_dev,
45454553
unsigned long event, void *ptr)
45464554
{
45474555
switch (event) {
45484556
case NETDEV_PRECHANGEUPPER:
45494557
case NETDEV_CHANGEUPPER:
4550-
return mlxsw_sp_netdevice_port_upper_event(dev, event, ptr);
4558+
return mlxsw_sp_netdevice_port_upper_event(lower_dev, port_dev,
4559+
event, ptr);
45514560
case NETDEV_CHANGELOWERSTATE:
4552-
return mlxsw_sp_netdevice_port_lower_event(dev, event, ptr);
4561+
return mlxsw_sp_netdevice_port_lower_event(port_dev, event,
4562+
ptr);
45534563
}
45544564

45554565
return 0;
@@ -4564,7 +4574,8 @@ static int mlxsw_sp_netdevice_lag_event(struct net_device *lag_dev,
45644574

45654575
netdev_for_each_lower_dev(lag_dev, dev, iter) {
45664576
if (mlxsw_sp_port_dev_check(dev)) {
4567-
ret = mlxsw_sp_netdevice_port_event(dev, event, ptr);
4577+
ret = mlxsw_sp_netdevice_port_event(lag_dev, dev, event,
4578+
ptr);
45684579
if (ret)
45694580
return ret;
45704581
}
@@ -4807,6 +4818,7 @@ mlxsw_sp_port_vlan_vfid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
48074818
}
48084819

48094820
static int mlxsw_sp_vport_bridge_join(struct mlxsw_sp_port *mlxsw_sp_vport,
4821+
struct net_device *brport_dev,
48104822
struct net_device *br_dev)
48114823
{
48124824
struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
@@ -4848,7 +4860,9 @@ static int mlxsw_sp_vport_bridge_join(struct mlxsw_sp_port *mlxsw_sp_vport,
48484860
return err;
48494861
}
48504862

4851-
static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport)
4863+
static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport,
4864+
struct net_device *brport_dev,
4865+
struct net_device *br_dev)
48524866
{
48534867
u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
48544868
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
@@ -4885,9 +4899,10 @@ mlxsw_sp_port_master_bridge_check(const struct mlxsw_sp_port *mlxsw_sp_port,
48854899
return true;
48864900
}
48874901

4888-
static int mlxsw_sp_netdevice_vport_event(struct net_device *dev,
4889-
unsigned long event, void *ptr,
4890-
u16 vid)
4902+
static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev,
4903+
struct net_device *dev,
4904+
unsigned long event, void *ptr,
4905+
u16 vid)
48914906
{
48924907
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
48934908
struct netdev_notifier_changeupper_info *info = ptr;
@@ -4919,9 +4934,12 @@ static int mlxsw_sp_netdevice_vport_event(struct net_device *dev,
49194934
if (netif_is_bridge_master(upper_dev)) {
49204935
if (info->linking)
49214936
err = mlxsw_sp_vport_bridge_join(mlxsw_sp_vport,
4937+
vlan_dev,
49224938
upper_dev);
49234939
else
4924-
mlxsw_sp_vport_bridge_leave(mlxsw_sp_vport);
4940+
mlxsw_sp_vport_bridge_leave(mlxsw_sp_vport,
4941+
vlan_dev,
4942+
upper_dev);
49254943
} else {
49264944
err = -EINVAL;
49274945
WARN_ON(1);
@@ -4932,18 +4950,20 @@ static int mlxsw_sp_netdevice_vport_event(struct net_device *dev,
49324950
return err;
49334951
}
49344952

4935-
static int mlxsw_sp_netdevice_lag_vport_event(struct net_device *lag_dev,
4936-
unsigned long event, void *ptr,
4937-
u16 vid)
4953+
static int mlxsw_sp_netdevice_lag_port_vlan_event(struct net_device *vlan_dev,
4954+
struct net_device *lag_dev,
4955+
unsigned long event,
4956+
void *ptr, u16 vid)
49384957
{
49394958
struct net_device *dev;
49404959
struct list_head *iter;
49414960
int ret;
49424961

49434962
netdev_for_each_lower_dev(lag_dev, dev, iter) {
49444963
if (mlxsw_sp_port_dev_check(dev)) {
4945-
ret = mlxsw_sp_netdevice_vport_event(dev, event, ptr,
4946-
vid);
4964+
ret = mlxsw_sp_netdevice_port_vlan_event(vlan_dev, dev,
4965+
event, ptr,
4966+
vid);
49474967
if (ret)
49484968
return ret;
49494969
}
@@ -4959,11 +4979,12 @@ static int mlxsw_sp_netdevice_vlan_event(struct net_device *vlan_dev,
49594979
u16 vid = vlan_dev_vlan_id(vlan_dev);
49604980

49614981
if (mlxsw_sp_port_dev_check(real_dev))
4962-
return mlxsw_sp_netdevice_vport_event(real_dev, event, ptr,
4963-
vid);
4982+
return mlxsw_sp_netdevice_port_vlan_event(vlan_dev, real_dev,
4983+
event, ptr, vid);
49644984
else if (netif_is_lag_master(real_dev))
4965-
return mlxsw_sp_netdevice_lag_vport_event(real_dev, event, ptr,
4966-
vid);
4985+
return mlxsw_sp_netdevice_lag_port_vlan_event(vlan_dev,
4986+
real_dev, event,
4987+
ptr, vid);
49674988

49684989
return 0;
49694990
}
@@ -4988,7 +5009,7 @@ static int mlxsw_sp_netdevice_event(struct notifier_block *unused,
49885009
else if (mlxsw_sp_is_vrf_event(event, ptr))
49895010
err = mlxsw_sp_netdevice_vrf_event(dev, event, ptr);
49905011
else if (mlxsw_sp_port_dev_check(dev))
4991-
err = mlxsw_sp_netdevice_port_event(dev, event, ptr);
5012+
err = mlxsw_sp_netdevice_port_event(dev, dev, event, ptr);
49925013
else if (netif_is_lag_master(dev))
49935014
err = mlxsw_sp_netdevice_lag_event(dev, event, ptr);
49945015
else if (netif_is_bridge_master(dev))

0 commit comments

Comments
 (0)