diff options
author | Jiri Pirko <jiri@mellanox.com> | 2019-02-28 09:59:19 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-03-02 08:44:10 +0300 |
commit | 1667f7667d85e184bc731884bf9588bed89cca80 (patch) | |
tree | 84c7fd8d318a5f6dcaa02ddcfd53a878d0808a27 /drivers/net | |
parent | 559c27681058783c4c3d50ddb5ed8a64792e78ec (diff) | |
download | linux-1667f7667d85e184bc731884bf9588bed89cca80.tar.xz |
mlxsw: spectrum_acl: Push rehash start/end code into separate functions
In preparations for interrupt/continue of rehash work, put the code at
the beginning/end of the rehash function into separate functions.
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c index ae1101c17f2c..fa204003bc84 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c @@ -1334,26 +1334,50 @@ out: } static int -mlxsw_sp_acl_tcam_vregion_rehash(struct mlxsw_sp *mlxsw_sp, - struct mlxsw_sp_acl_tcam_vregion *vregion) +mlxsw_sp_acl_tcam_vregion_rehash_start(struct mlxsw_sp *mlxsw_sp, + struct mlxsw_sp_acl_tcam_vregion *vregion, + struct mlxsw_sp_acl_tcam_rehash_ctx *ctx) { const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; - struct mlxsw_sp_acl_tcam_rehash_ctx *ctx = &vregion->rehash.ctx; void *hints_priv; - int err; trace_mlxsw_sp_acl_tcam_vregion_rehash(mlxsw_sp, vregion); if (vregion->failed_rollback) return -EBUSY; hints_priv = ops->region_rehash_hints_get(vregion->region->priv); - if (IS_ERR(hints_priv)) { - err = PTR_ERR(hints_priv); + if (IS_ERR(hints_priv)) + return PTR_ERR(hints_priv); + + ctx->hints_priv = hints_priv; + + return 0; +} + +static void +mlxsw_sp_acl_tcam_vregion_rehash_end(struct mlxsw_sp *mlxsw_sp, + struct mlxsw_sp_acl_tcam_vregion *vregion, + struct mlxsw_sp_acl_tcam_rehash_ctx *ctx) +{ + const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; + + ops->region_rehash_hints_put(ctx->hints_priv); + ctx->hints_priv = NULL; +} + +static int +mlxsw_sp_acl_tcam_vregion_rehash(struct mlxsw_sp *mlxsw_sp, + struct mlxsw_sp_acl_tcam_vregion *vregion) +{ + struct mlxsw_sp_acl_tcam_rehash_ctx *ctx = &vregion->rehash.ctx; + int err; + + err = mlxsw_sp_acl_tcam_vregion_rehash_start(mlxsw_sp, vregion, ctx); + if (err) { if (err != -EAGAIN) dev_err(mlxsw_sp->bus_info->dev, "Failed get rehash hints\n"); return err; } - ctx->hints_priv = hints_priv; err = mlxsw_sp_acl_tcam_vregion_migrate(mlxsw_sp, vregion, ctx); if (err) { @@ -1365,8 +1389,7 @@ mlxsw_sp_acl_tcam_vregion_rehash(struct mlxsw_sp *mlxsw_sp, } } - ops->region_rehash_hints_put(ctx->hints_priv); - ctx->hints_priv = NULL; + mlxsw_sp_acl_tcam_vregion_rehash_end(mlxsw_sp, vregion, ctx); return err; } |