Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
---
drivers/infiniband/core/addr.c | 15 ++++
- drivers/infiniband/core/cma.c | 39 +++++++++
+ drivers/infiniband/core/cma.c | 27 ++++++
drivers/infiniband/core/cma_configfs.c | 93 ++++++++++++++++++++
drivers/infiniband/core/core_priv.h | 9 ++
drivers/infiniband/core/cq.c | 35 +++++++-
drivers/infiniband/core/netlink.c | 29 +++++++
drivers/infiniband/core/nldev.c | 25 ++++++
drivers/infiniband/core/restrack.c | 4 +
- drivers/infiniband/core/roce_gid_mgmt.c | 39 +++++++++
+ drivers/infiniband/core/roce_gid_mgmt.c | 31 +++++++
drivers/infiniband/core/sa_query.c | 47 ++++++++++
drivers/infiniband/core/ucm.c | 16 ++++
drivers/infiniband/core/ucma.c | 15 ++++
include/rdma/ib_verbs.h | 147 ++++++++++++++++++++++++++++++++
include/rdma/rdma_netlink.h | 4 +
include/rdma/restrack.h | 2 +
- 23 files changed, 707 insertions(+), 1 deletion(-)
+ 23 files changed, 687 insertions(+), 1 deletion(-)
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index xxxxxxx..xxxxxxx xxxxxx
}
static void iboe_mcast_work_handler(struct work_struct *work)
-@@ -4574,7 +4601,11 @@ static int __init cma_init(void)
-
- ib_sa_register_client(&sa_client);
- rdma_addr_register_client(&addr_client);
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ register_netdevice_notifier_rh(&cma_nb);
-+#else
- register_netdevice_notifier(&cma_nb);
-+#endif
-
- ret = ib_register_client(&cma_client);
- if (ret)
-@@ -4586,7 +4617,11 @@ static int __init cma_init(void)
- return 0;
-
- err:
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ unregister_netdevice_notifier_rh(&cma_nb);
-+#else
- unregister_netdevice_notifier(&cma_nb);
-+#endif
- rdma_addr_unregister_client(&addr_client);
- ib_sa_unregister_client(&sa_client);
- err_wq:
-@@ -4599,7 +4634,11 @@ static void __exit cma_cleanup(void)
- cma_configfs_exit();
- rdma_nl_unregister(RDMA_NL_RDMA_CM);
- ib_unregister_client(&cma_client);
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ unregister_netdevice_notifier_rh(&cma_nb);
-+#else
- unregister_netdevice_notifier(&cma_nb);
-+#endif
- rdma_addr_unregister_client(&addr_client);
- ib_sa_unregister_client(&sa_client);
- unregister_pernet_subsys(&cma_pernet_operations);
diff --git a/drivers/infiniband/core/cma_configfs.c b/drivers/infiniband/core/cma_configfs.c
index xxxxxxx..xxxxxxx xxxxxx
--- a/drivers/infiniband/core/cma_configfs.c
break;
default:
-@@ -763,7 +794,11 @@ int __init roce_gid_mgmt_init(void)
- * last to make sure we will not miss any IP add/del
- * callbacks.
- */
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ register_netdevice_notifier_rh(&nb_netdevice);
-+#else
- register_netdevice_notifier(&nb_netdevice);
-+#endif
-
- return 0;
- }
-@@ -773,7 +808,11 @@ void __exit roce_gid_mgmt_cleanup(void)
- if (IS_ENABLED(CONFIG_IPV6))
- unregister_inet6addr_notifier(&nb_inet6addr);
- unregister_inetaddr_notifier(&nb_inetaddr);
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ unregister_netdevice_notifier_rh(&nb_netdevice);
-+#else
- unregister_netdevice_notifier(&nb_netdevice);
-+#endif
- /* Ensure all gid deletion tasks complete before we go down,
- * to avoid any reference to free'd memory. By the time
- * ib-core is removed, all physical devices have been removed,
diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c
index xxxxxxx..xxxxxxx xxxxxx
--- a/drivers/infiniband/core/sa_query.c
Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
---
- drivers/infiniband/ulp/ipoib/ipoib_main.c | 64 +++++++++++++++++++++++++++-
- drivers/infiniband/ulp/ipoib/ipoib_netlink.c | 31 +++++++++++++-
- 2 files changed, 93 insertions(+), 2 deletions(-)
+ drivers/infiniband/ulp/ipoib/ipoib_main.c | 56 +++++++++++++++++++++++++++-
+ drivers/infiniband/ulp/ipoib/ipoib_netlink.c | 31 ++++++++++++++-
+ 2 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index xxxxxxx..xxxxxxx xxxxxx
priv->dev->neigh_priv_len = sizeof(struct ipoib_neigh);
-@@ -2491,8 +2545,12 @@ static int __init ipoib_init_module(void)
- goto err_client;
-
- #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ register_netdevice_notifier_rh(&ipoib_netdev_notifier);
-+#else
- register_netdevice_notifier(&ipoib_netdev_notifier);
- #endif
-+#endif
- return 0;
-
- err_client:
-@@ -2511,8 +2569,12 @@ err_fs:
- static void __exit ipoib_cleanup_module(void)
- {
- #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ unregister_netdevice_notifier_rh(&ipoib_netdev_notifier);
-+#else
- unregister_netdevice_notifier(&ipoib_netdev_notifier);
- #endif
-+#endif
- ipoib_netlink_fini();
- ib_unregister_client(&ipoib_client);
- ib_sa_unregister_client(&ipoib_sa_client);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
index xxxxxxx..xxxxxxx xxxxxx
--- a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
---
drivers/infiniband/hw/mlx5/ib_virt.c | 12 +
- drivers/infiniband/hw/mlx5/main.c | 21 +
+ drivers/infiniband/hw/mlx5/main.c | 13 +
drivers/infiniband/hw/mlx5/mlx5_ib.h | 2 +
drivers/infiniband/hw/mlx5/mr.c | 12 +
drivers/net/ethernet/mellanox/mlx5/core/en.h | 6 +
drivers/net/ethernet/mellanox/mlx5/core/en_fs.c | 2 +
drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 486 ++++++++++++++++++++-
drivers/net/ethernet/mellanox/mlx5/core/health.c | 14 +
- drivers/net/ethernet/mellanox/mlx5/core/lag.c | 55 +++
+ drivers/net/ethernet/mellanox/mlx5/core/lag.c | 47 ++
.../net/ethernet/mellanox/mlx5/core/lib/clock.c | 5 +
drivers/net/ethernet/mellanox/mlx5/core/lib/gid.c | 16 +
drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 +
- 13 files changed, 870 insertions(+), 6 deletions(-)
+ 13 files changed, 854 insertions(+), 6 deletions(-)
diff --git a/drivers/infiniband/hw/mlx5/ib_virt.c b/drivers/infiniband/hw/mlx5/ib_virt.c
index xxxxxxx..xxxxxxx xxxxxx
return -EPERM;
#elif !(defined(CONFIG_PPC) || (defined(CONFIG_ARM) && defined(CONFIG_MMU)))
return -EPERM;
-@@ -4289,7 +4296,11 @@ static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev, u8 port_num)
- int err;
-
- dev->roce[port_num].nb.notifier_call = mlx5_netdev_event;
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ err = register_netdevice_notifier_rh(&dev->roce[port_num].nb);
-+#else
- err = register_netdevice_notifier(&dev->roce[port_num].nb);
-+#endif
- if (err) {
- dev->roce[port_num].nb.notifier_call = NULL;
- return err;
-@@ -4301,7 +4312,11 @@ static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev, u8 port_num)
- static void mlx5_remove_netdev_notifier(struct mlx5_ib_dev *dev, u8 port_num)
- {
- if (dev->roce[port_num].nb.notifier_call) {
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ unregister_netdevice_notifier_rh(&dev->roce[port_num].nb);
-+#else
- unregister_netdevice_notifier(&dev->roce[port_num].nb);
-+#endif
- dev->roce[port_num].nb.notifier_call = NULL;
- }
- }
-@@ -5201,12 +5216,18 @@ int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
+@@ -5201,12 +5208,18 @@ int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
if (MLX5_CAP_GEN(mdev, ipoib_enhanced_offloads))
dev->ib_dev.alloc_rdma_netdev = mlx5_ib_alloc_rdma_netdev;
struct mlx5_lag *ldev = NULL;
struct mlx5_core_dev *tmp_dev;
-@@ -515,16 +534,22 @@ void mlx5_lag_add(struct mlx5_core_dev *dev, struct net_device *netdev)
-
- if (!ldev->nb.notifier_call) {
- ldev->nb.notifier_call = mlx5_lag_netdev_event;
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ if (register_netdevice_notifier_rh(&ldev->nb)) {
-+#else
- if (register_netdevice_notifier(&ldev->nb)) {
-+#endif
- ldev->nb.notifier_call = NULL;
+@@ -520,11 +539,13 @@ void mlx5_lag_add(struct mlx5_core_dev *dev, struct net_device *netdev)
mlx5_core_err(dev, "Failed to register LAG netdev notifier\n");
}
}
struct mlx5_lag *ldev;
int i;
-@@ -543,14 +568,22 @@ void mlx5_lag_remove(struct mlx5_core_dev *dev)
-
- if (i == MLX5_MAX_PORTS) {
- if (ldev->nb.notifier_call)
-+#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
-+ unregister_netdevice_notifier_rh(&ldev->nb);
-+#else
- unregister_netdevice_notifier(&ldev->nb);
-+#endif
+@@ -547,10 +568,14 @@ void mlx5_lag_remove(struct mlx5_core_dev *dev)
cancel_delayed_work_sync(&ldev->bond_work);
mlx5_lag_dev_free(ldev);
}
struct mlx5_lag *ldev;
bool res;
-@@ -560,11 +593,13 @@ bool mlx5_lag_is_active(struct mlx5_core_dev *dev)
+@@ -560,11 +585,13 @@ bool mlx5_lag_is_active(struct mlx5_core_dev *dev)
mutex_unlock(&lag_mutex);
return res;
struct mlx5_lag *ldev;
int ret = 0;
bool lag_active;
-@@ -589,6 +624,9 @@ static int mlx5_lag_set_state(struct mlx5_core_dev *dev, bool allow)
+@@ -589,6 +616,9 @@ static int mlx5_lag_set_state(struct mlx5_core_dev *dev, bool allow)
unlock:
mlx5_dev_list_unlock();
return ret;
}
int mlx5_lag_forbid(struct mlx5_core_dev *dev)
-@@ -603,6 +641,9 @@ int mlx5_lag_allow(struct mlx5_core_dev *dev)
+@@ -603,6 +633,9 @@ int mlx5_lag_allow(struct mlx5_core_dev *dev)
struct net_device *mlx5_lag_get_roce_netdev(struct mlx5_core_dev *dev)
{
struct net_device *ndev = NULL;
struct mlx5_lag *ldev;
-@@ -625,11 +666,15 @@ unlock:
+@@ -625,11 +658,15 @@ unlock:
mutex_unlock(&lag_mutex);
return ndev;
struct mlx5_core_dev *dev = container_of(priv, struct mlx5_core_dev,
priv);
struct mlx5_lag *ldev;
-@@ -643,6 +688,7 @@ bool mlx5_lag_intf_add(struct mlx5_interface *intf, struct mlx5_priv *priv)
+@@ -643,6 +680,7 @@ bool mlx5_lag_intf_add(struct mlx5_interface *intf, struct mlx5_priv *priv)
/* If bonded, we do not add an IB device for PF1. */
return false;
}
int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
-@@ -652,7 +698,9 @@ int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
+@@ -652,7 +690,9 @@ int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
{
int outlen = MLX5_ST_SZ_BYTES(query_cong_statistics_out);
struct mlx5_core_dev *mdev[MLX5_MAX_PORTS];
int num_ports;
int ret, i, j;
void *out;
-@@ -663,6 +711,7 @@ int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
+@@ -663,6 +703,7 @@ int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
memset(values, 0, sizeof(*values) * num_counters);
mutex_lock(&lag_mutex);
ldev = mlx5_lag_dev_get(dev);
if (ldev && mlx5_lag_is_bonded(ldev)) {
-@@ -673,6 +722,10 @@ int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
+@@ -673,6 +714,10 @@ int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
num_ports = 1;
mdev[0] = dev;
}
for (i = 0; i < num_ports; ++i) {
ret = mlx5_cmd_query_cong_counter(mdev[i], false, out, outlen);
-@@ -684,7 +737,9 @@ int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
+@@ -684,7 +729,9 @@ int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
}
unlock: