mlxsw: spectrum: acl: Don't encode the key again in mlxsw_sp_acl_atcam_12kb_lkey_id_get()
authorJiri Pirko <jiri@mellanox.com>
Wed, 14 Nov 2018 08:22:32 +0000 (08:22 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 15 Nov 2018 22:43:43 +0000 (14:43 -0800)
No need to do key encoding again in
mlxsw_sp_acl_atcam_12kb_lkey_id_get(). Instead of that, introduce
a new helper that would just clear unused blocks.

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

index 98c00ea..0900ccf 100644 (file)
@@ -458,3 +458,13 @@ void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
        }
 }
 EXPORT_SYMBOL(mlxsw_afk_encode);
+
+void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key,
+                    int block_start, int block_end)
+{
+       int i;
+
+       for (i = block_start; i <= block_end; i++)
+               mlxsw_afk->ops->clear_block(key, i);
+}
+EXPORT_SYMBOL(mlxsw_afk_clear);
index 6a44501..a5303c0 100644 (file)
@@ -189,6 +189,7 @@ struct mlxsw_afk_ops {
        const struct mlxsw_afk_block *blocks;
        unsigned int blocks_count;
        void (*encode_block)(char *output, int block_index, char *block);
+       void (*clear_block)(char *output, int block_index);
 };
 
 struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks,
@@ -229,5 +230,7 @@ void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
                      struct mlxsw_afk_key_info *key_info,
                      struct mlxsw_afk_element_values *values,
                      char *key, char *mask, int block_start, int block_end);
+void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key,
+                    int block_start, int block_end);
 
 #endif
index 5a0b887..ffdf464 100644 (file)
@@ -14,8 +14,8 @@
 #include "spectrum_acl_tcam.h"
 #include "core_acl_flex_keys.h"
 
-#define MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_START 6
-#define MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_END   11
+#define MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_CLEAR_START   0
+#define MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_CLEAR_END     5
 
 struct mlxsw_sp_acl_atcam_lkey_id_ht_key {
        char enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* MSB blocks */
@@ -34,7 +34,7 @@ struct mlxsw_sp_acl_atcam_region_ops {
        void (*fini)(struct mlxsw_sp_acl_atcam_region *aregion);
        struct mlxsw_sp_acl_atcam_lkey_id *
                (*lkey_id_get)(struct mlxsw_sp_acl_atcam_region *aregion,
-                              struct mlxsw_sp_acl_rule_info *rulei, u8 erp_id);
+                              char *enc_key, u8 erp_id);
        void (*lkey_id_put)(struct mlxsw_sp_acl_atcam_region *aregion,
                            struct mlxsw_sp_acl_atcam_lkey_id *lkey_id);
 };
