Commit c01e2493 authored by Amit Cohen's avatar Amit Cohen Committed by David S. Miller

mlxsw: core_acl_flex_keys: Fill blocks with high entropy first

The previous patches prepared the code to allow separating between
choosing blocks and filling blocks.

Do not add blocks as part of the loop that chooses them. When all the
required blocks are set in the bitmap 'chosen_blocks_bm', start filling
blocks. Iterate over the bitmap twice - first add only blocks that are
marked with 'high_entropy' flag. Then, fill the rest of the blocks.

The idea is to place key blocks with high entropy in blocks 0 to 5. See
more details in previous patches.
Signed-off-by: default avatarAmit Cohen <amcohen@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 900f4285
...@@ -221,6 +221,36 @@ static int mlxsw_afk_picker_key_info_add(struct mlxsw_afk *mlxsw_afk, ...@@ -221,6 +221,36 @@ static int mlxsw_afk_picker_key_info_add(struct mlxsw_afk *mlxsw_afk,
return 0; return 0;
} }
static int mlxsw_afk_keys_fill(struct mlxsw_afk *mlxsw_afk,
unsigned long *chosen_blocks_bm,
struct mlxsw_afk_picker *picker,
struct mlxsw_afk_key_info *key_info)
{
int i, err;
/* First fill only key blocks with high_entropy. */
for_each_set_bit(i, chosen_blocks_bm, mlxsw_afk->blocks_count) {
if (!mlxsw_afk->blocks[i].high_entropy)
continue;
err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker, i,
key_info);
if (err)
return err;
__clear_bit(i, chosen_blocks_bm);
}
/* Fill the rest of key blocks. */
for_each_set_bit(i, chosen_blocks_bm, mlxsw_afk->blocks_count) {
err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker, i,
key_info);
if (err)
return err;
}
return 0;
}
static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk, static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_key_info *key_info, struct mlxsw_afk_key_info *key_info,
struct mlxsw_afk_element_usage *elusage) struct mlxsw_afk_element_usage *elusage)
...@@ -275,16 +305,13 @@ static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk, ...@@ -275,16 +305,13 @@ static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk,
picker[block_index].chosen_element, picker[block_index].chosen_element,
MLXSW_AFK_ELEMENT_MAX); MLXSW_AFK_ELEMENT_MAX);
err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker,
block_index, key_info);
if (err)
goto out;
mlxsw_afk_picker_subtract_hits(mlxsw_afk, picker, block_index); mlxsw_afk_picker_subtract_hits(mlxsw_afk, picker, block_index);
} while (!bitmap_equal(elusage_chosen, elusage->usage, } while (!bitmap_equal(elusage_chosen, elusage->usage,
MLXSW_AFK_ELEMENT_MAX)); MLXSW_AFK_ELEMENT_MAX));
err = 0; err = mlxsw_afk_keys_fill(mlxsw_afk, chosen_blocks_bm, picker,
key_info);
out: out:
bitmap_free(chosen_blocks_bm); bitmap_free(chosen_blocks_bm);
err_bitmap_alloc: err_bitmap_alloc:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment