IB/mlx4: Build the port IBoE GID table properly under bonding
When scanning netdevices we need to check a few more conditions and cases to build the IBoE GID table properly. For example, under bonding we must make sure that when a port is down, the bond IP address isn't programmed as a GID, since doing so will cause failure with IB core flows that selects ports by GID. Signed-off-by: Moni Shoua <monis@mellanox.co.il> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
Родитель
5071456fe2
Коммит
ad4885d279
|
@ -1507,7 +1507,6 @@ static int reset_gid_table(struct mlx4_ib_dev *dev, u8 port)
|
||||||
{
|
{
|
||||||
struct update_gid_work *work;
|
struct update_gid_work *work;
|
||||||
|
|
||||||
|
|
||||||
work = kzalloc(sizeof(*work), GFP_ATOMIC);
|
work = kzalloc(sizeof(*work), GFP_ATOMIC);
|
||||||
if (!work)
|
if (!work)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1699,25 +1698,57 @@ static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev)
|
||||||
|
|
||||||
spin_lock(&iboe->lock);
|
spin_lock(&iboe->lock);
|
||||||
mlx4_foreach_ib_transport_port(port, ibdev->dev) {
|
mlx4_foreach_ib_transport_port(port, ibdev->dev) {
|
||||||
|
enum ib_port_state port_state = IB_PORT_NOP;
|
||||||
struct net_device *old_master = iboe->masters[port - 1];
|
struct net_device *old_master = iboe->masters[port - 1];
|
||||||
|
struct net_device *curr_netdev;
|
||||||
struct net_device *curr_master;
|
struct net_device *curr_master;
|
||||||
|
|
||||||
iboe->netdevs[port - 1] =
|
iboe->netdevs[port - 1] =
|
||||||
mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port);
|
mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port);
|
||||||
if (iboe->netdevs[port - 1])
|
if (iboe->netdevs[port - 1])
|
||||||
mlx4_ib_set_default_gid(ibdev,
|
mlx4_ib_set_default_gid(ibdev,
|
||||||
iboe->netdevs[port - 1], port);
|
iboe->netdevs[port - 1], port);
|
||||||
|
curr_netdev = iboe->netdevs[port - 1];
|
||||||
|
|
||||||
if (iboe->netdevs[port - 1] &&
|
if (iboe->netdevs[port - 1] &&
|
||||||
netif_is_bond_slave(iboe->netdevs[port - 1])) {
|
netif_is_bond_slave(iboe->netdevs[port - 1])) {
|
||||||
iboe->masters[port - 1] = netdev_master_upper_dev_get(
|
iboe->masters[port - 1] = netdev_master_upper_dev_get(
|
||||||
iboe->netdevs[port - 1]);
|
iboe->netdevs[port - 1]);
|
||||||
|
} else {
|
||||||
|
iboe->masters[port - 1] = NULL;
|
||||||
}
|
}
|
||||||
curr_master = iboe->masters[port - 1];
|
curr_master = iboe->masters[port - 1];
|
||||||
|
|
||||||
|
if (curr_netdev) {
|
||||||
|
port_state = (netif_running(curr_netdev) && netif_carrier_ok(curr_netdev)) ?
|
||||||
|
IB_PORT_ACTIVE : IB_PORT_DOWN;
|
||||||
|
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
||||||
|
} else {
|
||||||
|
reset_gid_table(ibdev, port);
|
||||||
|
}
|
||||||
|
/* if using bonding/team and a slave port is down, we don't the bond IP
|
||||||
|
* based gids in the table since flows that select port by gid may get
|
||||||
|
* the down port.
|
||||||
|
*/
|
||||||
|
if (curr_master && (port_state == IB_PORT_DOWN)) {
|
||||||
|
reset_gid_table(ibdev, port);
|
||||||
|
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
||||||
|
}
|
||||||
/* if bonding is used it is possible that we add it to masters
|
/* if bonding is used it is possible that we add it to masters
|
||||||
only after IP address is assigned to the net bonding
|
* only after IP address is assigned to the net bonding
|
||||||
interface */
|
* interface.
|
||||||
if (curr_master && (old_master != curr_master))
|
*/
|
||||||
|
if (curr_master && (old_master != curr_master)) {
|
||||||
|
reset_gid_table(ibdev, port);
|
||||||
|
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
||||||
mlx4_ib_get_dev_addr(curr_master, ibdev, port);
|
mlx4_ib_get_dev_addr(curr_master, ibdev, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!curr_master && (old_master != curr_master)) {
|
||||||
|
reset_gid_table(ibdev, port);
|
||||||
|
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
||||||
|
mlx4_ib_get_dev_addr(curr_netdev, ibdev, port);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&iboe->lock);
|
spin_unlock(&iboe->lock);
|
||||||
|
@ -2099,6 +2130,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
for (i = 1 ; i <= ibdev->num_ports ; ++i)
|
||||||
|
reset_gid_table(ibdev, i);
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
mlx4_ib_scan_netdevs(ibdev);
|
mlx4_ib_scan_netdevs(ibdev);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
|
|
Загрузка…
Ссылка в новой задаче