@@ -90,8 +90,7 @@ mlxsw_sp_acl_atcam_region_generic_fini(struct mlxsw_sp_acl_atcam_region *aregion
 
 static struct mlxsw_sp_acl_atcam_lkey_id *
 mlxsw_sp_acl_atcam_generic_lkey_id_get(struct mlxsw_sp_acl_atcam_region *aregion,
-                                      struct mlxsw_sp_acl_rule_info *rulei,
-                                      u8 erp_id)
+                                      char *enc_key, u8 erp_id)
 {
        struct mlxsw_sp_acl_atcam_region_generic *region_generic;
 
@@ -220,8 +219,7 @@ mlxsw_sp_acl_atcam_lkey_id_destroy(struct mlxsw_sp_acl_atcam_region *aregion,
 
 static struct mlxsw_sp_acl_atcam_lkey_id *
 mlxsw_sp_acl_atcam_12kb_lkey_id_get(struct mlxsw_sp_acl_atcam_region *aregion,
-                                   struct mlxsw_sp_acl_rule_info *rulei,
-                                   u8 erp_id)
+                                   char *enc_key, u8 erp_id)
 {
        struct mlxsw_sp_acl_atcam_region_12kb *region_12kb = aregion->priv;
        struct mlxsw_sp_acl_tcam_region *region = aregion->region;
@@ -230,9 +228,10 @@ mlxsw_sp_acl_atcam_12kb_lkey_id_get(struct mlxsw_sp_acl_atcam_region *aregion,
        struct mlxsw_afk *afk = mlxsw_sp_acl_afk(mlxsw_sp->acl);
        struct mlxsw_sp_acl_atcam_lkey_id *lkey_id;
 
-       mlxsw_afk_encode(afk, region->key_info, &rulei->values, ht_key.enc_key,
-                        NULL, MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_START,
-                        MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_END);
+       memcpy(ht_key.enc_key, enc_key, sizeof(ht_key.enc_key));
+       mlxsw_afk_clear(afk, ht_key.enc_key,
+                       MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_CLEAR_START,
+                       MLXSW_SP_ACL_ATCAM_LKEY_ID_BLOCK_CLEAR_END);
        ht_key.erp_id = erp_id;
        lkey_id = rhashtable_lookup_fast(&region_12kb->lkey_ht, &ht_key,
                                         mlxsw_sp_acl_atcam_lkey_id_ht_params);
@@ -389,7 +388,8 @@ mlxsw_sp_acl_atcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp,
        if (err)
                return err;
 
-       lkey_id = aregion->ops->lkey_id_get(aregion, rulei, erp_id);
+       lkey_id = aregion->ops->lkey_id_get(aregion, aentry->ht_key.enc_key,
+                                           erp_id);
        if (IS_ERR(lkey_id))
                return PTR_ERR(lkey_id);
        aentry->lkey_id = lkey_id;
index 9b93c6c..2e1e8c4 100644 (file)
@@ -107,10 +107,19 @@ static void mlxsw_sp1_afk_encode_block(char *output, int block_index,
        memcpy(output_indexed, block, MLXSW_SP1_AFK_KEY_BLOCK_SIZE);
 }
 
+static void mlxsw_sp1_afk_clear_block(char *output, int block_index)
+{
+       unsigned int offset = block_index * MLXSW_SP1_AFK_KEY_BLOCK_SIZE;
+       char *output_indexed = output + offset;
+
+       memset(output_indexed, 0, MLXSW_SP1_AFK_KEY_BLOCK_SIZE);
+}
+
 const struct mlxsw_afk_ops mlxsw_sp1_afk_ops = {
        .blocks         = mlxsw_sp1_afk_blocks,
        .blocks_count   = ARRAY_SIZE(mlxsw_sp1_afk_blocks),
        .encode_block   = mlxsw_sp1_afk_encode_block,
+       .clear_block    = mlxsw_sp1_afk_clear_block,
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_0[] = {
@@ -263,10 +272,9 @@ static const struct mlxsw_sp2_afk_block_layout mlxsw_sp2_afk_blocks_layout[] = {
        MLXSW_SP2_AFK_BLOCK_LAYOUT(block11, 0x00, 12),
 };
 
-static void mlxsw_sp2_afk_encode_block(char *output, int block_index,
-                                      char *block)
+static void __mlxsw_sp2_afk_block_value_set(char *output, int block_index,
+                                           u64 block_value)
 {
-       u64 block_value = mlxsw_sp2_afk_block_value_get(block);
        const struct mlxsw_sp2_afk_block_layout *block_layout;
 
        if (WARN_ON(block_index < 0 ||
@@ -278,8 +286,22 @@ static void mlxsw_sp2_afk_encode_block(char *output, int block_index,
                           &block_layout->item, 0, block_value);
 }
 
+static void mlxsw_sp2_afk_encode_block(char *output, int block_index,
+                                      char *block)
+{
+       u64 block_value = mlxsw_sp2_afk_block_value_get(block);
+
+       __mlxsw_sp2_afk_block_value_set(output, block_index, block_value);
+}
+
+static void mlxsw_sp2_afk_clear_block(char *output, int block_index)
+{
+       __mlxsw_sp2_afk_block_value_set(output, block_index, 0);
+}
+
 const struct mlxsw_afk_ops mlxsw_sp2_afk_ops = {
        .blocks         = mlxsw_sp2_afk_blocks,
        .blocks_count   = ARRAY_SIZE(mlxsw_sp2_afk_blocks),
        .encode_block   = mlxsw_sp2_afk_encode_block,
+       .clear_block    = mlxsw_sp2_afk_clear_block,
 };