Skip to content

Commit 98bbf70

Browse files
jpirkodavem330
authored andcommitted
mlxsw: spectrum: add "acl_region_rehash_interval" devlink param
Expose new driver-specific "acl_region_rehash_interval" devlink param which would allow user to alter default ACL region rehash interval. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: Ido Schimmel <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e5e7962 commit 98bbf70

File tree

7 files changed

+139
-2
lines changed

7 files changed

+139
-2
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,10 @@
11
fw_load_policy [DEVICE, GENERIC]
22
Configuration mode: driverinit
3+
4+
acl_region_rehash_interval [DEVICE, DRIVER-SPECIFIC]
5+
Sets an interval for periodic ACL region rehashes.
6+
The value is in milliseconds, minimal value is "3000".
7+
Value "0" disables the periodic work.
8+
The first rehash will be run right after value is set.
9+
Type: u32
10+
Configuration mode: runtime

drivers/net/ethernet/mellanox/mlxsw/core.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,4 +394,9 @@ static inline void mlxsw_thermal_fini(struct mlxsw_thermal *thermal)
394394

395395
#endif
396396

397+
enum mlxsw_devlink_param_id {
398+
MLXSW_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
399+
MLXSW_DEVLINK_PARAM_ID_ACL_REGION_REHASH_INTERVAL,
400+
};
401+
397402
#endif

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4413,6 +4413,71 @@ static void mlxsw_sp_params_unregister(struct mlxsw_core *mlxsw_core)
44134413
ARRAY_SIZE(mlxsw_sp_devlink_params));
44144414
}
44154415

4416+
static int
4417+
mlxsw_sp_params_acl_region_rehash_intrvl_get(struct devlink *devlink, u32 id,
4418+
struct devlink_param_gset_ctx *ctx)
4419+
{
4420+
struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
4421+
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
4422+
4423+
ctx->val.vu32 = mlxsw_sp_acl_region_rehash_intrvl_get(mlxsw_sp);
4424+
return 0;
4425+
}
4426+
4427+
static int
4428+
mlxsw_sp_params_acl_region_rehash_intrvl_set(struct devlink *devlink, u32 id,
4429+
struct devlink_param_gset_ctx *ctx)
4430+
{
4431+
struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
4432+
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
4433+
4434+
return mlxsw_sp_acl_region_rehash_intrvl_set(mlxsw_sp, ctx->val.vu32);
4435+
}
4436+
4437+
static const struct devlink_param mlxsw_sp2_devlink_params[] = {
4438+
DEVLINK_PARAM_DRIVER(MLXSW_DEVLINK_PARAM_ID_ACL_REGION_REHASH_INTERVAL,
4439+
"acl_region_rehash_interval",
4440+
DEVLINK_PARAM_TYPE_U32,
4441+
BIT(DEVLINK_PARAM_CMODE_RUNTIME),
4442+
mlxsw_sp_params_acl_region_rehash_intrvl_get,
4443+
mlxsw_sp_params_acl_region_rehash_intrvl_set,
4444+
NULL),
4445+
};
4446+
4447+
static int mlxsw_sp2_params_register(struct mlxsw_core *mlxsw_core)
4448+
{
4449+
struct devlink *devlink = priv_to_devlink(mlxsw_core);
4450+
union devlink_param_value value;
4451+
int err;
4452+
4453+
err = mlxsw_sp_params_register(mlxsw_core);
4454+
if (err)
4455+
return err;
4456+
4457+
err = devlink_params_register(devlink, mlxsw_sp2_devlink_params,
4458+
ARRAY_SIZE(mlxsw_sp2_devlink_params));
4459+
if (err)
4460+
goto err_devlink_params_register;
4461+
4462+
value.vu32 = 0;
4463+
devlink_param_driverinit_value_set(devlink,
4464+
MLXSW_DEVLINK_PARAM_ID_ACL_REGION_REHASH_INTERVAL,
4465+
value);
4466+
return 0;
4467+
4468+
err_devlink_params_register:
4469+
mlxsw_sp_params_unregister(mlxsw_core);
4470+
return err;
4471+
}
4472+
4473+
static void mlxsw_sp2_params_unregister(struct mlxsw_core *mlxsw_core)
4474+
{
4475+
devlink_params_unregister(priv_to_devlink(mlxsw_core),
4476+
mlxsw_sp2_devlink_params,
4477+
ARRAY_SIZE(mlxsw_sp2_devlink_params));
4478+
mlxsw_sp_params_unregister(mlxsw_core);
4479+
}
4480+
44164481
static struct mlxsw_driver mlxsw_sp1_driver = {
44174482
.kind = mlxsw_sp1_driver_name,
44184483
.priv_size = sizeof(struct mlxsw_sp),
@@ -4461,8 +4526,8 @@ static struct mlxsw_driver mlxsw_sp2_driver = {
44614526
.sb_occ_tc_port_bind_get = mlxsw_sp_sb_occ_tc_port_bind_get,
44624527
.txhdr_construct = mlxsw_sp_txhdr_construct,
44634528
.resources_register = mlxsw_sp2_resources_register,
4464-
.params_register = mlxsw_sp_params_register,
4465-
.params_unregister = mlxsw_sp_params_unregister,
4529+
.params_register = mlxsw_sp2_params_register,
4530+
.params_unregister = mlxsw_sp2_params_unregister,
44664531
.txhdr_len = MLXSW_TXHDR_LEN,
44674532
.profile = &mlxsw_sp2_config_profile,
44684533
.res_query_enabled = true,

drivers/net/ethernet/mellanox/mlxsw/spectrum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,8 @@ struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);
690690

691691
int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);
692692
void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
693+
u32 mlxsw_sp_acl_region_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp);
694+
int mlxsw_sp_acl_region_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp, u32 val);
693695

