RDMA/mlx5: Send events from IB driver about device affiliation state
authorPatrisious Haddad <phaddad@nvidia.com>
Thu, 21 Sep 2023 12:10:27 +0000 (15:10 +0300)
committerLeon Romanovsky <leon@kernel.org>
Mon, 2 Oct 2023 08:20:59 +0000 (11:20 +0300)
Send blocking events from IB driver whenever the device is done being
affiliated or if it is removed from an affiliation.

This is useful since now the EN driver can register to those event and
know when a device is affiliated or not.

Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Link: https://lore.kernel.org/r/a7491c3e483cfd8d962f5f75b9a25f253043384a.1695296682.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/mlx5/main.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
include/linux/mlx5/device.h
include/linux/mlx5/driver.h

index aed5cdea50e6c08f35691320a3a50b6fff173973..530d88784e41a7993eb8e1b5a35132b7c27ba989 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/mlx5/vport.h>
 #include <linux/mlx5/fs.h>
 #include <linux/mlx5/eswitch.h>
+#include <linux/mlx5/driver.h>
 #include <linux/list.h>
 #include <rdma/ib_smi.h>
 #include <rdma/ib_umem_odp.h>
@@ -3175,6 +3176,13 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
 
        lockdep_assert_held(&mlx5_ib_multiport_mutex);
 
+       mlx5_core_mp_event_replay(ibdev->mdev,
+                                 MLX5_DRIVER_EVENT_AFFILIATION_REMOVED,
+                                 NULL);
+       mlx5_core_mp_event_replay(mpi->mdev,
+                                 MLX5_DRIVER_EVENT_AFFILIATION_REMOVED,
+                                 NULL);
+
        mlx5_ib_cleanup_cong_debugfs(ibdev, port_num);
 
        spin_lock(&port->mp.mpi_lock);
@@ -3226,6 +3234,7 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
                                    struct mlx5_ib_multiport_info *mpi)
 {
        u32 port_num = mlx5_core_native_port_num(mpi->mdev) - 1;
+       u64 key;
        int err;
 
        lockdep_assert_held(&mlx5_ib_multiport_mutex);
@@ -3254,6 +3263,14 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
 
        mlx5_ib_init_cong_debugfs(ibdev, port_num);
 
+       key = ibdev->ib_dev.index;
+       mlx5_core_mp_event_replay(mpi->mdev,
+                                 MLX5_DRIVER_EVENT_AFFILIATION_DONE,
+                                 &key);
+       mlx5_core_mp_event_replay(ibdev->mdev,
+                                 MLX5_DRIVER_EVENT_AFFILIATION_DONE,
+                                 &key);
+
        return true;
 
 unbind:
index 15561965d2afa8c12432cd76646fd927fdb29b66..6ca91c0e8a6a5397490c6051b102ce730aa507a6 100644 (file)
@@ -361,6 +361,12 @@ void mlx5_core_uplink_netdev_event_replay(struct mlx5_core_dev *dev)
 }
 EXPORT_SYMBOL(mlx5_core_uplink_netdev_event_replay);
 
+void mlx5_core_mp_event_replay(struct mlx5_core_dev *dev, u32 event, void *data)
+{
+       mlx5_blocking_notifier_call_chain(dev, event, data);
+}
+EXPORT_SYMBOL(mlx5_core_mp_event_replay);
+
 int mlx5_core_get_caps_mode(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type,
                            enum mlx5_cap_mode cap_mode)
 {
index 4d5be378fa8cccd431c7d22cc24275efea4225bb..26333d602a50510ad511a4bb7aa30f56c25abeb1 100644 (file)
@@ -366,6 +366,8 @@ enum mlx5_driver_event {
        MLX5_DRIVER_EVENT_UPLINK_NETDEV,
        MLX5_DRIVER_EVENT_MACSEC_SA_ADDED,
        MLX5_DRIVER_EVENT_MACSEC_SA_DELETED,
+       MLX5_DRIVER_EVENT_AFFILIATION_DONE,
+       MLX5_DRIVER_EVENT_AFFILIATION_REMOVED,
 };
 
 enum {
index 3033bbaeac81c398fedd5508b178c344fb9443f5..5ca4e085d8133fe14cf03c93b9589923e475b5df 100644 (file)
@@ -1027,6 +1027,8 @@ bool mlx5_cmd_is_down(struct mlx5_core_dev *dev);
 void mlx5_core_uplink_netdev_set(struct mlx5_core_dev *mdev, struct net_device *netdev);
 void mlx5_core_uplink_netdev_event_replay(struct mlx5_core_dev *mdev);
 
+void mlx5_core_mp_event_replay(struct mlx5_core_dev *dev, u32 event, void *data);
+
 void mlx5_health_cleanup(struct mlx5_core_dev *dev);
 int mlx5_health_init(struct mlx5_core_dev *dev);
 void mlx5_start_health_poll(struct mlx5_core_dev *dev);