diff options
author | Arkadi Sharshevsky <arkadis@mellanox.com> | 2018-01-15 02:59:09 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-16 14:15:35 -0500 |
commit | afadc26b3aa3e94d1cedf9472889b4c32aecc6ac (patch) | |
tree | 2025914441f1ff589aa94f92379b52441cdad5aa | |
parent | c0253a45fde85fa4457867c9021f0750b20117bf (diff) |
mlxsw: spectrum: Add support for getting kvdl occupancy
Add support for getting the kvdl occupancy through the resource interface.
Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c | 26 |
3 files changed, 36 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 53b16ddc6acc..87f8a74118d9 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
@@ -4055,12 +4055,21 @@ mlxsw_sp_resource_kvd_hash_double_size_validate(struct devlink *devlink, u64 siz | |||
4055 | return 0; | 4055 | return 0; |
4056 | } | 4056 | } |
4057 | 4057 | ||
4058 | static u64 mlxsw_sp_resource_kvd_linear_occ_get(struct devlink *devlink) | ||
4059 | { | ||
4060 | struct mlxsw_core *mlxsw_core = devlink_priv(devlink); | ||
4061 | struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core); | ||
4062 | |||
4063 | return mlxsw_sp_kvdl_occ_get(mlxsw_sp); | ||
4064 | } | ||
4065 | |||
4058 | static struct devlink_resource_ops mlxsw_sp_resource_kvd_ops = { | 4066 | static struct devlink_resource_ops mlxsw_sp_resource_kvd_ops = { |
4059 | .size_validate = mlxsw_sp_resource_kvd_size_validate, | 4067 | .size_validate = mlxsw_sp_resource_kvd_size_validate, |
4060 | }; | 4068 | }; |
4061 | 4069 | ||
4062 | static struct devlink_resource_ops mlxsw_sp_resource_kvd_linear_ops = { | 4070 | static struct devlink_resource_ops mlxsw_sp_resource_kvd_linear_ops = { |
4063 | .size_validate = mlxsw_sp_resource_kvd_linear_size_validate, | 4071 | .size_validate = mlxsw_sp_resource_kvd_linear_size_validate, |
4072 | .occ_get = mlxsw_sp_resource_kvd_linear_occ_get, | ||
4064 | }; | 4073 | }; |
4065 | 4074 | ||
4066 | static struct devlink_resource_ops mlxsw_sp_resource_kvd_hash_single_ops = { | 4075 | static struct devlink_resource_ops mlxsw_sp_resource_kvd_hash_single_ops = { |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h index 435e0f2225f6..237cad373dbe 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h | |||
@@ -448,6 +448,7 @@ void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index); | |||
448 | int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp, | 448 | int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp, |
449 | unsigned int entry_count, | 449 | unsigned int entry_count, |
450 | unsigned int *p_alloc_size); | 450 | unsigned int *p_alloc_size); |
451 | u64 mlxsw_sp_kvdl_occ_get(const struct mlxsw_sp *mlxsw_sp); | ||
451 | 452 | ||
452 | struct mlxsw_sp_acl_rule_info { | 453 | struct mlxsw_sp_acl_rule_info { |
453 | unsigned int priority; | 454 | unsigned int priority; |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c index 310c38247b5c..cfacc176a1bd 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c | |||
@@ -286,6 +286,32 @@ static void mlxsw_sp_kvdl_parts_fini(struct mlxsw_sp *mlxsw_sp) | |||
286 | mlxsw_sp_kvdl_part_fini(mlxsw_sp, i); | 286 | mlxsw_sp_kvdl_part_fini(mlxsw_sp, i); |
287 | } | 287 | } |
288 | 288 | ||
289 | u64 mlxsw_sp_kvdl_part_occ(struct mlxsw_sp_kvdl_part *part) | ||
290 | { | ||
291 | unsigned int nr_entries; | ||
292 | int bit = -1; | ||
293 | u64 occ = 0; | ||
294 | |||
295 | nr_entries = (part->info->end_index - | ||
296 | part->info->start_index + 1) / | ||
297 | part->info->alloc_size; | ||
298 | while ((bit = find_next_bit(part->usage, nr_entries, bit + 1)) | ||
299 | < nr_entries) | ||
300 | occ += part->info->alloc_size; | ||
301 | return occ; | ||
302 | } | ||
303 | |||
304 | u64 mlxsw_sp_kvdl_occ_get(const struct mlxsw_sp *mlxsw_sp) | ||
305 | { | ||
306 | struct mlxsw_sp_kvdl_part *part; | ||
307 | u64 occ = 0; | ||
308 | |||
309 | list_for_each_entry(part, &mlxsw_sp->kvdl->parts_list, list) | ||
310 | occ += mlxsw_sp_kvdl_part_occ(part); | ||
311 | |||
312 | return occ; | ||
313 | } | ||
314 | |||
289 | int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp) | 315 | int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp) |
290 | { | 316 | { |
291 | struct mlxsw_sp_kvdl *kvdl; | 317 | struct mlxsw_sp_kvdl *kvdl; |