694696
/* spectrum_acl_tcam.c */
695697
struct mlxsw_sp_acl_tcam;

drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,3 +912,19 @@ void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp)
912912
mlxsw_afk_destroy(acl->afk);
913913
kfree(acl);
914914
}
915+
916+
u32 mlxsw_sp_acl_region_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp)
917+
{
918+
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
919+
920+
return mlxsw_sp_acl_tcam_vregion_rehash_intrvl_get(mlxsw_sp,
921+
&acl->tcam);
922+
}
923+
924+
int mlxsw_sp_acl_region_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp, u32 val)
925+
{
926+
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
927+
928+
return mlxsw_sp_acl_tcam_vregion_rehash_intrvl_set(mlxsw_sp,
929+
&acl->tcam, val);
930+
}

drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ size_t mlxsw_sp_acl_tcam_priv_size(struct mlxsw_sp *mlxsw_sp)
2424
}
2525

2626
#define MLXSW_SP_ACL_TCAM_VREGION_REHASH_INTRVL_DFLT 5000 /* ms */
27+
#define MLXSW_SP_ACL_TCAM_VREGION_REHASH_INTRVL_MIN 3000 /* ms */
2728

2829
int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp,
2930
struct mlxsw_sp_acl_tcam *tcam)
@@ -725,6 +726,41 @@ mlxsw_sp_acl_tcam_vregion_destroy(struct mlxsw_sp *mlxsw_sp,
725726
kfree(vregion);
726727
}
727728

729+
u32 mlxsw_sp_acl_tcam_vregion_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp,
730+
struct mlxsw_sp_acl_tcam *tcam)
731+
{
732+
const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops;
733+
u32 vregion_rehash_intrvl;
734+
735+
if (WARN_ON(!ops->region_rehash_hints_get))
736+
return 0;
737+
vregion_rehash_intrvl = tcam->vregion_rehash_intrvl;
738+
return vregion_rehash_intrvl;
739+
}
740+
741+
int mlxsw_sp_acl_tcam_vregion_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp,
742+
struct mlxsw_sp_acl_tcam *tcam,
743+
u32 val)
744+
{
745+
const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops;
746+
struct mlxsw_sp_acl_tcam_vregion *vregion;
747+
748+
if (val < MLXSW_SP_ACL_TCAM_VREGION_REHASH_INTRVL_MIN && val)
749+
return -EINVAL;
750+
if (WARN_ON(!ops->region_rehash_hints_get))
751+
return -EOPNOTSUPP;
752+
tcam->vregion_rehash_intrvl = val;
753+
rtnl_lock();
754+
list_for_each_entry(vregion, &tcam->vregion_list, tlist) {
755+
if (val)
756+
mlxsw_core_schedule_dw(&vregion->rehash_dw, 0);
757+
else
758+
cancel_delayed_work_sync(&vregion->rehash_dw);
759+
}
760+
rtnl_unlock();
761+
return 0;
762+
}
763+
728764
static int
729765
mlxsw_sp_acl_tcam_vchunk_assoc(struct mlxsw_sp *mlxsw_sp,
730766
struct mlxsw_sp_acl_tcam_group *group,

drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp,
2828
struct mlxsw_sp_acl_tcam *tcam);
2929
void mlxsw_sp_acl_tcam_fini(struct mlxsw_sp *mlxsw_sp,
3030
struct mlxsw_sp_acl_tcam *tcam);
31+
u32 mlxsw_sp_acl_tcam_vregion_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp,
32+
struct mlxsw_sp_acl_tcam *tcam);
33+
int mlxsw_sp_acl_tcam_vregion_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp,
34+
struct mlxsw_sp_acl_tcam *tcam,
35+
u32 val);
3136
int mlxsw_sp_acl_tcam_priority_get(struct mlxsw_sp *mlxsw_sp,
3237
struct mlxsw_sp_acl_rule_info *rulei,
3338
u32 *priority, bool fillup_priority);

0 commit comments

Comments
 (0)