From: Roi Dayan <r...@nvidia.com>

Also cleanup neigh in profile disable.
This is for logical separation.

Signed-off-by: Roi Dayan <r...@nvidia.com>
Signed-off-by: Saeed Mahameed <sae...@nvidia.com>
---
 .../mellanox/mlx5/core/en/rep/neigh.c         | 18 ++++++++----
 .../net/ethernet/mellanox/mlx5/core/en_rep.c  | 29 ++++++++++---------
 2 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/neigh.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/neigh.c
index 58e27038c947..616ee585a985 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/neigh.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/neigh.c
@@ -279,7 +279,7 @@ int mlx5e_rep_neigh_init(struct mlx5e_rep_priv *rpriv)
 
        err = rhashtable_init(&neigh_update->neigh_ht, &mlx5e_neigh_ht_params);
        if (err)
-               return err;
+               goto out_err;
 
        INIT_LIST_HEAD(&neigh_update->neigh_list);
        mutex_init(&neigh_update->encap_lock);
@@ -287,14 +287,19 @@ int mlx5e_rep_neigh_init(struct mlx5e_rep_priv *rpriv)
                          mlx5e_rep_neigh_stats_work);
        mlx5e_rep_neigh_update_init_interval(rpriv);
 
-       rpriv->neigh_update.netevent_nb.notifier_call = 
mlx5e_rep_netevent_event;
-       err = register_netevent_notifier(&rpriv->neigh_update.netevent_nb);
+       neigh_update->netevent_nb.notifier_call = mlx5e_rep_netevent_event;
+       err = register_netevent_notifier(&neigh_update->netevent_nb);
        if (err)
-               goto out_err;
+               goto out_notifier;
        return 0;
 
-out_err:
+out_notifier:
+       neigh_update->netevent_nb.notifier_call = NULL;
        rhashtable_destroy(&neigh_update->neigh_ht);
+out_err:
+       netdev_warn(rpriv->netdev,
+                   "Failed to initialize neighbours handling for vport %d\n",
+                   rpriv->rep->vport);
        return err;
 }
 
@@ -303,6 +308,9 @@ void mlx5e_rep_neigh_cleanup(struct mlx5e_rep_priv *rpriv)
        struct mlx5e_neigh_update_table *neigh_update = &rpriv->neigh_update;
        struct mlx5e_priv *priv = netdev_priv(rpriv->netdev);
 
+       if (!rpriv->neigh_update.netevent_nb.notifier_call)
+               return;
+
        unregister_netevent_notifier(&neigh_update->netevent_nb);
 
        flush_workqueue(priv->wq); /* flush neigh update works */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index 45669a1db426..84eeaa33033f 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -1051,7 +1051,17 @@ static void mlx5e_cleanup_rep_tx(struct mlx5e_priv *priv)
 
 static void mlx5e_rep_enable(struct mlx5e_priv *priv)
 {
+       struct mlx5e_rep_priv *rpriv = priv->ppriv;
+
        mlx5e_set_netdev_mtu_boundaries(priv);
+       mlx5e_rep_neigh_init(rpriv);
+}
+
+static void mlx5e_rep_disable(struct mlx5e_priv *priv)
+{
+       struct mlx5e_rep_priv *rpriv = priv->ppriv;
+
+       mlx5e_rep_neigh_cleanup(rpriv);
 }
 
 static int mlx5e_update_rep_rx(struct mlx5e_priv *priv)
@@ -1086,6 +1096,7 @@ static int uplink_rep_async_event(struct notifier_block 
*nb, unsigned long event
 
 static void mlx5e_uplink_rep_enable(struct mlx5e_priv *priv)
 {
+       struct mlx5e_rep_priv *rpriv = priv->ppriv;
        struct net_device *netdev = priv->netdev;
        struct mlx5_core_dev *mdev = priv->mdev;
        u16 max_mtu;
@@ -1104,12 +1115,15 @@ static void mlx5e_uplink_rep_enable(struct mlx5e_priv 
*priv)
        mlx5_notifier_register(mdev, &priv->events_nb);
        mlx5e_dcbnl_initialize(priv);
        mlx5e_dcbnl_init_app(priv);
+       mlx5e_rep_neigh_init(rpriv);
 }
 
 static void mlx5e_uplink_rep_disable(struct mlx5e_priv *priv)
 {
+       struct mlx5e_rep_priv *rpriv = priv->ppriv;
        struct mlx5_core_dev *mdev = priv->mdev;
 
+       mlx5e_rep_neigh_cleanup(rpriv);
        mlx5e_dcbnl_delete_app(priv);
        mlx5_notifier_unregister(mdev, &priv->events_nb);
        mlx5e_rep_tc_disable(priv);
@@ -1161,6 +1175,7 @@ static const struct mlx5e_profile mlx5e_rep_profile = {
        .init_tx                = mlx5e_init_rep_tx,
        .cleanup_tx             = mlx5e_cleanup_rep_tx,
        .enable                 = mlx5e_rep_enable,
+       .disable                = mlx5e_rep_disable,
        .update_rx              = mlx5e_update_rep_rx,
        .update_stats           = mlx5e_stats_update_ndo_stats,
        .rx_handlers            = &mlx5e_rx_handlers_rep,
@@ -1252,20 +1267,12 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct 
mlx5_eswitch_rep *rep)
                goto err_cleanup_profile;
        }
 
-       err = mlx5e_rep_neigh_init(rpriv);
-       if (err) {
-               netdev_warn(netdev,
-                           "Failed to initialized neighbours handling for 
vport %d\n",
-                           rep->vport);
-               goto err_detach_netdev;
-       }
-
        err = register_netdev(netdev);
        if (err) {
                netdev_warn(netdev,
                            "Failed to register representor netdev for vport 
%d\n",
                            rep->vport);
-               goto err_neigh_cleanup;
+               goto err_detach_netdev;
        }
 
        dl_port = mlx5_esw_offloads_devlink_port(dev->priv.eswitch, 
rpriv->rep->vport);
@@ -1273,9 +1280,6 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct 
mlx5_eswitch_rep *rep)
                devlink_port_type_eth_set(dl_port, netdev);
        return 0;
 
-err_neigh_cleanup:
-       mlx5e_rep_neigh_cleanup(rpriv);
-
 err_detach_netdev:
        mlx5e_detach_netdev(netdev_priv(netdev));
 
@@ -1306,7 +1310,6 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
        if (dl_port)
                devlink_port_type_clear(dl_port);
        unregister_netdev(netdev);
-       mlx5e_rep_neigh_cleanup(rpriv);
        mlx5e_detach_netdev(priv);
        priv->profile->cleanup(priv);
        if (rep->vport == MLX5_VPORT_UPLINK)
-- 
2.29.2

Reply via email to