get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/115299/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 115299,
    "url": "https://patches.dpdk.org/api/patches/115299/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20220819195225.1483020-4-cristian.dumitrescu@intel.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20220819195225.1483020-4-cristian.dumitrescu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220819195225.1483020-4-cristian.dumitrescu@intel.com",
    "date": "2022-08-19T19:52:22",
    "name": "[V2,3/6] table: configure the hash function for regular tables",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "247201699d5807166656efb144203afebb348b20",
    "submitter": {
        "id": 19,
        "url": "https://patches.dpdk.org/api/people/19/?format=api",
        "name": "Cristian Dumitrescu",
        "email": "cristian.dumitrescu@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20220819195225.1483020-4-cristian.dumitrescu@intel.com/mbox/",
    "series": [
        {
            "id": 24366,
            "url": "https://patches.dpdk.org/api/series/24366/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=24366",
            "date": "2022-08-19T19:52:19",
            "name": "pipeline: make the hash function configurable per table",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/24366/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/115299/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/115299/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 75D71A034C;\n\tFri, 19 Aug 2022 21:52:47 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A50D941614;\n\tFri, 19 Aug 2022 21:52:34 +0200 (CEST)",
            "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n by mails.dpdk.org (Postfix) with ESMTP id 9C5D240DDC\n for <dev@dpdk.org>; Fri, 19 Aug 2022 21:52:30 +0200 (CEST)",
            "from orsmga007.jf.intel.com ([10.7.209.58])\n by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 19 Aug 2022 12:52:30 -0700",
            "from silpixa00400573.ir.intel.com (HELO\n silpixa00400573.ger.corp.intel.com.) ([10.237.223.157])\n by orsmga007.jf.intel.com with ESMTP; 19 Aug 2022 12:52:29 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1660938750; x=1692474750;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=7N5N3Zv8OT4vIy5WpzqsB5ZRgmJc0eWDEKWNGLmloK4=;\n b=l7zqvliOUsBEMFfOgGNusnL0gqjxl7CAgIkZPwqTb+pVNvsz3Lx9rZSO\n P82yZBXcB2pXvZ+JIqcAadJN5sC2Egll2MhDCCwIOfpCPsxeg/lAzTXOz\n 6aNQx9pCbpLy2WSNXbGNnkOVHRiE/UMOuFFDGw/V6fhIKNUKwLL0RYu1d\n iTu0EOfbj2E3LZLUYzsjkstG45W7lh4ELJDTnWEpcue5Cjnwf1VkmLzKb\n LlkGdAyDHjVBq3bnmH9zQwsOp7IIYpnwzjsMGy66uwTki/5yfFugRU/4D\n r+lAq5IT2au6YxpM2H6SZFJMmzjJUap83NNm1IbXPIY6XzPBqmtTDZSui A==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6500,9779,10444\"; a=\"280047522\"",
            "E=Sophos;i=\"5.93,249,1654585200\"; d=\"scan'208\";a=\"280047522\"",
            "E=Sophos;i=\"5.93,248,1654585200\"; d=\"scan'208\";a=\"604695951\""
        ],
        "X-ExtLoop1": "1",
        "From": "Cristian Dumitrescu <cristian.dumitrescu@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "\"Kamalakannan R .\" <kamalakannan.r@intel.com>",
        "Subject": "[PATCH V2 3/6] table: configure the hash function for regular tables",
        "Date": "Fri, 19 Aug 2022 19:52:22 +0000",
        "Message-Id": "<20220819195225.1483020-4-cristian.dumitrescu@intel.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20220819195225.1483020-1-cristian.dumitrescu@intel.com>",
        "References": "<20220818114449.1408226-1-cristian.dumitrescu@intel.com>\n <20220819195225.1483020-1-cristian.dumitrescu@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Make the hash function configurable. The internal hash function that\nwas not configurable, mask-based and limited to 64 bytes is removed.\n\nSigned-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>\nSigned-off-by: Kamalakannan R. <kamalakannan.r@intel.com>\n---\n lib/table/rte_swx_table.h    |   8 ++\n lib/table/rte_swx_table_em.c | 266 ++++++-----------------------------\n 2 files changed, 49 insertions(+), 225 deletions(-)",
    "diff": "diff --git a/lib/table/rte_swx_table.h b/lib/table/rte_swx_table.h\nindex c1383c2e57..4b8dc06798 100644\n--- a/lib/table/rte_swx_table.h\n+++ b/lib/table/rte_swx_table.h\n@@ -19,6 +19,8 @@ extern \"C\" {\n \n #include <rte_os.h>\n \n+#include \"rte_swx_hash_func.h\"\n+\n /** Match type. */\n enum rte_swx_table_match_type {\n \t/** Wildcard Match (WM). */\n@@ -58,6 +60,12 @@ struct rte_swx_table_params {\n \t */\n \tuint32_t action_data_size;\n \n+\t/** Hash function. Ignored when not needed by the table implementation.\n+\t * When needed but set to NULL, the table implementation will select the\n+\t * hash function to use.\n+\t */\n+\trte_swx_hash_func_t hash_func;\n+\n \t/** Maximum number of keys to be stored in the table together with their\n \t * associated data.\n \t */\ndiff --git a/lib/table/rte_swx_table_em.c b/lib/table/rte_swx_table_em.c\nindex f783cfe282..568e76e249 100644\n--- a/lib/table/rte_swx_table_em.c\n+++ b/lib/table/rte_swx_table_em.c\n@@ -7,7 +7,10 @@\n \n #include <rte_common.h>\n #include <rte_prefetch.h>\n+#include <rte_jhash.h>\n+#include <rte_hash_crc.h>\n \n+#include \"rte_swx_keycmp.h\"\n #include \"rte_swx_table_em.h\"\n \n #define CHECK(condition, err_code)                                             \\\n@@ -54,181 +57,10 @@ env_free(void *start, size_t size)\n \n #endif\n \n-#if defined(RTE_ARCH_X86_64)\n-\n-#include <x86intrin.h>\n-\n-#define crc32_u64(crc, v) _mm_crc32_u64(crc, v)\n-\n-#else\n-\n-static inline uint64_t\n-crc32_u64_generic(uint64_t crc, uint64_t value)\n-{\n-\tint i;\n-\n-\tcrc = (crc & 0xFFFFFFFFLLU) ^ value;\n-\tfor (i = 63; i >= 0; i--) {\n-\t\tuint64_t mask;\n-\n-\t\tmask = -(crc & 1LLU);\n-\t\tcrc = (crc >> 1LLU) ^ (0x82F63B78LLU & mask);\n-\t}\n-\n-\treturn crc;\n-}\n-\n-#define crc32_u64(crc, v) crc32_u64_generic(crc, v)\n-\n-#endif\n-\n-/* Key size needs to be one of: 8, 16, 32 or 64. */\n-static inline uint32_t\n-hash(void *key, void *key_mask, uint32_t key_size, uint32_t seed)\n-{\n-\tuint64_t *k = key;\n-\tuint64_t *m = key_mask;\n-\tuint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;\n-\n-\tswitch (key_size) {\n-\tcase 8:\n-\t\tcrc0 = crc32_u64(seed, k[0] & m[0]);\n-\t\treturn crc0;\n-\n-\tcase 16:\n-\t\tk0 = k[0] & m[0];\n-\n-\t\tcrc0 = crc32_u64(k0, seed);\n-\t\tcrc1 = crc32_u64(k0 >> 32, k[1] & m[1]);\n-\n-\t\tcrc0 ^= crc1;\n-\n-\t\treturn crc0;\n-\n-\tcase 32:\n-\t\tk0 = k[0] & m[0];\n-\t\tk2 = k[2] & m[2];\n-\n-\t\tcrc0 = crc32_u64(k0, seed);\n-\t\tcrc1 = crc32_u64(k0 >> 32, k[1] & m[1]);\n-\n-\t\tcrc2 = crc32_u64(k2, k[3] & m[3]);\n-\t\tcrc3 = k2 >> 32;\n-\n-\t\tcrc0 = crc32_u64(crc0, crc1);\n-\t\tcrc1 = crc32_u64(crc2, crc3);\n-\n-\t\tcrc0 ^= crc1;\n-\n-\t\treturn crc0;\n-\n-\tcase 64:\n-\t\tk0 = k[0] & m[0];\n-\t\tk2 = k[2] & m[2];\n-\t\tk5 = k[5] & m[5];\n-\n-\t\tcrc0 = crc32_u64(k0, seed);\n-\t\tcrc1 = crc32_u64(k0 >> 32, k[1] & m[1]);\n-\n-\t\tcrc2 = crc32_u64(k2, k[3] & m[3]);\n-\t\tcrc3 = crc32_u64(k2 >> 32, k[4] & m[4]);\n-\n-\t\tcrc4 = crc32_u64(k5, k[6] & m[6]);\n-\t\tcrc5 = crc32_u64(k5 >> 32, k[7] & m[7]);\n-\n-\t\tcrc0 = crc32_u64(crc0, (crc1 << 32) ^ crc2);\n-\t\tcrc1 = crc32_u64(crc3, (crc4 << 32) ^ crc5);\n-\n-\t\tcrc0 ^= crc1;\n-\n-\t\treturn crc0;\n-\n-\tdefault:\n-\t\tcrc0 = 0;\n-\t\treturn crc0;\n-\t}\n-}\n-\n-/* n_bytes needs to be a multiple of 8 bytes. */\n static void\n-keycpy(void *dst, void *src, void *src_mask, uint32_t n_bytes)\n+keycpy(void *dst, void *src, uint32_t n_bytes)\n {\n-\tuint64_t *dst64 = dst, *src64 = src, *src_mask64 = src_mask;\n-\tuint32_t i;\n-\n-\tfor (i = 0; i < n_bytes / sizeof(uint64_t); i++)\n-\t\tdst64[i] = src64[i] & src_mask64[i];\n-}\n-\n-/*\n- * Return: 0 = Keys are NOT equal; 1 = Keys are equal.\n- */\n-static inline uint32_t\n-keycmp(void *a, void *b, void *b_mask, uint32_t n_bytes)\n-{\n-\tuint64_t *a64 = a, *b64 = b, *b_mask64 = b_mask;\n-\n-\tswitch (n_bytes) {\n-\tcase 8: {\n-\t\tuint64_t xor0 = a64[0] ^ (b64[0] & b_mask64[0]);\n-\t\tuint32_t result = 1;\n-\n-\t\tif (xor0)\n-\t\t\tresult = 0;\n-\t\treturn result;\n-\t}\n-\n-\tcase 16: {\n-\t\tuint64_t xor0 = a64[0] ^ (b64[0] & b_mask64[0]);\n-\t\tuint64_t xor1 = a64[1] ^ (b64[1] & b_mask64[1]);\n-\t\tuint64_t or = xor0 | xor1;\n-\t\tuint32_t result = 1;\n-\n-\t\tif (or)\n-\t\t\tresult = 0;\n-\t\treturn result;\n-\t}\n-\n-\tcase 32: {\n-\t\tuint64_t xor0 = a64[0] ^ (b64[0] & b_mask64[0]);\n-\t\tuint64_t xor1 = a64[1] ^ (b64[1] & b_mask64[1]);\n-\t\tuint64_t xor2 = a64[2] ^ (b64[2] & b_mask64[2]);\n-\t\tuint64_t xor3 = a64[3] ^ (b64[3] & b_mask64[3]);\n-\t\tuint64_t or = (xor0 | xor1) | (xor2 | xor3);\n-\t\tuint32_t result = 1;\n-\n-\t\tif (or)\n-\t\t\tresult = 0;\n-\t\treturn result;\n-\t}\n-\n-\tcase 64: {\n-\t\tuint64_t xor0 = a64[0] ^ (b64[0] & b_mask64[0]);\n-\t\tuint64_t xor1 = a64[1] ^ (b64[1] & b_mask64[1]);\n-\t\tuint64_t xor2 = a64[2] ^ (b64[2] & b_mask64[2]);\n-\t\tuint64_t xor3 = a64[3] ^ (b64[3] & b_mask64[3]);\n-\t\tuint64_t xor4 = a64[4] ^ (b64[4] & b_mask64[4]);\n-\t\tuint64_t xor5 = a64[5] ^ (b64[5] & b_mask64[5]);\n-\t\tuint64_t xor6 = a64[6] ^ (b64[6] & b_mask64[6]);\n-\t\tuint64_t xor7 = a64[7] ^ (b64[7] & b_mask64[7]);\n-\t\tuint64_t or = ((xor0 | xor1) | (xor2 | xor3)) |\n-\t\t\t      ((xor4 | xor5) | (xor6 | xor7));\n-\t\tuint32_t result = 1;\n-\n-\t\tif (or)\n-\t\t\tresult = 0;\n-\t\treturn result;\n-\t}\n-\n-\tdefault: {\n-\t\tuint32_t i;\n-\n-\t\tfor (i = 0; i < n_bytes / sizeof(uint64_t); i++)\n-\t\t\tif (a64[i] != (b64[i] & b_mask64[i]))\n-\t\t\t\treturn 0;\n-\t\treturn 1;\n-\t}\n-\t}\n+\tmemcpy(dst, src, n_bytes);\n }\n \n #define KEYS_PER_BUCKET 4\n@@ -244,8 +76,6 @@ struct table {\n \tstruct rte_swx_table_params params;\n \n \t/* Internal. */\n-\tuint32_t key_size;\n-\tuint32_t data_size;\n \tuint32_t key_size_shl;\n \tuint32_t data_size_shl;\n \tuint32_t n_buckets;\n@@ -253,9 +83,9 @@ struct table {\n \tuint32_t key_stack_tos;\n \tuint32_t bkt_ext_stack_tos;\n \tuint64_t total_size;\n+\trte_swx_keycmp_func_t keycmp_func;\n \n \t/* Memory arrays. */\n-\tuint8_t *key_mask;\n \tstruct bucket_extension *buckets;\n \tstruct bucket_extension *buckets_ext;\n \tuint8_t *keys;\n@@ -279,8 +109,7 @@ table_key_data(struct table *t, uint32_t key_id)\n static inline int\n bkt_is_empty(struct bucket_extension *bkt)\n {\n-\treturn (!bkt->sig[0] && !bkt->sig[1] && !bkt->sig[2] && !bkt->sig[3]) ?\n-\t\t1 : 0;\n+\treturn (!bkt->sig[0] && !bkt->sig[1] && !bkt->sig[2] && !bkt->sig[3]) ? 1 : 0;\n }\n \n /* Return:\n@@ -311,7 +140,7 @@ bkt_keycmp(struct table *t,\n \t/* Key comparison. */\n \tbkt_key_id = bkt->key_id[bkt_pos];\n \tbkt_key = table_key(t, bkt_key_id);\n-\treturn keycmp(bkt_key, input_key, t->key_mask, t->key_size);\n+\treturn t->keycmp_func(bkt_key, input_key, t->params.key_size);\n }\n \n static inline void\n@@ -331,15 +160,13 @@ bkt_key_install(struct table *t,\n \t/* Key. */\n \tbkt->key_id[bkt_pos] = bkt_key_id;\n \tbkt_key = table_key(t, bkt_key_id);\n-\tkeycpy(bkt_key, input->key, t->key_mask, t->key_size);\n+\tkeycpy(bkt_key, input->key, t->params.key_size);\n \n \t/* Key data. */\n \tbkt_data = table_key_data(t, bkt_key_id);\n \tbkt_data[0] = input->action_id;\n \tif (t->params.action_data_size && input->action_data)\n-\t\tmemcpy(&bkt_data[1],\n-\t\t       input->action_data,\n-\t\t       t->params.action_data_size);\n+\t\tmemcpy(&bkt_data[1], input->action_data, t->params.action_data_size);\n }\n \n static inline void\n@@ -358,9 +185,7 @@ bkt_key_data_update(struct table *t,\n \tbkt_data = table_key_data(t, bkt_key_id);\n \tbkt_data[0] = input->action_id;\n \tif (t->params.action_data_size && input->action_data)\n-\t\tmemcpy(&bkt_data[1],\n-\t\t       input->action_data,\n-\t\t       t->params.action_data_size);\n+\t\tmemcpy(&bkt_data[1], input->action_data, t->params.action_data_size);\n }\n \n #define CL RTE_CACHE_LINE_ROUNDUP\n@@ -374,9 +199,9 @@ __table_create(struct table **table,\n {\n \tstruct table *t;\n \tuint8_t *memory;\n-\tsize_t table_meta_sz, key_mask_sz, bucket_sz, bucket_ext_sz, key_sz,\n+\tsize_t table_meta_sz, bucket_sz, bucket_ext_sz, key_sz,\n \t\tkey_stack_sz, bkt_ext_stack_sz, data_sz, total_size;\n-\tsize_t key_mask_offset, bucket_offset, bucket_ext_offset, key_offset,\n+\tsize_t bucket_offset, bucket_ext_offset, key_offset,\n \t\tkey_stack_offset, bkt_ext_stack_offset, data_offset;\n \tuint32_t key_size, key_data_size, n_buckets, n_buckets_ext, i;\n \n@@ -384,30 +209,34 @@ __table_create(struct table **table,\n \tCHECK(params, EINVAL);\n \tCHECK(params->match_type == RTE_SWX_TABLE_MATCH_EXACT, EINVAL);\n \tCHECK(params->key_size, EINVAL);\n-\tCHECK(params->key_size <= 64, EINVAL);\n+\n+\tif (params->key_mask0) {\n+\t\tfor (i = 0; i < params->key_size; i++)\n+\t\t\tif (params->key_mask0[i] != 0xFF)\n+\t\t\t\tbreak;\n+\n+\t\tCHECK(i == params->key_size, EINVAL);\n+\t}\n+\n \tCHECK(params->n_keys_max, EINVAL);\n \n \t/* Memory allocation. */\n \tkey_size = rte_align64pow2(params->key_size);\n-\tif (key_size < 8)\n-\t\tkey_size = 8;\n \tkey_data_size = rte_align64pow2(params->action_data_size + 8);\n-\tn_buckets = params->n_keys_max / KEYS_PER_BUCKET;\n-\tn_buckets_ext = params->n_keys_max / KEYS_PER_BUCKET;\n+\tn_buckets = rte_align64pow2((params->n_keys_max + KEYS_PER_BUCKET - 1) / KEYS_PER_BUCKET);\n+\tn_buckets_ext = n_buckets;\n \n \ttable_meta_sz = CL(sizeof(struct table));\n-\tkey_mask_sz = CL(key_size);\n \tbucket_sz = CL(n_buckets * sizeof(struct bucket_extension));\n \tbucket_ext_sz = CL(n_buckets_ext * sizeof(struct bucket_extension));\n \tkey_sz = CL(params->n_keys_max * key_size);\n \tkey_stack_sz = CL(params->n_keys_max * sizeof(uint32_t));\n \tbkt_ext_stack_sz = CL(n_buckets_ext * sizeof(uint32_t));\n \tdata_sz = CL(params->n_keys_max * key_data_size);\n-\ttotal_size = table_meta_sz + key_mask_sz + bucket_sz + bucket_ext_sz +\n+\ttotal_size = table_meta_sz + bucket_sz + bucket_ext_sz +\n \t\t     key_sz + key_stack_sz + bkt_ext_stack_sz + data_sz;\n \n-\tkey_mask_offset = table_meta_sz;\n-\tbucket_offset = key_mask_offset + key_mask_sz;\n+\tbucket_offset = table_meta_sz;\n \tbucket_ext_offset = bucket_offset + bucket_sz;\n \tkey_offset = bucket_ext_offset + bucket_ext_sz;\n \tkey_stack_offset = key_offset + key_sz;\n@@ -427,16 +256,17 @@ __table_create(struct table **table,\n \t/* Initialization. */\n \tt = (struct table *)memory;\n \tmemcpy(&t->params, params, sizeof(*params));\n+\tt->params.key_mask0 = NULL;\n+\tif (!params->hash_func)\n+\t\tt->params.hash_func = rte_hash_crc;\n \n-\tt->key_size = key_size;\n-\tt->data_size = key_data_size;\n \tt->key_size_shl = __builtin_ctzl(key_size);\n \tt->data_size_shl = __builtin_ctzl(key_data_size);\n \tt->n_buckets = n_buckets;\n \tt->n_buckets_ext = n_buckets_ext;\n \tt->total_size = total_size;\n+\tt->keycmp_func = rte_swx_keycmp_func_get(params->key_size);\n \n-\tt->key_mask = &memory[key_mask_offset];\n \tt->buckets = (struct bucket_extension *)&memory[bucket_offset];\n \tt->buckets_ext = (struct bucket_extension *)&memory[bucket_ext_offset];\n \tt->keys = &memory[key_offset];\n@@ -444,13 +274,6 @@ __table_create(struct table **table,\n \tt->bkt_ext_stack = (uint32_t *)&memory[bkt_ext_stack_offset];\n \tt->data = &memory[data_offset];\n \n-\tt->params.key_mask0 = t->key_mask;\n-\n-\tif (!params->key_mask0)\n-\t\tmemset(t->key_mask, 0xFF, params->key_size);\n-\telse\n-\t\tmemcpy(t->key_mask, params->key_mask0, params->key_size);\n-\n \tfor (i = 0; i < t->params.n_keys_max; i++)\n \t\tt->key_stack[i] = t->params.n_keys_max - 1 - i;\n \tt->key_stack_tos = t->params.n_keys_max;\n@@ -485,7 +308,7 @@ table_add(void *table, struct rte_swx_table_entry *entry)\n \tCHECK(entry, EINVAL);\n \tCHECK(entry->key, EINVAL);\n \n-\tinput_sig = hash(entry->key, t->key_mask, t->key_size, 0);\n+\tinput_sig = t->params.hash_func(entry->key, t->params.key_size, 0);\n \tbkt_id = input_sig & (t->n_buckets - 1);\n \tbkt0 = &t->buckets[bkt_id];\n \tinput_sig = (input_sig >> 16) | 1;\n@@ -506,10 +329,8 @@ table_add(void *table, struct rte_swx_table_entry *entry)\n \n \t\t\t\t/* Allocate new key & install. */\n \t\t\t\tCHECK(t->key_stack_tos, ENOSPC);\n-\t\t\t\tnew_bkt_key_id =\n-\t\t\t\t\tt->key_stack[--t->key_stack_tos];\n-\t\t\t\tbkt_key_install(t, bkt, entry, i,\n-\t\t\t\t\t\tnew_bkt_key_id, input_sig);\n+\t\t\t\tnew_bkt_key_id = t->key_stack[--t->key_stack_tos];\n+\t\t\t\tbkt_key_install(t, bkt, entry, i, new_bkt_key_id, input_sig);\n \t\t\t\treturn 0;\n \t\t\t}\n \n@@ -526,8 +347,7 @@ table_add(void *table, struct rte_swx_table_entry *entry)\n \n \t\t/* Allocate new key & install. */\n \t\tnew_bkt_key_id = t->key_stack[--t->key_stack_tos];\n-\t\tbkt_key_install(t, new_bkt, entry, 0,\n-\t\t\t\tnew_bkt_key_id, input_sig);\n+\t\tbkt_key_install(t, new_bkt, entry, 0, new_bkt_key_id, input_sig);\n \t\treturn 0;\n \t}\n \n@@ -545,7 +365,7 @@ table_del(void *table, struct rte_swx_table_entry *entry)\n \tCHECK(entry, EINVAL);\n \tCHECK(entry->key, EINVAL);\n \n-\tinput_sig = hash(entry->key, t->key_mask, t->key_size, 0);\n+\tinput_sig = t->params.hash_func(entry->key, t->params.key_size, 0);\n \tbkt_id = input_sig & (t->n_buckets - 1);\n \tbkt0 = &t->buckets[bkt_id];\n \tinput_sig = (input_sig >> 16) | 1;\n@@ -556,17 +376,13 @@ table_del(void *table, struct rte_swx_table_entry *entry)\n \t\t\tif (bkt_keycmp(t, bkt, entry->key, i, input_sig)) {\n \t\t\t\t/* Key free. */\n \t\t\t\tbkt->sig[i] = 0;\n-\t\t\t\tt->key_stack[t->key_stack_tos++] =\n-\t\t\t\t\tbkt->key_id[i];\n+\t\t\t\tt->key_stack[t->key_stack_tos++] = bkt->key_id[i];\n \n-\t\t\t\t/* Bucket extension free if empty and not the\n-\t\t\t\t * 1st in bucket.\n-\t\t\t\t */\n+\t\t\t\t/* Bucket extension free if empty and not the 1st in bucket. */\n \t\t\t\tif (bkt_prev && bkt_is_empty(bkt)) {\n \t\t\t\t\tbkt_prev->next = bkt->next;\n \t\t\t\t\tbkt_id = bkt - t->buckets_ext;\n-\t\t\t\t\tt->bkt_ext_stack[t->bkt_ext_stack_tos++]\n-\t\t\t\t\t\t= bkt_id;\n+\t\t\t\t\tt->bkt_ext_stack[t->bkt_ext_stack_tos++] = bkt_id;\n \t\t\t\t}\n \n \t\t\t\treturn 0;\n@@ -596,7 +412,7 @@ table_lookup_unoptimized(void *table,\n \n \tinput_key = &(*key)[t->params.key_offset];\n \n-\tinput_sig = hash(input_key, t->key_mask, t->key_size, 0);\n+\tinput_sig = t->params.hash_func(input_key, t->params.key_size, 0);\n \tbkt_id = input_sig & (t->n_buckets - 1);\n \tbkt0 = &t->buckets[bkt_id];\n \tinput_sig = (input_sig >> 16) | 1;\n@@ -695,7 +511,7 @@ table_lookup(void *table,\n \t\tstruct bucket_extension *bkt;\n \t\tuint32_t input_sig, bkt_id;\n \n-\t\tinput_sig = hash(input_key, t->key_mask, t->key_size, 0);\n+\t\tinput_sig = t->params.hash_func(input_key, t->params.key_size, 0);\n \t\tbkt_id = input_sig & (t->n_buckets - 1);\n \t\tbkt = &t->buckets[bkt_id];\n \t\trte_prefetch0(bkt);\n@@ -756,7 +572,7 @@ table_lookup(void *table,\n \t\tuint64_t *bkt_data = table_key_data(t, bkt_key_id);\n \t\tuint32_t lkp_hit;\n \n-\t\tlkp_hit = keycmp(bkt_key, input_key, t->key_mask, t->key_size);\n+\t\tlkp_hit = t->keycmp_func(bkt_key, input_key, t->params.key_size);\n \t\tlkp_hit &= m->sig_match;\n \t\t*action_id = bkt_data[0];\n \t\t*action_data = (uint8_t *)&bkt_data[1];\n",
    "prefixes": [
        "V2",
        "3/6"
    ]
}