mlxsw: spectrum: Add ability to query KVDL allocation size
authorIdo Schimmel <idosch@mellanox.com>
Sun, 22 Oct 2017 21:11:45 +0000 (23:11 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 23 Oct 2017 04:23:06 +0000 (05:23 +0100)
The current KVDL allocation API allows the user to specify the requested
number of entries, but the user has no way of knowing how many entries
were actually allocated.

This works because existing users (e.g., router) request the exact
number they end up using. With the introduction of large adjacency
groups, this will change, as the router will have the ability to choose
from several allocation sizes, where larger allocations provide higher
accuracy with respect to requested weights and better resilience against
nexthop failures.

One option is to have the router try several allocations of descending
size until one succeeds, but a better way is to simply allow it to query
the actual allocation size and then size its request accordingly.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c

index 035c753585a02d8b32baaced1a76b0f117b73105..78ff20d86db15af343650fcde4660bf84f408f47 100644 (file)
@@ -415,6 +415,9 @@ void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp);
 int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp, unsigned int entry_count,
                        u32 *p_entry_index);
 void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index);
+int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp,
+                                  unsigned int entry_count,
+                                  unsigned int *p_alloc_size);
 
 struct mlxsw_sp_acl_rule_info {
        unsigned int priority;
index 5125375614838e941357ce356daaea543f5def0f..266b3af6513c09ed1948b72504e6c67d3a1fa623 100644 (file)
@@ -164,6 +164,21 @@ void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index)
        mlxsw_sp_kvdl_part_free(part, entry_index);
 }
 
+int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp,
+                                  unsigned int entry_count,
+                                  unsigned int *p_alloc_size)
+{
+       struct mlxsw_sp_kvdl_part *part;
+
+       part = mlxsw_sp_kvdl_alloc_size_part(mlxsw_sp->kvdl, entry_count);
+       if (IS_ERR(part))
+               return PTR_ERR(part);
+
+       *p_alloc_size = part->info->alloc_size;
+
+       return 0;
+}
+
 static const struct mlxsw_sp_kvdl_part_info kvdl_parts_info[] = {
        {
                .part_index     = 0,