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

mlxsw: core_acl_flex_keys: Save chosen elements in all blocks per search

Currently, mlxsw_afk_picker() chooses which blocks will be used for a
given list of elements, and fills the blocks during the searching - when a
key block is found with most hits, it adds it and removes the elements from
the count of hits. This should be changed as we want to be able to choose
which blocks will be placed in blocks 0 to 5.

To separate between choosing blocks and filling blocks, several pre-changes
are required. Currently, the indication of whether all elements were
found in the chosen blocks is by the structure 'key_info->elusage'. This
structure is updated when block is filled as part of
mlxsw_afk_picker_key_info_add(). A following patch will call this
function only after choosing all the blocks. Add a bitmap called
'elusage_chosen' to store which elements were chosen in the chosen blocks.
Change the condition in the loop to check elements that were chosen, not
elements that were already filled in the blocks.
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 545535fd
...@@ -225,6 +225,7 @@ static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk, ...@@ -225,6 +225,7 @@ 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)
{ {
DECLARE_BITMAP(elusage_chosen, MLXSW_AFK_ELEMENT_MAX) = {0};
struct mlxsw_afk_picker *picker; struct mlxsw_afk_picker *picker;
unsigned long *chosen_blocks_bm; unsigned long *chosen_blocks_bm;
enum mlxsw_afk_element element; enum mlxsw_afk_element element;
...@@ -270,12 +271,18 @@ static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk, ...@@ -270,12 +271,18 @@ static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk,
bitmap_copy(picker[block_index].chosen_element, bitmap_copy(picker[block_index].chosen_element,
picker[block_index].element, MLXSW_AFK_ELEMENT_MAX); picker[block_index].element, MLXSW_AFK_ELEMENT_MAX);
bitmap_or(elusage_chosen, elusage_chosen,
picker[block_index].chosen_element,
MLXSW_AFK_ELEMENT_MAX);
err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker, err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker,
block_index, key_info); block_index, key_info);
if (err) if (err)
goto out; goto out;
mlxsw_afk_picker_subtract_hits(mlxsw_afk, picker, block_index); mlxsw_afk_picker_subtract_hits(mlxsw_afk, picker, block_index);
} while (!mlxsw_afk_key_info_elements_eq(key_info, elusage));
} while (!bitmap_equal(elusage_chosen, elusage->usage,
MLXSW_AFK_ELEMENT_MAX));
err = 0; err = 0;
out: out:
......
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