From: Nir Dotan <n...@mellanox.com>

The presence of an allocated RIF in mlxsw_sp->router->rifs[rif_index] marks
that rif_index as taken.
Set the marking of a taken RIF to happen before calling ops->create in
order to allow creation of a GRE underlay RIF, which may be allocated and
created as part of an overlay RIF creation.

Signed-off-by: Nir Dotan <n...@mellanox.com>
Reviewed-by: Petr Machata <pe...@mellanox.com>
Signed-off-by: Ido Schimmel <ido...@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index c55bd5af0341..1cac38365503 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -6303,6 +6303,7 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
                goto err_rif_alloc;
        }
        dev_hold(rif->dev);
+       mlxsw_sp->router->rifs[rif_index] = rif;
        rif->mlxsw_sp = mlxsw_sp;
        rif->ops = ops;
 
@@ -6329,7 +6330,6 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
        }
 
        mlxsw_sp_rif_counters_alloc(rif);
-       mlxsw_sp->router->rifs[rif_index] = rif;
 
        return rif;
 
@@ -6341,6 +6341,7 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
        if (fid)
                mlxsw_sp_fid_put(fid);
 err_fid_get:
+       mlxsw_sp->router->rifs[rif_index] = NULL;
        dev_put(rif->dev);
        kfree(rif);
 err_rif_alloc:
@@ -6361,7 +6362,6 @@ static void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)
        mlxsw_sp_router_rif_gone_sync(mlxsw_sp, rif);
        vr = &mlxsw_sp->router->vrs[rif->vr_id];
 
-       mlxsw_sp->router->rifs[rif->rif_index] = NULL;
        mlxsw_sp_rif_counters_free(rif);
        for (i = 0; i < MLXSW_SP_L3_PROTO_MAX; i++)
                mlxsw_sp_mr_rif_del(vr->mr_table[i], rif);
@@ -6369,6 +6369,7 @@ static void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)
        if (fid)
                /* Loopback RIFs are not associated with a FID. */
                mlxsw_sp_fid_put(fid);
+       mlxsw_sp->router->rifs[rif->rif_index] = NULL;
        dev_put(rif->dev);
        kfree(rif);
        vr->rif_count--;
-- 
2.20.1

Reply via email to