mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-12 08:45:11 +08:00
mlx4: trigger IB events needed by SMC
The mlx4 driver does not trigger an IB_EVENT_PORT_ACTIVE when the RoCE network interface is activated. When SMC determines the RoCE device port to be used, it checks the port states. This patch triggers IB events for NETDEV_UP and NETDEV_DOWN. Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Acked-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
9828ca654b
commit
fc6526fba1
@ -2352,6 +2352,32 @@ static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev,
|
|||||||
event == NETDEV_UP || event == NETDEV_CHANGE))
|
event == NETDEV_UP || event == NETDEV_CHANGE))
|
||||||
update_qps_port = port;
|
update_qps_port = port;
|
||||||
|
|
||||||
|
if (dev == iboe->netdevs[port - 1] &&
|
||||||
|
(event == NETDEV_UP || event == NETDEV_DOWN)) {
|
||||||
|
enum ib_port_state port_state;
|
||||||
|
struct ib_event ibev = { };
|
||||||
|
|
||||||
|
if (ib_get_cached_port_state(&ibdev->ib_dev, port,
|
||||||
|
&port_state))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (event == NETDEV_UP &&
|
||||||
|
(port_state != IB_PORT_ACTIVE ||
|
||||||
|
iboe->last_port_state[port - 1] != IB_PORT_DOWN))
|
||||||
|
continue;
|
||||||
|
if (event == NETDEV_DOWN &&
|
||||||
|
(port_state != IB_PORT_DOWN ||
|
||||||
|
iboe->last_port_state[port - 1] != IB_PORT_ACTIVE))
|
||||||
|
continue;
|
||||||
|
iboe->last_port_state[port - 1] = port_state;
|
||||||
|
|
||||||
|
ibev.device = &ibdev->ib_dev;
|
||||||
|
ibev.element.port_num = port;
|
||||||
|
ibev.event = event == NETDEV_UP ? IB_EVENT_PORT_ACTIVE :
|
||||||
|
IB_EVENT_PORT_ERR;
|
||||||
|
ib_dispatch_event(&ibev);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
spin_unlock_bh(&iboe->lock);
|
spin_unlock_bh(&iboe->lock);
|
||||||
|
|
||||||
@ -2710,6 +2736,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
|
|||||||
for (i = 0; i < ibdev->num_ports; ++i) {
|
for (i = 0; i < ibdev->num_ports; ++i) {
|
||||||
mutex_init(&ibdev->counters_table[i].mutex);
|
mutex_init(&ibdev->counters_table[i].mutex);
|
||||||
INIT_LIST_HEAD(&ibdev->counters_table[i].counters_list);
|
INIT_LIST_HEAD(&ibdev->counters_table[i].counters_list);
|
||||||
|
iboe->last_port_state[i] = IB_PORT_DOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_req_counters = mlx4_is_bonded(dev) ? 1 : ibdev->num_ports;
|
num_req_counters = mlx4_is_bonded(dev) ? 1 : ibdev->num_ports;
|
||||||
|
@ -519,6 +519,7 @@ struct mlx4_ib_iboe {
|
|||||||
atomic64_t mac[MLX4_MAX_PORTS];
|
atomic64_t mac[MLX4_MAX_PORTS];
|
||||||
struct notifier_block nb;
|
struct notifier_block nb;
|
||||||
struct mlx4_port_gid_table gids[MLX4_MAX_PORTS];
|
struct mlx4_port_gid_table gids[MLX4_MAX_PORTS];
|
||||||
|
enum ib_port_state last_port_state[MLX4_MAX_PORTS];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pkey_mgt {
|
struct pkey_mgt {
|
||||||
|
Loading…
Reference in New Issue
Block a user