mlxsw_afk
void mlxsw_afk_destroy(struct mlxsw_afk *mlxsw_afk)
WARN_ON(!list_empty(&mlxsw_afk->key_info_list));
kfree(mlxsw_afk);
mlxsw_afk_key_info_find(struct mlxsw_afk *mlxsw_afk,
list_for_each_entry(key_info, &mlxsw_afk->key_info_list, list) {
static void mlxsw_afk_picker_count_hits(struct mlxsw_afk *mlxsw_afk,
for (i = 0; i < mlxsw_afk->blocks_count; i++) {
const struct mlxsw_afk_block *block = &mlxsw_afk->blocks[i];
static void mlxsw_afk_picker_subtract_hits(struct mlxsw_afk *mlxsw_afk,
for (i = 0; i < mlxsw_afk->blocks_count; i++) {
static int mlxsw_afk_picker_most_hits_get(struct mlxsw_afk *mlxsw_afk,
for (i = 0; i < mlxsw_afk->blocks_count; i++) {
static int mlxsw_afk_picker_key_info_add(struct mlxsw_afk *mlxsw_afk,
if (key_info->blocks_count == mlxsw_afk->max_blocks)
&mlxsw_afk->blocks[block_index];
static int mlxsw_afk_keys_fill(struct mlxsw_afk *mlxsw_afk,
for_each_set_bit(i, chosen_blocks_bm, mlxsw_afk->blocks_count) {
if (!mlxsw_afk->blocks[i].high_entropy)
err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker, i,
for_each_set_bit(i, chosen_blocks_bm, mlxsw_afk->blocks_count) {
err = mlxsw_afk_picker_key_info_add(mlxsw_afk, picker, i,
static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk,
picker = kzalloc_objs(*picker, mlxsw_afk->blocks_count);
chosen_blocks_bm = bitmap_zalloc(mlxsw_afk->blocks_count, GFP_KERNEL);
mlxsw_afk_picker_count_hits(mlxsw_afk, picker, element);
block_index = mlxsw_afk_picker_most_hits_get(mlxsw_afk, picker);
mlxsw_afk_picker_subtract_hits(mlxsw_afk, picker, block_index);
err = mlxsw_afk_keys_fill(mlxsw_afk, chosen_blocks_bm, picker,
mlxsw_afk_key_info_create(struct mlxsw_afk *mlxsw_afk,
key_info = kzalloc_flex(*key_info, blocks, mlxsw_afk->max_blocks);
err = mlxsw_afk_picker(mlxsw_afk, key_info, elusage);
list_add(&key_info->list, &mlxsw_afk->key_info_list);
mlxsw_afk_key_info_get(struct mlxsw_afk *mlxsw_afk,
key_info = mlxsw_afk_key_info_find(mlxsw_afk, elusage);
return mlxsw_afk_key_info_create(mlxsw_afk, elusage);
void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
mlxsw_afk->ops->encode_block(key, i, block_key);
mlxsw_afk->ops->encode_block(mask, i, block_mask);
void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key,
mlxsw_afk->ops->clear_block(key, i);
static bool mlxsw_afk_blocks_check(struct mlxsw_afk *mlxsw_afk)
for (i = 0; i < mlxsw_afk->blocks_count; i++) {
const struct mlxsw_afk_block *block = &mlxsw_afk->blocks[i];
struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks,
struct mlxsw_afk *mlxsw_afk;
mlxsw_afk = kzalloc_obj(*mlxsw_afk);
if (!mlxsw_afk)
INIT_LIST_HEAD(&mlxsw_afk->key_info_list);
mlxsw_afk->max_blocks = max_blocks;
mlxsw_afk->ops = ops;
mlxsw_afk->blocks = ops->blocks;
mlxsw_afk->blocks_count = ops->blocks_count;
WARN_ON(!mlxsw_afk_blocks_check(mlxsw_afk));
return mlxsw_afk;
struct mlxsw_afk;
struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks,
void mlxsw_afk_destroy(struct mlxsw_afk *mlxsw_afk);
mlxsw_afk_key_info_get(struct mlxsw_afk *mlxsw_afk,
void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key,
struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);
struct mlxsw_afk *afk;
struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl)
struct mlxsw_afk *afk = mlxsw_sp_acl_afk(mlxsw_sp->acl);
struct mlxsw_afk *afk = mlxsw_sp_acl_afk(mlxsw_sp->acl);
struct mlxsw_afk *afk = mlxsw_sp_acl_afk(mlxsw_sp->acl);
struct mlxsw_afk *afk = mlxsw_sp_acl_afk(mlxsw_sp->acl);