DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files
@ 2018-09-07 10:06 Kevin Laatz
  2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 2/3] examples/ip_pipeline: modify application to use librte_table headers Kevin Laatz
                   ` (3 more replies)
  0 siblings, 4 replies; 14+ messages in thread
From: Kevin Laatz @ 2018-09-07 10:06 UTC (permalink / raw)
  To: dev; +Cc: cristian.dumitrescu, jianbo.liu, gavin.hu, jerin.jacob, Kevin Laatz

This commit adds rte_table_hash_func.h and rte_table_hash_func_arm64.h to
librte_table. This reduces code duplication by removing duplicate header files
within two folders and consolidating them into a single one. This also adds a
scalar implementation of the x86_64 intrinsic for crc32 as a generic fallback.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Acked-by: Gavin Hu <gavin.hu@arm.com>
---
v2:
   - Fixed typo in commit message
   - Fixed typo in arm header that caused some compilations to fail for the
     entire patchset
v3:
   - Improved commit message
---
 lib/librte_table/Makefile                    |   2 +
 lib/librte_table/meson.build                 |   2 +
 lib/librte_table/rte_table_hash_func.h       | 244 +++++++++++++++++++++++++++
 lib/librte_table/rte_table_hash_func_arm64.h |  21 +++
 lib/librte_table/rte_table_version.map       |  14 ++
 5 files changed, 283 insertions(+)
 create mode 100644 lib/librte_table/rte_table_hash_func.h
 create mode 100644 lib/librte_table/rte_table_hash_func_arm64.h

diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 276d476..f935678 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -46,6 +46,8 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_acl.h
 endif
 SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash.h
 SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash_cuckoo.h
+SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash_func.h
+SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash_func_arm64.h
 SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_lru.h
 ifeq ($(CONFIG_RTE_ARCH_X86),y)
 SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_lru_x86.h
diff --git a/lib/librte_table/meson.build b/lib/librte_table/meson.build
index 8b2f841..6ae3cd6 100644
--- a/lib/librte_table/meson.build
+++ b/lib/librte_table/meson.build
@@ -19,6 +19,8 @@ headers = files('rte_table.h',
 		'rte_table_lpm_ipv6.h',
 		'rte_table_hash.h',
 		'rte_table_hash_cuckoo.h',
+		'rte_table_hash_func.h',
+		'rte_table_hash_func_arm64.h',
 		'rte_lru.h',
 		'rte_table_array.h',
 		'rte_table_stub.h')
diff --git a/lib/librte_table/rte_table_hash_func.h b/lib/librte_table/rte_table_hash_func.h
new file mode 100644
index 0000000..761ef3d
--- /dev/null
+++ b/lib/librte_table/rte_table_hash_func.h
@@ -0,0 +1,244 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2018 Intel Corporation
+ */
+
+#ifndef __INCLUDE_RTE_TABLE_HASH_FUNC_H__
+#define __INCLUDE_RTE_TABLE_HASH_FUNC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#include <rte_common.h>
+
+static inline uint64_t
+rte_crc32_u64_generic(uint64_t crc, uint64_t value)
+{
+	int i;
+
+	crc = (crc & 0xFFFFFFFFLLU) ^ value;
+	for (i = 63; i >= 0; i--) {
+		uint64_t mask;
+
+		mask = -(crc & 1LLU);
+		crc = (crc >> 1LLU) ^ (0x82F63B78LLU & mask);
+	}
+
+	return crc;
+}
+
+#if defined(RTE_ARCH_X86_64)
+
+#include <x86intrin.h>
+
+static inline uint64_t
+rte_crc32_u64(uint64_t crc, uint64_t v)
+{
+	return _mm_crc32_u64(crc, v);
+}
+
+#elif defined(RTE_ARCH_ARM64)
+#include "rte_table_hash_func_arm64.h"
+#else
+
+static inline uint64_t
+rte_crc32_u64(uint64_t crc, uint64_t v)
+{
+	return rte_crc32_u64_generic(crc, v);
+}
+
+#endif
+
+static inline uint64_t
+rte_table_hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t crc0;
+
+	crc0 = rte_crc32_u64(seed, k[0] & m[0]);
+
+	return crc0;
+}
+
+static inline uint64_t
+rte_table_hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, crc0, crc1;
+
+	k0 = k[0] & m[0];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t
+rte_table_hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, crc0, crc1;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc0 = rte_crc32_u64(crc0, k2);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t
+rte_table_hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, crc0, crc1, crc2, crc3;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = k2 >> 32;
+
+	crc0 = rte_crc32_u64(crc0, crc1);
+	crc1 = rte_crc32_u64(crc2, crc3);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t
+rte_table_hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, crc0, crc1, crc2, crc3;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
+
+	crc0 = rte_crc32_u64(crc0, crc1);
+	crc1 = rte_crc32_u64(crc2, crc3);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t
+rte_table_hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+	k5 = k[5] & m[5];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
+
+	crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
+	crc1 = rte_crc32_u64(crc3, k5);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t
+rte_table_hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+	k5 = k[5] & m[5];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
+
+	crc4 = rte_crc32_u64(k5, k[6] & m[6]);
+	crc5 = k5 >> 32;
+
+	crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
+	crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t
+rte_table_hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+	k5 = k[5] & m[5];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
+
+	crc4 = rte_crc32_u64(k5, k[6] & m[6]);
+	crc5 = rte_crc32_u64(k5 >> 32, k[7] & m[7]);
+
+	crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
+	crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/librte_table/rte_table_hash_func_arm64.h b/lib/librte_table/rte_table_hash_func_arm64.h
new file mode 100644
index 0000000..eb04c1f
--- /dev/null
+++ b/lib/librte_table/rte_table_hash_func_arm64.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2017-2018 Linaro Limited
+ */
+
+#ifndef __INCLUDE_RTE_TABLE_HASH_FUNC_ARM64_H__
+#define __INCLUDE_RTE_TABLE_HASH_FUNC_ARM64_H__
+
+#define _CRC32CX(crc, val)	\
+	__asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
+
+static inline uint64_t
+rte_crc32_u64(uint64_t crc, uint64_t v)
+{
+	uint32_t crc32 = crc;
+
+	_CRC32CX(crc32, v);
+
+	return crc32;
+}
+
+#endif
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
index 6237252..dab339e 100644
--- a/lib/librte_table/rte_table_version.map
+++ b/lib/librte_table/rte_table_version.map
@@ -18,3 +18,17 @@ DPDK_17.11 {
 
 	local: *;
 };
+
+DPDK_18.11 {
+	global:
+
+	rte_crc32_u64_generic;
+	rte_table_hash_crc_key8;
+	rte_table_hash_crc_key16;
+	rte_table_hash_crc_key24;
+	rte_table_hash_crc_key32;
+	rte_table_hash_crc_key40;
+	rte_table_hash_crc_key48;
+	rte_table_hash_crc_key56;
+	rte_table_hash_crc_key64;
+} DPDK_17.11;
-- 
2.9.5

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH v3 2/3] examples/ip_pipeline: modify application to use librte_table headers
  2018-09-07 10:06 [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Kevin Laatz
@ 2018-09-07 10:06 ` Kevin Laatz
  2018-09-07 10:20   ` Gavin Hu (Arm Technology China)
  2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 3/3] net/softnic: modify softnic " Kevin Laatz
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 14+ messages in thread
From: Kevin Laatz @ 2018-09-07 10:06 UTC (permalink / raw)
  To: dev; +Cc: cristian.dumitrescu, jianbo.liu, gavin.hu, jerin.jacob, Kevin Laatz

This commit modifies the IP Pipeline application to use the new header
files in librte_table.

As we are now using the new header files, we can remove the old ones from
the application directory.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
---
 examples/ip_pipeline/action.c          |  34 ++--
 examples/ip_pipeline/hash_func.h       | 357 ---------------------------------
 examples/ip_pipeline/hash_func_arm64.h | 232 ---------------------
 examples/ip_pipeline/pipeline.c        |  19 +-
 4 files changed, 26 insertions(+), 616 deletions(-)
 delete mode 100644 examples/ip_pipeline/hash_func.h
 delete mode 100644 examples/ip_pipeline/hash_func_arm64.h

diff --git a/examples/ip_pipeline/action.c b/examples/ip_pipeline/action.c
index a29c2b3..20497c3 100644
--- a/examples/ip_pipeline/action.c
+++ b/examples/ip_pipeline/action.c
@@ -7,9 +7,9 @@
 #include <string.h>
 
 #include <rte_string_fns.h>
+#include <rte_table_hash_func.h>
 
 #include "action.h"
-#include "hash_func.h"
 
 /**
  * Input port
@@ -57,35 +57,35 @@ port_in_action_profile_create(const char *name,
 		(params->lb.f_hash == NULL)) {
 		switch (params->lb.key_size) {
 		case  8:
-			params->lb.f_hash = hash_default_key8;
+			params->lb.f_hash = rte_table_hash_crc_key8;
 			break;
 
 		case 16:
-			params->lb.f_hash = hash_default_key16;
+			params->lb.f_hash = rte_table_hash_crc_key16;
 			break;
 
 		case 24:
-			params->lb.f_hash = hash_default_key24;
+			params->lb.f_hash = rte_table_hash_crc_key24;
 			break;
 
 		case 32:
-			params->lb.f_hash = hash_default_key32;
+			params->lb.f_hash = rte_table_hash_crc_key32;
 			break;
 
 		case 40:
-			params->lb.f_hash = hash_default_key40;
+			params->lb.f_hash = rte_table_hash_crc_key40;
 			break;
 
 		case 48:
-			params->lb.f_hash = hash_default_key48;
+			params->lb.f_hash = rte_table_hash_crc_key48;
 			break;
 
 		case 56:
-			params->lb.f_hash = hash_default_key56;
+			params->lb.f_hash = rte_table_hash_crc_key56;
 			break;
 
 		case 64:
-			params->lb.f_hash = hash_default_key64;
+			params->lb.f_hash = rte_table_hash_crc_key64;
 			break;
 
 		default:
@@ -192,35 +192,35 @@ table_action_profile_create(const char *name,
 		(params->lb.f_hash == NULL)) {
 		switch (params->lb.key_size) {
 		case 8:
-			params->lb.f_hash = hash_default_key8;
+			params->lb.f_hash = rte_table_hash_crc_key8;
 			break;
 
 		case 16:
-			params->lb.f_hash = hash_default_key16;
+			params->lb.f_hash = rte_table_hash_crc_key16;
 			break;
 
 		case 24:
-			params->lb.f_hash = hash_default_key24;
+			params->lb.f_hash = rte_table_hash_crc_key24;
 			break;
 
 		case 32:
-			params->lb.f_hash = hash_default_key32;
+			params->lb.f_hash = rte_table_hash_crc_key32;
 			break;
 
 		case 40:
-			params->lb.f_hash = hash_default_key40;
+			params->lb.f_hash = rte_table_hash_crc_key40;
 			break;
 
 		case 48:
-			params->lb.f_hash = hash_default_key48;
+			params->lb.f_hash = rte_table_hash_crc_key48;
 			break;
 
 		case 56:
-			params->lb.f_hash = hash_default_key56;
+			params->lb.f_hash = rte_table_hash_crc_key56;
 			break;
 
 		case 64:
-			params->lb.f_hash = hash_default_key64;
+			params->lb.f_hash = rte_table_hash_crc_key64;
 			break;
 
 		default:
diff --git a/examples/ip_pipeline/hash_func.h b/examples/ip_pipeline/hash_func.h
deleted file mode 100644
index f1b9d94..0000000
--- a/examples/ip_pipeline/hash_func.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef __INCLUDE_HASH_FUNC_H__
-#define __INCLUDE_HASH_FUNC_H__
-
-static inline uint64_t
-hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = seed ^ (k[0] & m[0]);
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-
-	xor0 ^= k[2] & m[2];
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-
-	xor0 ^= xor1;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-
-	xor0 ^= xor1;
-
-	xor0 ^= k[4] & m[4];
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-
-	xor0 ^= xor1;
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-
-	xor0 ^= xor1;
-	xor2 ^= k[6] & m[6];
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2, xor3;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-	xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
-
-	xor0 ^= xor1;
-	xor2 ^= xor3;
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-#if defined(RTE_ARCH_X86_64)
-
-#include <x86intrin.h>
-
-static inline uint64_t
-hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t crc0;
-
-	crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, crc0, crc1;
-
-	k0 = k[0] & m[0];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc0 = _mm_crc32_u64(crc0, k2);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-
-	crc0 = _mm_crc32_u64(crc0, crc1);
-	crc1 = _mm_crc32_u64(crc2, crc3);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc0 = _mm_crc32_u64(crc0, crc1);
-	crc1 = _mm_crc32_u64(crc2, crc3);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, k5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
-	crc5 = k5 >> 32;
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
-	crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-#define hash_default_key8			hash_crc_key8
-#define hash_default_key16			hash_crc_key16
-#define hash_default_key24			hash_crc_key24
-#define hash_default_key32			hash_crc_key32
-#define hash_default_key40			hash_crc_key40
-#define hash_default_key48			hash_crc_key48
-#define hash_default_key56			hash_crc_key56
-#define hash_default_key64			hash_crc_key64
-
-#elif defined(RTE_ARCH_ARM64)
-#include "hash_func_arm64.h"
-#else
-
-#define hash_default_key8			hash_xor_key8
-#define hash_default_key16			hash_xor_key16
-#define hash_default_key24			hash_xor_key24
-#define hash_default_key32			hash_xor_key32
-#define hash_default_key40			hash_xor_key40
-#define hash_default_key48			hash_xor_key48
-#define hash_default_key56			hash_xor_key56
-#define hash_default_key64			hash_xor_key64
-
-#endif
-
-#endif
diff --git a/examples/ip_pipeline/hash_func_arm64.h b/examples/ip_pipeline/hash_func_arm64.h
deleted file mode 100644
index 50df816..0000000
--- a/examples/ip_pipeline/hash_func_arm64.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017-2018 Linaro Limited.
- */
-#ifndef __HASH_FUNC_ARM64_H__
-#define __HASH_FUNC_ARM64_H__
-
-#define _CRC32CX(crc, val)	\
-	__asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
-
-static inline uint64_t
-hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint32_t crc0;
-
-	crc0 = seed;
-	_CRC32CX(crc0, k[0] & m[0]);
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1;
-
-	k0 = k[0] & m[0];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	_CRC32CX(crc0, k2);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-
-	_CRC32CX(crc0, crc1);
-	_CRC32CX(crc2, crc3);
-
-	crc0 ^= crc2;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	_CRC32CX(crc0, crc1);
-	_CRC32CX(crc2, crc3);
-
-	crc0 ^= crc2;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, k5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	crc4 = k5;
-	 _CRC32CX(crc4, k[6] & m[6]);
-	crc5 = k5 >> 32;
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	crc4 = k5;
-	 _CRC32CX(crc4, k[6] & m[6]);
-	crc5 = k5 >> 32;
-	_CRC32CX(crc5, k[7] & m[7]);
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-#define hash_default_key8			hash_crc_key8
-#define hash_default_key16			hash_crc_key16
-#define hash_default_key24			hash_crc_key24
-#define hash_default_key32			hash_crc_key32
-#define hash_default_key40			hash_crc_key40
-#define hash_default_key48			hash_crc_key48
-#define hash_default_key56			hash_crc_key56
-#define hash_default_key64			hash_crc_key64
-
-#endif
diff --git a/examples/ip_pipeline/pipeline.c b/examples/ip_pipeline/pipeline.c
index 43fe867..b2fd215 100644
--- a/examples/ip_pipeline/pipeline.c
+++ b/examples/ip_pipeline/pipeline.c
@@ -22,6 +22,7 @@
 #include <rte_table_acl.h>
 #include <rte_table_array.h>
 #include <rte_table_hash.h>
+#include <rte_table_hash_func.h>
 #include <rte_table_lpm.h>
 #include <rte_table_lpm_ipv6.h>
 #include <rte_table_stub.h>
@@ -36,8 +37,6 @@
 #include "tmgr.h"
 #include "swq.h"
 
-#include "hash_func.h"
-
 #ifndef PIPELINE_MSGQ_SIZE
 #define PIPELINE_MSGQ_SIZE                                 64
 #endif
@@ -818,28 +817,28 @@ pipeline_table_create(const char *pipeline_name,
 
 		switch (params->match.hash.key_size) {
 		case  8:
-			f_hash = hash_default_key8;
+			f_hash = rte_table_hash_crc_key8;
 			break;
 		case 16:
-			f_hash = hash_default_key16;
+			f_hash = rte_table_hash_crc_key16;
 			break;
 		case 24:
-			f_hash = hash_default_key24;
+			f_hash = rte_table_hash_crc_key24;
 			break;
 		case 32:
-			f_hash = hash_default_key32;
+			f_hash = rte_table_hash_crc_key32;
 			break;
 		case 40:
-			f_hash = hash_default_key40;
+			f_hash = rte_table_hash_crc_key40;
 			break;
 		case 48:
-			f_hash = hash_default_key48;
+			f_hash = rte_table_hash_crc_key48;
 			break;
 		case 56:
-			f_hash = hash_default_key56;
+			f_hash = rte_table_hash_crc_key56;
 			break;
 		case 64:
-			f_hash = hash_default_key64;
+			f_hash = rte_table_hash_crc_key64;
 			break;
 		default:
 			return -1;
-- 
2.9.5

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH v3 3/3] net/softnic: modify softnic to use librte_table headers
  2018-09-07 10:06 [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Kevin Laatz
  2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 2/3] examples/ip_pipeline: modify application to use librte_table headers Kevin Laatz
@ 2018-09-07 10:06 ` Kevin Laatz
  2018-09-07 10:20   ` Gavin Hu (Arm Technology China)
  2018-09-25  4:42 ` [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Jerin Jacob
  2018-09-25 15:32 ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func " Kevin Laatz
  3 siblings, 1 reply; 14+ messages in thread
From: Kevin Laatz @ 2018-09-07 10:06 UTC (permalink / raw)
  To: dev; +Cc: cristian.dumitrescu, jianbo.liu, gavin.hu, jerin.jacob, Kevin Laatz

This commit modifies SoftNIC to make use of the new header files in
librte_table.

As we are now using the new header files in librte_table in SoftNIC, we no
longer need the old header files so they can be removed.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
---
 drivers/net/softnic/hash_func.h                | 359 -------------------------
 drivers/net/softnic/hash_func_arm64.h          | 261 ------------------
 drivers/net/softnic/rte_eth_softnic_action.c   |  34 +--
 drivers/net/softnic/rte_eth_softnic_pipeline.c |  19 +-
 4 files changed, 26 insertions(+), 647 deletions(-)
 delete mode 100644 drivers/net/softnic/hash_func.h
 delete mode 100644 drivers/net/softnic/hash_func_arm64.h

diff --git a/drivers/net/softnic/hash_func.h b/drivers/net/softnic/hash_func.h
deleted file mode 100644
index 198d2b2..0000000
--- a/drivers/net/softnic/hash_func.h
+++ /dev/null
@@ -1,359 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef __INCLUDE_HASH_FUNC_H__
-#define __INCLUDE_HASH_FUNC_H__
-
-#include <rte_common.h>
-
-static inline uint64_t
-hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = seed ^ (k[0] & m[0]);
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-
-	xor0 ^= k[2] & m[2];
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-
-	xor0 ^= xor1;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-
-	xor0 ^= xor1;
-
-	xor0 ^= k[4] & m[4];
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-
-	xor0 ^= xor1;
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-
-	xor0 ^= xor1;
-	xor2 ^= k[6] & m[6];
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2, xor3;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-	xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
-
-	xor0 ^= xor1;
-	xor2 ^= xor3;
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-#if defined(RTE_ARCH_X86_64)
-
-#include <x86intrin.h>
-
-static inline uint64_t
-hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t crc0;
-
-	crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, crc0, crc1;
-
-	k0 = k[0] & m[0];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc0 = _mm_crc32_u64(crc0, k2);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-
-	crc0 = _mm_crc32_u64(crc0, crc1);
-	crc1 = _mm_crc32_u64(crc2, crc3);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc0 = _mm_crc32_u64(crc0, crc1);
-	crc1 = _mm_crc32_u64(crc2, crc3);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, k5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
-	crc5 = k5 >> 32;
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
-	crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-#define hash_default_key8			hash_crc_key8
-#define hash_default_key16			hash_crc_key16
-#define hash_default_key24			hash_crc_key24
-#define hash_default_key32			hash_crc_key32
-#define hash_default_key40			hash_crc_key40
-#define hash_default_key48			hash_crc_key48
-#define hash_default_key56			hash_crc_key56
-#define hash_default_key64			hash_crc_key64
-
-#elif defined(RTE_ARCH_ARM64)
-#include "hash_func_arm64.h"
-#else
-
-#define hash_default_key8			hash_xor_key8
-#define hash_default_key16			hash_xor_key16
-#define hash_default_key24			hash_xor_key24
-#define hash_default_key32			hash_xor_key32
-#define hash_default_key40			hash_xor_key40
-#define hash_default_key48			hash_xor_key48
-#define hash_default_key56			hash_xor_key56
-#define hash_default_key64			hash_xor_key64
-
-#endif
-
-#endif
diff --git a/drivers/net/softnic/hash_func_arm64.h b/drivers/net/softnic/hash_func_arm64.h
deleted file mode 100644
index ae6c0f4..0000000
--- a/drivers/net/softnic/hash_func_arm64.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2017 Linaro Limited. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __HASH_FUNC_ARM64_H__
-#define __HASH_FUNC_ARM64_H__
-
-#define _CRC32CX(crc, val)	\
-	__asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
-
-static inline uint64_t
-hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint32_t crc0;
-
-	crc0 = seed;
-	_CRC32CX(crc0, k[0] & m[0]);
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1;
-
-	k0 = k[0] & m[0];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	_CRC32CX(crc0, k2);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-
-	_CRC32CX(crc0, crc1);
-	_CRC32CX(crc2, crc3);
-
-	crc0 ^= crc2;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	_CRC32CX(crc0, crc1);
-	_CRC32CX(crc2, crc3);
-
-	crc0 ^= crc2;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, k5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	crc4 = k5;
-	 _CRC32CX(crc4, k[6] & m[6]);
-	crc5 = k5 >> 32;
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	crc4 = k5;
-	 _CRC32CX(crc4, k[6] & m[6]);
-	crc5 = k5 >> 32;
-	_CRC32CX(crc5, k[7] & m[7]);
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-#define hash_default_key8			hash_crc_key8
-#define hash_default_key16			hash_crc_key16
-#define hash_default_key24			hash_crc_key24
-#define hash_default_key32			hash_crc_key32
-#define hash_default_key40			hash_crc_key40
-#define hash_default_key48			hash_crc_key48
-#define hash_default_key56			hash_crc_key56
-#define hash_default_key64			hash_crc_key64
-
-#endif
diff --git a/drivers/net/softnic/rte_eth_softnic_action.c b/drivers/net/softnic/rte_eth_softnic_action.c
index c25f4dd..c542688 100644
--- a/drivers/net/softnic/rte_eth_softnic_action.c
+++ b/drivers/net/softnic/rte_eth_softnic_action.c
@@ -7,8 +7,8 @@
 #include <string.h>
 
 #include <rte_string_fns.h>
+#include <rte_table_hash_func.h>
 
-#include "hash_func.h"
 #include "rte_eth_softnic_internals.h"
 
 /**
@@ -72,35 +72,35 @@ softnic_port_in_action_profile_create(struct pmd_internals *p,
 		params->lb.f_hash == NULL) {
 		switch (params->lb.key_size) {
 		case  8:
-			params->lb.f_hash = hash_default_key8;
+			params->lb.f_hash = rte_table_hash_crc_key8;
 			break;
 
 		case 16:
-			params->lb.f_hash = hash_default_key16;
+			params->lb.f_hash = rte_table_hash_crc_key16;
 			break;
 
 		case 24:
-			params->lb.f_hash = hash_default_key24;
+			params->lb.f_hash = rte_table_hash_crc_key24;
 			break;
 
 		case 32:
-			params->lb.f_hash = hash_default_key32;
+			params->lb.f_hash = rte_table_hash_crc_key32;
 			break;
 
 		case 40:
-			params->lb.f_hash = hash_default_key40;
+			params->lb.f_hash = rte_table_hash_crc_key40;
 			break;
 
 		case 48:
-			params->lb.f_hash = hash_default_key48;
+			params->lb.f_hash = rte_table_hash_crc_key48;
 			break;
 
 		case 56:
-			params->lb.f_hash = hash_default_key56;
+			params->lb.f_hash = rte_table_hash_crc_key56;
 			break;
 
 		case 64:
-			params->lb.f_hash = hash_default_key64;
+			params->lb.f_hash = rte_table_hash_crc_key64;
 			break;
 
 		default:
@@ -223,35 +223,35 @@ softnic_table_action_profile_create(struct pmd_internals *p,
 		params->lb.f_hash == NULL) {
 		switch (params->lb.key_size) {
 		case 8:
-			params->lb.f_hash = hash_default_key8;
+			params->lb.f_hash = rte_table_hash_crc_key8;
 			break;
 
 		case 16:
-			params->lb.f_hash = hash_default_key16;
+			params->lb.f_hash = rte_table_hash_crc_key16;
 			break;
 
 		case 24:
-			params->lb.f_hash = hash_default_key24;
+			params->lb.f_hash = rte_table_hash_crc_key24;
 			break;
 
 		case 32:
-			params->lb.f_hash = hash_default_key32;
+			params->lb.f_hash = rte_table_hash_crc_key32;
 			break;
 
 		case 40:
-			params->lb.f_hash = hash_default_key40;
+			params->lb.f_hash = rte_table_hash_crc_key40;
 			break;
 
 		case 48:
-			params->lb.f_hash = hash_default_key48;
+			params->lb.f_hash = rte_table_hash_crc_key48;
 			break;
 
 		case 56:
-			params->lb.f_hash = hash_default_key56;
+			params->lb.f_hash = rte_table_hash_crc_key56;
 			break;
 
 		case 64:
-			params->lb.f_hash = hash_default_key64;
+			params->lb.f_hash = rte_table_hash_crc_key64;
 			break;
 
 		default:
diff --git a/drivers/net/softnic/rte_eth_softnic_pipeline.c b/drivers/net/softnic/rte_eth_softnic_pipeline.c
index 45136a4..0aababe 100644
--- a/drivers/net/softnic/rte_eth_softnic_pipeline.c
+++ b/drivers/net/softnic/rte_eth_softnic_pipeline.c
@@ -19,14 +19,13 @@
 #include <rte_table_acl.h>
 #include <rte_table_array.h>
 #include <rte_table_hash.h>
+#include <rte_table_hash_func.h>
 #include <rte_table_lpm.h>
 #include <rte_table_lpm_ipv6.h>
 #include <rte_table_stub.h>
 
 #include "rte_eth_softnic_internals.h"
 
-#include "hash_func.h"
-
 #ifndef PIPELINE_MSGQ_SIZE
 #define PIPELINE_MSGQ_SIZE                                 64
 #endif
@@ -797,28 +796,28 @@ softnic_pipeline_table_create(struct pmd_internals *softnic,
 
 		switch (params->match.hash.key_size) {
 		case  8:
-			f_hash = hash_default_key8;
+			f_hash = rte_table_hash_crc_key8;
 			break;
 		case 16:
-			f_hash = hash_default_key16;
+			f_hash = rte_table_hash_crc_key16;
 			break;
 		case 24:
-			f_hash = hash_default_key24;
+			f_hash = rte_table_hash_crc_key24;
 			break;
 		case 32:
-			f_hash = hash_default_key32;
+			f_hash = rte_table_hash_crc_key32;
 			break;
 		case 40:
-			f_hash = hash_default_key40;
+			f_hash = rte_table_hash_crc_key40;
 			break;
 		case 48:
-			f_hash = hash_default_key48;
+			f_hash = rte_table_hash_crc_key48;
 			break;
 		case 56:
-			f_hash = hash_default_key56;
+			f_hash = rte_table_hash_crc_key56;
 			break;
 		case 64:
-			f_hash = hash_default_key64;
+			f_hash = rte_table_hash_crc_key64;
 			break;
 		default:
 			return -1;
-- 
2.9.5

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH v3 2/3] examples/ip_pipeline: modify application to use librte_table headers
  2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 2/3] examples/ip_pipeline: modify application to use librte_table headers Kevin Laatz
@ 2018-09-07 10:20   ` Gavin Hu (Arm Technology China)
  0 siblings, 0 replies; 14+ messages in thread
From: Gavin Hu (Arm Technology China) @ 2018-09-07 10:20 UTC (permalink / raw)
  To: Kevin Laatz, dev; +Cc: cristian.dumitrescu, Jianbo Liu, jerin.jacob



> -----Original Message-----
> From: Kevin Laatz <kevin.laatz@intel.com>
> Sent: Friday, September 7, 2018 6:06 PM
> To: dev@dpdk.org
> Cc: cristian.dumitrescu@intel.com; Jianbo Liu <Jianbo.Liu@arm.com>; Gavin
> Hu (Arm Technology China) <Gavin.Hu@arm.com>;
> jerin.jacob@caviumnetworks.com; Kevin Laatz <kevin.laatz@intel.com>
> Subject: [PATCH v3 2/3] examples/ip_pipeline: modify application to use
> librte_table headers
>
> This commit modifies the IP Pipeline application to use the new header files
> in librte_table.
>
> As we are now using the new header files, we can remove the old ones from
> the application directory.
>
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Acked-by: Gavin Hu <gavin.hu@arm.com>
> ---
>  examples/ip_pipeline/action.c          |  34 ++--
>  examples/ip_pipeline/hash_func.h       | 357 ---------------------------------
>  examples/ip_pipeline/hash_func_arm64.h | 232 ---------------------
>  examples/ip_pipeline/pipeline.c        |  19 +-
>  4 files changed, 26 insertions(+), 616 deletions(-)  delete mode 100644
> examples/ip_pipeline/hash_func.h  delete mode 100644
> examples/ip_pipeline/hash_func_arm64.h
>
> diff --git a/examples/ip_pipeline/action.c b/examples/ip_pipeline/action.c
> index a29c2b3..20497c3 100644
> --- a/examples/ip_pipeline/action.c
> +++ b/examples/ip_pipeline/action.c
> @@ -7,9 +7,9 @@
>  #include <string.h>
>
>  #include <rte_string_fns.h>
> +#include <rte_table_hash_func.h>
>
>  #include "action.h"
> -#include "hash_func.h"
>
>  /**
>   * Input port
> @@ -57,35 +57,35 @@ port_in_action_profile_create(const char *name,
>  (params->lb.f_hash == NULL)) {
>  switch (params->lb.key_size) {
>  case  8:
> -params->lb.f_hash = hash_default_key8;
> +params->lb.f_hash = rte_table_hash_crc_key8;
>  break;
>
>  case 16:
> -params->lb.f_hash = hash_default_key16;
> +params->lb.f_hash = rte_table_hash_crc_key16;
>  break;
>
>  case 24:
> -params->lb.f_hash = hash_default_key24;
> +params->lb.f_hash = rte_table_hash_crc_key24;
>  break;
>
>  case 32:
> -params->lb.f_hash = hash_default_key32;
> +params->lb.f_hash = rte_table_hash_crc_key32;
>  break;
>
>  case 40:
> -params->lb.f_hash = hash_default_key40;
> +params->lb.f_hash = rte_table_hash_crc_key40;
>  break;
>
>  case 48:
> -params->lb.f_hash = hash_default_key48;
> +params->lb.f_hash = rte_table_hash_crc_key48;
>  break;
>
>  case 56:
> -params->lb.f_hash = hash_default_key56;
> +params->lb.f_hash = rte_table_hash_crc_key56;
>  break;
>
>  case 64:
> -params->lb.f_hash = hash_default_key64;
> +params->lb.f_hash = rte_table_hash_crc_key64;
>  break;
>
>  default:
> @@ -192,35 +192,35 @@ table_action_profile_create(const char *name,
>  (params->lb.f_hash == NULL)) {
>  switch (params->lb.key_size) {
>  case 8:
> -params->lb.f_hash = hash_default_key8;
> +params->lb.f_hash = rte_table_hash_crc_key8;
>  break;
>
>  case 16:
> -params->lb.f_hash = hash_default_key16;
> +params->lb.f_hash = rte_table_hash_crc_key16;
>  break;
>
>  case 24:
> -params->lb.f_hash = hash_default_key24;
> +params->lb.f_hash = rte_table_hash_crc_key24;
>  break;
>
>  case 32:
> -params->lb.f_hash = hash_default_key32;
> +params->lb.f_hash = rte_table_hash_crc_key32;
>  break;
>
>  case 40:
> -params->lb.f_hash = hash_default_key40;
> +params->lb.f_hash = rte_table_hash_crc_key40;
>  break;
>
>  case 48:
> -params->lb.f_hash = hash_default_key48;
> +params->lb.f_hash = rte_table_hash_crc_key48;
>  break;
>
>  case 56:
> -params->lb.f_hash = hash_default_key56;
> +params->lb.f_hash = rte_table_hash_crc_key56;
>  break;
>
>  case 64:
> -params->lb.f_hash = hash_default_key64;
> +params->lb.f_hash = rte_table_hash_crc_key64;
>  break;
>
>  default:
> diff --git a/examples/ip_pipeline/hash_func.h
> b/examples/ip_pipeline/hash_func.h
> deleted file mode 100644
> index f1b9d94..0000000
> --- a/examples/ip_pipeline/hash_func.h
> +++ /dev/null
> @@ -1,357 +0,0 @@
> -/* SPDX-License-Identifier: BSD-3-Clause
> - * Copyright(c) 2010-2018 Intel Corporation
> - */
> -
> -#ifndef __INCLUDE_HASH_FUNC_H__
> -#define __INCLUDE_HASH_FUNC_H__
> -
> -static inline uint64_t
> -hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0;
> -
> -xor0 = seed ^ (k[0] & m[0]);
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -
> -xor0 ^= k[2] & m[2];
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -
> -xor0 ^= xor1;
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -
> -xor0 ^= xor1;
> -
> -xor0 ^= k[4] & m[4];
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1, xor2;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
> -
> -xor0 ^= xor1;
> -
> -xor0 ^= xor2;
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1, xor2;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
> -
> -xor0 ^= xor1;
> -xor2 ^= k[6] & m[6];
> -
> -xor0 ^= xor2;
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1, xor2, xor3;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
> -xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
> -
> -xor0 ^= xor1;
> -xor2 ^= xor3;
> -
> -xor0 ^= xor2;
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -#if defined(RTE_ARCH_X86_64)
> -
> -#include <x86intrin.h>
> -
> -static inline uint64_t
> -hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t crc0;
> -
> -crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, crc0, crc1;
> -
> -k0 = k[0] & m[0];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, crc0, crc1;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc0 = _mm_crc32_u64(crc0, k2);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -
> -crc0 = _mm_crc32_u64(crc0, crc1);
> -crc1 = _mm_crc32_u64(crc2, crc3);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
> -
> -crc0 = _mm_crc32_u64(crc0, crc1);
> -crc1 = _mm_crc32_u64(crc2, crc3);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
> -
> -crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
> -crc1 = _mm_crc32_u64(crc3, k5);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
> -
> -crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
> -crc5 = k5 >> 32;
> -
> -crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
> -crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
> -
> -crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
> -crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
> -
> -crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
> -crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -#define hash_default_key8hash_crc_key8
> -#define hash_default_key16hash_crc_key16
> -#define hash_default_key24hash_crc_key24
> -#define hash_default_key32hash_crc_key32
> -#define hash_default_key40hash_crc_key40
> -#define hash_default_key48hash_crc_key48
> -#define hash_default_key56hash_crc_key56
> -#define hash_default_key64hash_crc_key64
> -
> -#elif defined(RTE_ARCH_ARM64)
> -#include "hash_func_arm64.h"
> -#else
> -
> -#define hash_default_key8hash_xor_key8
> -#define hash_default_key16hash_xor_key16
> -#define hash_default_key24hash_xor_key24
> -#define hash_default_key32hash_xor_key32
> -#define hash_default_key40hash_xor_key40
> -#define hash_default_key48hash_xor_key48
> -#define hash_default_key56hash_xor_key56
> -#define hash_default_key64hash_xor_key64
> -
> -#endif
> -
> -#endif
> diff --git a/examples/ip_pipeline/hash_func_arm64.h
> b/examples/ip_pipeline/hash_func_arm64.h
> deleted file mode 100644
> index 50df816..0000000
> --- a/examples/ip_pipeline/hash_func_arm64.h
> +++ /dev/null
> @@ -1,232 +0,0 @@
> -/* SPDX-License-Identifier: BSD-3-Clause
> - * Copyright(c) 2017-2018 Linaro Limited.
> - */
> -#ifndef __HASH_FUNC_ARM64_H__
> -#define __HASH_FUNC_ARM64_H__
> -
> -#define _CRC32CX(crc, val)\
> -__asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
> -
> -static inline uint64_t
> -hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint32_t crc0;
> -
> -crc0 = seed;
> -_CRC32CX(crc0, k[0] & m[0]);
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1;
> -
> -k0 = k[0] & m[0];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -_CRC32CX(crc0, k2);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -
> -_CRC32CX(crc0, crc1);
> -_CRC32CX(crc2, crc3);
> -
> -crc0 ^= crc2;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -_CRC32CX(crc3, k[4] & m[4]);
> -
> -_CRC32CX(crc0, crc1);
> -_CRC32CX(crc2, crc3);
> -
> -crc0 ^= crc2;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2, k5;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -_CRC32CX(crc3, k[4] & m[4]);
> -
> -_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
> -_CRC32CX(crc3, k5);
> -
> -crc0 ^= crc3;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2, k5;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -_CRC32CX(crc3, k[4] & m[4]);
> -
> -crc4 = k5;
> - _CRC32CX(crc4, k[6] & m[6]);
> -crc5 = k5 >> 32;
> -
> -_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
> -_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
> -
> -crc0 ^= crc3;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2, k5;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -_CRC32CX(crc3, k[4] & m[4]);
> -
> -crc4 = k5;
> - _CRC32CX(crc4, k[6] & m[6]);
> -crc5 = k5 >> 32;
> -_CRC32CX(crc5, k[7] & m[7]);
> -
> -_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
> -_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
> -
> -crc0 ^= crc3;
> -
> -return crc0;
> -}
> -
> -#define hash_default_key8hash_crc_key8
> -#define hash_default_key16hash_crc_key16
> -#define hash_default_key24hash_crc_key24
> -#define hash_default_key32hash_crc_key32
> -#define hash_default_key40hash_crc_key40
> -#define hash_default_key48hash_crc_key48
> -#define hash_default_key56hash_crc_key56
> -#define hash_default_key64hash_crc_key64
> -
> -#endif
> diff --git a/examples/ip_pipeline/pipeline.c
> b/examples/ip_pipeline/pipeline.c index 43fe867..b2fd215 100644
> --- a/examples/ip_pipeline/pipeline.c
> +++ b/examples/ip_pipeline/pipeline.c
> @@ -22,6 +22,7 @@
>  #include <rte_table_acl.h>
>  #include <rte_table_array.h>
>  #include <rte_table_hash.h>
> +#include <rte_table_hash_func.h>
>  #include <rte_table_lpm.h>
>  #include <rte_table_lpm_ipv6.h>
>  #include <rte_table_stub.h>
> @@ -36,8 +37,6 @@
>  #include "tmgr.h"
>  #include "swq.h"
>
> -#include "hash_func.h"
> -
>  #ifndef PIPELINE_MSGQ_SIZE
>  #define PIPELINE_MSGQ_SIZE                                 64
>  #endif
> @@ -818,28 +817,28 @@ pipeline_table_create(const char *pipeline_name,
>
>  switch (params->match.hash.key_size) {
>  case  8:
> -f_hash = hash_default_key8;
> +f_hash = rte_table_hash_crc_key8;
>  break;
>  case 16:
> -f_hash = hash_default_key16;
> +f_hash = rte_table_hash_crc_key16;
>  break;
>  case 24:
> -f_hash = hash_default_key24;
> +f_hash = rte_table_hash_crc_key24;
>  break;
>  case 32:
> -f_hash = hash_default_key32;
> +f_hash = rte_table_hash_crc_key32;
>  break;
>  case 40:
> -f_hash = hash_default_key40;
> +f_hash = rte_table_hash_crc_key40;
>  break;
>  case 48:
> -f_hash = hash_default_key48;
> +f_hash = rte_table_hash_crc_key48;
>  break;
>  case 56:
> -f_hash = hash_default_key56;
> +f_hash = rte_table_hash_crc_key56;
>  break;
>  case 64:
> -f_hash = hash_default_key64;
> +f_hash = rte_table_hash_crc_key64;
>  break;
>  default:
>  return -1;
> --
> 2.9.5

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/3] net/softnic: modify softnic to use librte_table headers
  2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 3/3] net/softnic: modify softnic " Kevin Laatz
@ 2018-09-07 10:20   ` Gavin Hu (Arm Technology China)
  0 siblings, 0 replies; 14+ messages in thread
From: Gavin Hu (Arm Technology China) @ 2018-09-07 10:20 UTC (permalink / raw)
  To: Kevin Laatz, dev; +Cc: cristian.dumitrescu, Jianbo Liu, jerin.jacob



> -----Original Message-----
> From: Kevin Laatz <kevin.laatz@intel.com>
> Sent: Friday, September 7, 2018 6:06 PM
> To: dev@dpdk.org
> Cc: cristian.dumitrescu@intel.com; Jianbo Liu <Jianbo.Liu@arm.com>; Gavin
> Hu (Arm Technology China) <Gavin.Hu@arm.com>;
> jerin.jacob@caviumnetworks.com; Kevin Laatz <kevin.laatz@intel.com>
> Subject: [PATCH v3 3/3] net/softnic: modify softnic to use librte_table
> headers
>
> This commit modifies SoftNIC to make use of the new header files in
> librte_table.
>
> As we are now using the new header files in librte_table in SoftNIC, we no
> longer need the old header files so they can be removed.
>
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Acked-by: Gavin Hu <gavin.hu@arm.com>
> ---
>  drivers/net/softnic/hash_func.h                | 359 -------------------------
>  drivers/net/softnic/hash_func_arm64.h          | 261 ------------------
>  drivers/net/softnic/rte_eth_softnic_action.c   |  34 +--
>  drivers/net/softnic/rte_eth_softnic_pipeline.c |  19 +-
>  4 files changed, 26 insertions(+), 647 deletions(-)  delete mode 100644
> drivers/net/softnic/hash_func.h  delete mode 100644
> drivers/net/softnic/hash_func_arm64.h
>
> diff --git a/drivers/net/softnic/hash_func.h
> b/drivers/net/softnic/hash_func.h deleted file mode 100644 index
> 198d2b2..0000000
> --- a/drivers/net/softnic/hash_func.h
> +++ /dev/null
> @@ -1,359 +0,0 @@
> -/* SPDX-License-Identifier: BSD-3-Clause
> - * Copyright(c) 2010-2018 Intel Corporation
> - */
> -
> -#ifndef __INCLUDE_HASH_FUNC_H__
> -#define __INCLUDE_HASH_FUNC_H__
> -
> -#include <rte_common.h>
> -
> -static inline uint64_t
> -hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0;
> -
> -xor0 = seed ^ (k[0] & m[0]);
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -
> -xor0 ^= k[2] & m[2];
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -
> -xor0 ^= xor1;
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -
> -xor0 ^= xor1;
> -
> -xor0 ^= k[4] & m[4];
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1, xor2;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
> -
> -xor0 ^= xor1;
> -
> -xor0 ^= xor2;
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1, xor2;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
> -
> -xor0 ^= xor1;
> -xor2 ^= k[6] & m[6];
> -
> -xor0 ^= xor2;
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -static inline uint64_t
> -hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t xor0, xor1, xor2, xor3;
> -
> -xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
> -xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
> -xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
> -xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
> -
> -xor0 ^= xor1;
> -xor2 ^= xor3;
> -
> -xor0 ^= xor2;
> -
> -return (xor0 >> 32) ^ xor0;
> -}
> -
> -#if defined(RTE_ARCH_X86_64)
> -
> -#include <x86intrin.h>
> -
> -static inline uint64_t
> -hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t crc0;
> -
> -crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, crc0, crc1;
> -
> -k0 = k[0] & m[0];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, crc0, crc1;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc0 = _mm_crc32_u64(crc0, k2);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -
> -crc0 = _mm_crc32_u64(crc0, crc1);
> -crc1 = _mm_crc32_u64(crc2, crc3);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
> -
> -crc0 = _mm_crc32_u64(crc0, crc1);
> -crc1 = _mm_crc32_u64(crc2, crc3);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
> -
> -crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
> -crc1 = _mm_crc32_u64(crc3, k5);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
> -
> -crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
> -crc5 = k5 >> 32;
> -
> -crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
> -crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = _mm_crc32_u64(k0, seed);
> -crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
> -
> -crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
> -crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
> -
> -crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
> -crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
> -
> -crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
> -crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -#define hash_default_key8hash_crc_key8
> -#define hash_default_key16hash_crc_key16
> -#define hash_default_key24hash_crc_key24
> -#define hash_default_key32hash_crc_key32
> -#define hash_default_key40hash_crc_key40
> -#define hash_default_key48hash_crc_key48
> -#define hash_default_key56hash_crc_key56
> -#define hash_default_key64hash_crc_key64
> -
> -#elif defined(RTE_ARCH_ARM64)
> -#include "hash_func_arm64.h"
> -#else
> -
> -#define hash_default_key8hash_xor_key8
> -#define hash_default_key16hash_xor_key16
> -#define hash_default_key24hash_xor_key24
> -#define hash_default_key32hash_xor_key32
> -#define hash_default_key40hash_xor_key40
> -#define hash_default_key48hash_xor_key48
> -#define hash_default_key56hash_xor_key56
> -#define hash_default_key64hash_xor_key64
> -
> -#endif
> -
> -#endif
> diff --git a/drivers/net/softnic/hash_func_arm64.h
> b/drivers/net/softnic/hash_func_arm64.h
> deleted file mode 100644
> index ae6c0f4..0000000
> --- a/drivers/net/softnic/hash_func_arm64.h
> +++ /dev/null
> @@ -1,261 +0,0 @@
> -/*-
> - *   BSD LICENSE
> - *
> - *   Copyright(c) 2017 Linaro Limited. All rights reserved.
> - *   All rights reserved.
> - *
> - *   Redistribution and use in source and binary forms, with or without
> - *   modification, are permitted provided that the following conditions
> - *   are met:
> - *
> - *     * Redistributions of source code must retain the above copyright
> - *       notice, this list of conditions and the following disclaimer.
> - *     * Redistributions in binary form must reproduce the above copyright
> - *       notice, this list of conditions and the following disclaimer in
> - *       the documentation and/or other materials provided with the
> - *       distribution.
> - *     * Neither the name of Intel Corporation nor the names of its
> - *       contributors may be used to endorse or promote products derived
> - *       from this software without specific prior written permission.
> - *
> - *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> - *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
> NOT
> - *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS FOR
> - *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> - *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> - *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> NOT
> - *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
> OF USE,
> - *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> AND ON ANY
> - *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> TORT
> - *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> THE USE
> - *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> - */
> -#ifndef __HASH_FUNC_ARM64_H__
> -#define __HASH_FUNC_ARM64_H__
> -
> -#define _CRC32CX(crc, val)\
> -__asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
> -
> -static inline uint64_t
> -hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key;
> -uint64_t *m = mask;
> -uint32_t crc0;
> -
> -crc0 = seed;
> -_CRC32CX(crc0, k[0] & m[0]);
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1;
> -
> -k0 = k[0] & m[0];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -_CRC32CX(crc0, k2);
> -
> -crc0 ^= crc1;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -
> -_CRC32CX(crc0, crc1);
> -_CRC32CX(crc2, crc3);
> -
> -crc0 ^= crc2;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -_CRC32CX(crc3, k[4] & m[4]);
> -
> -_CRC32CX(crc0, crc1);
> -_CRC32CX(crc2, crc3);
> -
> -crc0 ^= crc2;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2, k5;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -_CRC32CX(crc3, k[4] & m[4]);
> -
> -_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
> -_CRC32CX(crc3, k5);
> -
> -crc0 ^= crc3;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2, k5;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -_CRC32CX(crc3, k[4] & m[4]);
> -
> -crc4 = k5;
> - _CRC32CX(crc4, k[6] & m[6]);
> -crc5 = k5 >> 32;
> -
> -_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
> -_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
> -
> -crc0 ^= crc3;
> -
> -return crc0;
> -}
> -
> -static inline uint64_t
> -hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
> -uint64_t seed)
> -{
> -uint64_t *k = key, k0, k2, k5;
> -uint64_t *m = mask;
> -uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
> -
> -k0 = k[0] & m[0];
> -k2 = k[2] & m[2];
> -k5 = k[5] & m[5];
> -
> -crc0 = k0;
> -_CRC32CX(crc0, seed);
> -crc1 = k0 >> 32;
> -_CRC32CX(crc1, k[1] & m[1]);
> -
> -crc2 = k2;
> -_CRC32CX(crc2, k[3] & m[3]);
> -crc3 = k2 >> 32;
> -_CRC32CX(crc3, k[4] & m[4]);
> -
> -crc4 = k5;
> - _CRC32CX(crc4, k[6] & m[6]);
> -crc5 = k5 >> 32;
> -_CRC32CX(crc5, k[7] & m[7]);
> -
> -_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
> -_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
> -
> -crc0 ^= crc3;
> -
> -return crc0;
> -}
> -
> -#define hash_default_key8hash_crc_key8
> -#define hash_default_key16hash_crc_key16
> -#define hash_default_key24hash_crc_key24
> -#define hash_default_key32hash_crc_key32
> -#define hash_default_key40hash_crc_key40
> -#define hash_default_key48hash_crc_key48
> -#define hash_default_key56hash_crc_key56
> -#define hash_default_key64hash_crc_key64
> -
> -#endif
> diff --git a/drivers/net/softnic/rte_eth_softnic_action.c
> b/drivers/net/softnic/rte_eth_softnic_action.c
> index c25f4dd..c542688 100644
> --- a/drivers/net/softnic/rte_eth_softnic_action.c
> +++ b/drivers/net/softnic/rte_eth_softnic_action.c
> @@ -7,8 +7,8 @@
>  #include <string.h>
>
>  #include <rte_string_fns.h>
> +#include <rte_table_hash_func.h>
>
> -#include "hash_func.h"
>  #include "rte_eth_softnic_internals.h"
>
>  /**
> @@ -72,35 +72,35 @@ softnic_port_in_action_profile_create(struct
> pmd_internals *p,
>  params->lb.f_hash == NULL) {
>  switch (params->lb.key_size) {
>  case  8:
> -params->lb.f_hash = hash_default_key8;
> +params->lb.f_hash = rte_table_hash_crc_key8;
>  break;
>
>  case 16:
> -params->lb.f_hash = hash_default_key16;
> +params->lb.f_hash = rte_table_hash_crc_key16;
>  break;
>
>  case 24:
> -params->lb.f_hash = hash_default_key24;
> +params->lb.f_hash = rte_table_hash_crc_key24;
>  break;
>
>  case 32:
> -params->lb.f_hash = hash_default_key32;
> +params->lb.f_hash = rte_table_hash_crc_key32;
>  break;
>
>  case 40:
> -params->lb.f_hash = hash_default_key40;
> +params->lb.f_hash = rte_table_hash_crc_key40;
>  break;
>
>  case 48:
> -params->lb.f_hash = hash_default_key48;
> +params->lb.f_hash = rte_table_hash_crc_key48;
>  break;
>
>  case 56:
> -params->lb.f_hash = hash_default_key56;
> +params->lb.f_hash = rte_table_hash_crc_key56;
>  break;
>
>  case 64:
> -params->lb.f_hash = hash_default_key64;
> +params->lb.f_hash = rte_table_hash_crc_key64;
>  break;
>
>  default:
> @@ -223,35 +223,35 @@ softnic_table_action_profile_create(struct
> pmd_internals *p,
>  params->lb.f_hash == NULL) {
>  switch (params->lb.key_size) {
>  case 8:
> -params->lb.f_hash = hash_default_key8;
> +params->lb.f_hash = rte_table_hash_crc_key8;
>  break;
>
>  case 16:
> -params->lb.f_hash = hash_default_key16;
> +params->lb.f_hash = rte_table_hash_crc_key16;
>  break;
>
>  case 24:
> -params->lb.f_hash = hash_default_key24;
> +params->lb.f_hash = rte_table_hash_crc_key24;
>  break;
>
>  case 32:
> -params->lb.f_hash = hash_default_key32;
> +params->lb.f_hash = rte_table_hash_crc_key32;
>  break;
>
>  case 40:
> -params->lb.f_hash = hash_default_key40;
> +params->lb.f_hash = rte_table_hash_crc_key40;
>  break;
>
>  case 48:
> -params->lb.f_hash = hash_default_key48;
> +params->lb.f_hash = rte_table_hash_crc_key48;
>  break;
>
>  case 56:
> -params->lb.f_hash = hash_default_key56;
> +params->lb.f_hash = rte_table_hash_crc_key56;
>  break;
>
>  case 64:
> -params->lb.f_hash = hash_default_key64;
> +params->lb.f_hash = rte_table_hash_crc_key64;
>  break;
>
>  default:
> diff --git a/drivers/net/softnic/rte_eth_softnic_pipeline.c
> b/drivers/net/softnic/rte_eth_softnic_pipeline.c
> index 45136a4..0aababe 100644
> --- a/drivers/net/softnic/rte_eth_softnic_pipeline.c
> +++ b/drivers/net/softnic/rte_eth_softnic_pipeline.c
> @@ -19,14 +19,13 @@
>  #include <rte_table_acl.h>
>  #include <rte_table_array.h>
>  #include <rte_table_hash.h>
> +#include <rte_table_hash_func.h>
>  #include <rte_table_lpm.h>
>  #include <rte_table_lpm_ipv6.h>
>  #include <rte_table_stub.h>
>
>  #include "rte_eth_softnic_internals.h"
>
> -#include "hash_func.h"
> -
>  #ifndef PIPELINE_MSGQ_SIZE
>  #define PIPELINE_MSGQ_SIZE                                 64
>  #endif
> @@ -797,28 +796,28 @@ softnic_pipeline_table_create(struct
> pmd_internals *softnic,
>
>  switch (params->match.hash.key_size) {
>  case  8:
> -f_hash = hash_default_key8;
> +f_hash = rte_table_hash_crc_key8;
>  break;
>  case 16:
> -f_hash = hash_default_key16;
> +f_hash = rte_table_hash_crc_key16;
>  break;
>  case 24:
> -f_hash = hash_default_key24;
> +f_hash = rte_table_hash_crc_key24;
>  break;
>  case 32:
> -f_hash = hash_default_key32;
> +f_hash = rte_table_hash_crc_key32;
>  break;
>  case 40:
> -f_hash = hash_default_key40;
> +f_hash = rte_table_hash_crc_key40;
>  break;
>  case 48:
> -f_hash = hash_default_key48;
> +f_hash = rte_table_hash_crc_key48;
>  break;
>  case 56:
> -f_hash = hash_default_key56;
> +f_hash = rte_table_hash_crc_key56;
>  break;
>  case 64:
> -f_hash = hash_default_key64;
> +f_hash = rte_table_hash_crc_key64;
>  break;
>  default:
>  return -1;
> --
> 2.9.5

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files
  2018-09-07 10:06 [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Kevin Laatz
  2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 2/3] examples/ip_pipeline: modify application to use librte_table headers Kevin Laatz
  2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 3/3] net/softnic: modify softnic " Kevin Laatz
@ 2018-09-25  4:42 ` Jerin Jacob
  2018-09-25  9:15   ` Dumitrescu, Cristian
  2018-09-25 15:32 ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func " Kevin Laatz
  3 siblings, 1 reply; 14+ messages in thread
From: Jerin Jacob @ 2018-09-25  4:42 UTC (permalink / raw)
  To: Kevin Laatz; +Cc: dev, cristian.dumitrescu, jianbo.liu, gavin.hu

-----Original Message-----
> Date: Fri, 7 Sep 2018 11:06:24 +0100
> From: Kevin Laatz <kevin.laatz@intel.com>
> To: dev@dpdk.org
> CC: cristian.dumitrescu@intel.com, jianbo.liu@arm.com, gavin.hu@arm.com,
>  jerin.jacob@caviumnetworks.com, Kevin Laatz <kevin.laatz@intel.com>
> Subject: [PATCH v3 1/3] lib/librte_table: add hash_func header files
> X-Mailer: git-send-email 2.9.5
> 
> This commit adds rte_table_hash_func.h and rte_table_hash_func_arm64.h to
> librte_table. This reduces code duplication by removing duplicate header files
> within two folders and consolidating them into a single one. This also adds a
> scalar implementation of the x86_64 intrinsic for crc32 as a generic fallback.
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
> Acked-by: Gavin Hu <gavin.hu@arm.com>
> ---
> v2:
>    - Fixed typo in commit message
>    - Fixed typo in arm header that caused some compilations to fail for the
>      entire patchset
> v3:
>    - Improved commit message

ARM specific change and this patchset looks good. But, It has following
checkpatches.sh and check-git-log.sh errors.

➜ [master][dpdk.org] $ ./devtools/checkpatches.sh 

### lib/librte_table: add hash_func header files

WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description
(prefer a maximum 75 chars per line)
#7: 
librte_table. This reduces code duplication by removing duplicate header
files

total: 0 errors, 1 warnings, 298 lines checked
ERROR: symbol rte_crc32_u64_generic is added in a section other than the
EXPERIMENTAL section of the version map
ERROR: symbol rte_table_hash_crc_key16 is added in a section other than
the EXPERIMENTAL section of the version map
ERROR: symbol rte_table_hash_crc_key24 is added in a section other than
the EXPERIMENTAL section of the version map
ERROR: symbol rte_table_hash_crc_key32 is added in a section other than
the EXPERIMENTAL section of the version map
ERROR: symbol rte_table_hash_crc_key40 is added in a section other than
the EXPERIMENTAL section of the version map
ERROR: symbol rte_table_hash_crc_key48 is added in a section other than
the EXPERIMENTAL section of the version map
ERROR: symbol rte_table_hash_crc_key56 is added in a section other than
the EXPERIMENTAL section of the version map
ERROR: symbol rte_table_hash_crc_key64 is added in a section other than
the EXPERIMENTAL section of the version map
ERROR: symbol rte_table_hash_crc_key8 is added in a section other than
the EXPERIMENTAL section of the version map

2/3 valid patches
➜ [master][dpdk.org] $ ./devtools/check-git-log.sh 
Wrong headline format:
	lib/librte_table: add hash_func header files
	examples/ip_pipeline: modify application to use librte_table
headers
	net/softnic: modify softnic to use librte_table headers
Headline too long:
	examples/ip_pipeline: modify application to use librte_table
headers
Line too long:
	librte_table. This reduces code duplication by removing
duplicate header files
	within two folders and consolidating them into a single one.
This also adds a
	scalar implementation of the x86_64 intrinsic for crc32 as a
generic fallback.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files
  2018-09-25  4:42 ` [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Jerin Jacob
@ 2018-09-25  9:15   ` Dumitrescu, Cristian
  0 siblings, 0 replies; 14+ messages in thread
From: Dumitrescu, Cristian @ 2018-09-25  9:15 UTC (permalink / raw)
  To: Jerin Jacob, Laatz, Kevin; +Cc: dev, jianbo.liu, gavin.hu

> ARM specific change and this patchset looks good. But, It has following
> checkpatches.sh and check-git-log.sh errors.
> 

Thanks, Jerin, this looks like a map file issue, we'll work to fix it.

Regards,
Cristian

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func header files
  2018-09-07 10:06 [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Kevin Laatz
                   ` (2 preceding siblings ...)
  2018-09-25  4:42 ` [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Jerin Jacob
@ 2018-09-25 15:32 ` Kevin Laatz
  2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 2/3] examples/ip_pipeline: modify to use new table lib headers Kevin Laatz
                     ` (3 more replies)
  3 siblings, 4 replies; 14+ messages in thread
From: Kevin Laatz @ 2018-09-25 15:32 UTC (permalink / raw)
  To: dev; +Cc: jianbo.liu, gavin.hu, jerin.jacob, cristian.dumitrescu, Kevin Laatz

This commit adds rte_table_hash_func.h and rte_table_hash_func_arm64.h to
librte_table. This reduces code duplication by removing duplicate header
files within two folders and consolidating them into a single one. This
also adds a scalar implementation of the x86_64 intrinsic for crc32 as a
generic fallback.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Acked-by: Gavin Hu <gavin.hu@arm.com>
---
v2:
   - Fixed typo in commit message
   - Fixed typo in arm header that caused some compilations to fail for the
     entire patchset
v3:
   - Improved commit message

v4:
   - Fixed checkpatch.sh and check-git-log.sh errors
---
 lib/librte_table/Makefile                    |   2 +
 lib/librte_table/meson.build                 |   2 +
 lib/librte_table/rte_table_hash_func.h       | 245 +++++++++++++++++++++++++++
 lib/librte_table/rte_table_hash_func_arm64.h |  21 +++
 4 files changed, 270 insertions(+)
 create mode 100644 lib/librte_table/rte_table_hash_func.h
 create mode 100644 lib/librte_table/rte_table_hash_func_arm64.h

diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 276d476..f935678 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -46,6 +46,8 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_acl.h
 endif
 SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash.h
 SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash_cuckoo.h
+SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash_func.h
+SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash_func_arm64.h
 SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_lru.h
 ifeq ($(CONFIG_RTE_ARCH_X86),y)
 SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_lru_x86.h
diff --git a/lib/librte_table/meson.build b/lib/librte_table/meson.build
index 8b2f841..6ae3cd6 100644
--- a/lib/librte_table/meson.build
+++ b/lib/librte_table/meson.build
@@ -19,6 +19,8 @@ headers = files('rte_table.h',
 		'rte_table_lpm_ipv6.h',
 		'rte_table_hash.h',
 		'rte_table_hash_cuckoo.h',
+		'rte_table_hash_func.h',
+		'rte_table_hash_func_arm64.h',
 		'rte_lru.h',
 		'rte_table_array.h',
 		'rte_table_stub.h')
diff --git a/lib/librte_table/rte_table_hash_func.h b/lib/librte_table/rte_table_hash_func.h
new file mode 100644
index 0000000..02296ea
--- /dev/null
+++ b/lib/librte_table/rte_table_hash_func.h
@@ -0,0 +1,245 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2018 Intel Corporation
+ */
+
+#ifndef __INCLUDE_RTE_TABLE_HASH_FUNC_H__
+#define __INCLUDE_RTE_TABLE_HASH_FUNC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#include <rte_compat.h>
+#include <rte_common.h>
+
+static inline uint64_t __rte_experimental
+rte_crc32_u64_generic(uint64_t crc, uint64_t value)
+{
+	int i;
+
+	crc = (crc & 0xFFFFFFFFLLU) ^ value;
+	for (i = 63; i >= 0; i--) {
+		uint64_t mask;
+
+		mask = -(crc & 1LLU);
+		crc = (crc >> 1LLU) ^ (0x82F63B78LLU & mask);
+	}
+
+	return crc;
+}
+
+#if defined(RTE_ARCH_X86_64)
+
+#include <x86intrin.h>
+
+static inline uint64_t
+rte_crc32_u64(uint64_t crc, uint64_t v)
+{
+	return _mm_crc32_u64(crc, v);
+}
+
+#elif defined(RTE_ARCH_ARM64)
+#include "rte_table_hash_func_arm64.h"
+#else
+
+static inline uint64_t
+rte_crc32_u64(uint64_t crc, uint64_t v)
+{
+	return rte_crc32_u64_generic(crc, v);
+}
+
+#endif
+
+static inline uint64_t __rte_experimental
+rte_table_hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t crc0;
+
+	crc0 = rte_crc32_u64(seed, k[0] & m[0]);
+
+	return crc0;
+}
+
+static inline uint64_t __rte_experimental
+rte_table_hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, crc0, crc1;
+
+	k0 = k[0] & m[0];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t __rte_experimental
+rte_table_hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, crc0, crc1;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc0 = rte_crc32_u64(crc0, k2);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t __rte_experimental
+rte_table_hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, crc0, crc1, crc2, crc3;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = k2 >> 32;
+
+	crc0 = rte_crc32_u64(crc0, crc1);
+	crc1 = rte_crc32_u64(crc2, crc3);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t __rte_experimental
+rte_table_hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, crc0, crc1, crc2, crc3;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
+
+	crc0 = rte_crc32_u64(crc0, crc1);
+	crc1 = rte_crc32_u64(crc2, crc3);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t __rte_experimental
+rte_table_hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+	k5 = k[5] & m[5];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
+
+	crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
+	crc1 = rte_crc32_u64(crc3, k5);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t __rte_experimental
+rte_table_hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+	k5 = k[5] & m[5];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
+
+	crc4 = rte_crc32_u64(k5, k[6] & m[6]);
+	crc5 = k5 >> 32;
+
+	crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
+	crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+static inline uint64_t __rte_experimental
+rte_table_hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
+	uint64_t seed)
+{
+	uint64_t *k = key;
+	uint64_t *m = mask;
+	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
+
+	k0 = k[0] & m[0];
+	k2 = k[2] & m[2];
+	k5 = k[5] & m[5];
+
+	crc0 = rte_crc32_u64(k0, seed);
+	crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
+
+	crc2 = rte_crc32_u64(k2, k[3] & m[3]);
+	crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
+
+	crc4 = rte_crc32_u64(k5, k[6] & m[6]);
+	crc5 = rte_crc32_u64(k5 >> 32, k[7] & m[7]);
+
+	crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
+	crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5);
+
+	crc0 ^= crc1;
+
+	return crc0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/librte_table/rte_table_hash_func_arm64.h b/lib/librte_table/rte_table_hash_func_arm64.h
new file mode 100644
index 0000000..eb04c1f
--- /dev/null
+++ b/lib/librte_table/rte_table_hash_func_arm64.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2017-2018 Linaro Limited
+ */
+
+#ifndef __INCLUDE_RTE_TABLE_HASH_FUNC_ARM64_H__
+#define __INCLUDE_RTE_TABLE_HASH_FUNC_ARM64_H__
+
+#define _CRC32CX(crc, val)	\
+	__asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
+
+static inline uint64_t
+rte_crc32_u64(uint64_t crc, uint64_t v)
+{
+	uint32_t crc32 = crc;
+
+	_CRC32CX(crc32, v);
+
+	return crc32;
+}
+
+#endif
-- 
2.9.5

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH v4 2/3] examples/ip_pipeline: modify to use new table lib headers
  2018-09-25 15:32 ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func " Kevin Laatz
@ 2018-09-25 15:32   ` Kevin Laatz
  2018-09-25 16:27     ` Jerin Jacob
  2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 3/3] net/softnic: " Kevin Laatz
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 14+ messages in thread
From: Kevin Laatz @ 2018-09-25 15:32 UTC (permalink / raw)
  To: dev; +Cc: jianbo.liu, gavin.hu, jerin.jacob, cristian.dumitrescu, Kevin Laatz

This commit modifies the IP Pipeline application to use the new header
files in librte_table.

As we are now using the new header files, we can remove the old ones from
the application directory.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Acked-by: Gavin Hu <gavin.hu@arm.com>
---
 examples/ip_pipeline/action.c          |  34 ++--
 examples/ip_pipeline/hash_func.h       | 357 ---------------------------------
 examples/ip_pipeline/hash_func_arm64.h | 232 ---------------------
 examples/ip_pipeline/pipeline.c        |  19 +-
 4 files changed, 26 insertions(+), 616 deletions(-)
 delete mode 100644 examples/ip_pipeline/hash_func.h
 delete mode 100644 examples/ip_pipeline/hash_func_arm64.h

diff --git a/examples/ip_pipeline/action.c b/examples/ip_pipeline/action.c
index a29c2b3..20497c3 100644
--- a/examples/ip_pipeline/action.c
+++ b/examples/ip_pipeline/action.c
@@ -7,9 +7,9 @@
 #include <string.h>
 
 #include <rte_string_fns.h>
+#include <rte_table_hash_func.h>
 
 #include "action.h"
-#include "hash_func.h"
 
 /**
  * Input port
@@ -57,35 +57,35 @@ port_in_action_profile_create(const char *name,
 		(params->lb.f_hash == NULL)) {
 		switch (params->lb.key_size) {
 		case  8:
-			params->lb.f_hash = hash_default_key8;
+			params->lb.f_hash = rte_table_hash_crc_key8;
 			break;
 
 		case 16:
-			params->lb.f_hash = hash_default_key16;
+			params->lb.f_hash = rte_table_hash_crc_key16;
 			break;
 
 		case 24:
-			params->lb.f_hash = hash_default_key24;
+			params->lb.f_hash = rte_table_hash_crc_key24;
 			break;
 
 		case 32:
-			params->lb.f_hash = hash_default_key32;
+			params->lb.f_hash = rte_table_hash_crc_key32;
 			break;
 
 		case 40:
-			params->lb.f_hash = hash_default_key40;
+			params->lb.f_hash = rte_table_hash_crc_key40;
 			break;
 
 		case 48:
-			params->lb.f_hash = hash_default_key48;
+			params->lb.f_hash = rte_table_hash_crc_key48;
 			break;
 
 		case 56:
-			params->lb.f_hash = hash_default_key56;
+			params->lb.f_hash = rte_table_hash_crc_key56;
 			break;
 
 		case 64:
-			params->lb.f_hash = hash_default_key64;
+			params->lb.f_hash = rte_table_hash_crc_key64;
 			break;
 
 		default:
@@ -192,35 +192,35 @@ table_action_profile_create(const char *name,
 		(params->lb.f_hash == NULL)) {
 		switch (params->lb.key_size) {
 		case 8:
-			params->lb.f_hash = hash_default_key8;
+			params->lb.f_hash = rte_table_hash_crc_key8;
 			break;
 
 		case 16:
-			params->lb.f_hash = hash_default_key16;
+			params->lb.f_hash = rte_table_hash_crc_key16;
 			break;
 
 		case 24:
-			params->lb.f_hash = hash_default_key24;
+			params->lb.f_hash = rte_table_hash_crc_key24;
 			break;
 
 		case 32:
-			params->lb.f_hash = hash_default_key32;
+			params->lb.f_hash = rte_table_hash_crc_key32;
 			break;
 
 		case 40:
-			params->lb.f_hash = hash_default_key40;
+			params->lb.f_hash = rte_table_hash_crc_key40;
 			break;
 
 		case 48:
-			params->lb.f_hash = hash_default_key48;
+			params->lb.f_hash = rte_table_hash_crc_key48;
 			break;
 
 		case 56:
-			params->lb.f_hash = hash_default_key56;
+			params->lb.f_hash = rte_table_hash_crc_key56;
 			break;
 
 		case 64:
-			params->lb.f_hash = hash_default_key64;
+			params->lb.f_hash = rte_table_hash_crc_key64;
 			break;
 
 		default:
diff --git a/examples/ip_pipeline/hash_func.h b/examples/ip_pipeline/hash_func.h
deleted file mode 100644
index f1b9d94..0000000
--- a/examples/ip_pipeline/hash_func.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef __INCLUDE_HASH_FUNC_H__
-#define __INCLUDE_HASH_FUNC_H__
-
-static inline uint64_t
-hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = seed ^ (k[0] & m[0]);
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-
-	xor0 ^= k[2] & m[2];
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-
-	xor0 ^= xor1;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-
-	xor0 ^= xor1;
-
-	xor0 ^= k[4] & m[4];
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-
-	xor0 ^= xor1;
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-
-	xor0 ^= xor1;
-	xor2 ^= k[6] & m[6];
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2, xor3;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-	xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
-
-	xor0 ^= xor1;
-	xor2 ^= xor3;
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-#if defined(RTE_ARCH_X86_64)
-
-#include <x86intrin.h>
-
-static inline uint64_t
-hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t crc0;
-
-	crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, crc0, crc1;
-
-	k0 = k[0] & m[0];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc0 = _mm_crc32_u64(crc0, k2);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-
-	crc0 = _mm_crc32_u64(crc0, crc1);
-	crc1 = _mm_crc32_u64(crc2, crc3);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc0 = _mm_crc32_u64(crc0, crc1);
-	crc1 = _mm_crc32_u64(crc2, crc3);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, k5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
-	crc5 = k5 >> 32;
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
-	crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-#define hash_default_key8			hash_crc_key8
-#define hash_default_key16			hash_crc_key16
-#define hash_default_key24			hash_crc_key24
-#define hash_default_key32			hash_crc_key32
-#define hash_default_key40			hash_crc_key40
-#define hash_default_key48			hash_crc_key48
-#define hash_default_key56			hash_crc_key56
-#define hash_default_key64			hash_crc_key64
-
-#elif defined(RTE_ARCH_ARM64)
-#include "hash_func_arm64.h"
-#else
-
-#define hash_default_key8			hash_xor_key8
-#define hash_default_key16			hash_xor_key16
-#define hash_default_key24			hash_xor_key24
-#define hash_default_key32			hash_xor_key32
-#define hash_default_key40			hash_xor_key40
-#define hash_default_key48			hash_xor_key48
-#define hash_default_key56			hash_xor_key56
-#define hash_default_key64			hash_xor_key64
-
-#endif
-
-#endif
diff --git a/examples/ip_pipeline/hash_func_arm64.h b/examples/ip_pipeline/hash_func_arm64.h
deleted file mode 100644
index 50df816..0000000
--- a/examples/ip_pipeline/hash_func_arm64.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017-2018 Linaro Limited.
- */
-#ifndef __HASH_FUNC_ARM64_H__
-#define __HASH_FUNC_ARM64_H__
-
-#define _CRC32CX(crc, val)	\
-	__asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
-
-static inline uint64_t
-hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint32_t crc0;
-
-	crc0 = seed;
-	_CRC32CX(crc0, k[0] & m[0]);
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1;
-
-	k0 = k[0] & m[0];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	_CRC32CX(crc0, k2);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-
-	_CRC32CX(crc0, crc1);
-	_CRC32CX(crc2, crc3);
-
-	crc0 ^= crc2;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	_CRC32CX(crc0, crc1);
-	_CRC32CX(crc2, crc3);
-
-	crc0 ^= crc2;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, k5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	crc4 = k5;
-	 _CRC32CX(crc4, k[6] & m[6]);
-	crc5 = k5 >> 32;
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	crc4 = k5;
-	 _CRC32CX(crc4, k[6] & m[6]);
-	crc5 = k5 >> 32;
-	_CRC32CX(crc5, k[7] & m[7]);
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-#define hash_default_key8			hash_crc_key8
-#define hash_default_key16			hash_crc_key16
-#define hash_default_key24			hash_crc_key24
-#define hash_default_key32			hash_crc_key32
-#define hash_default_key40			hash_crc_key40
-#define hash_default_key48			hash_crc_key48
-#define hash_default_key56			hash_crc_key56
-#define hash_default_key64			hash_crc_key64
-
-#endif
diff --git a/examples/ip_pipeline/pipeline.c b/examples/ip_pipeline/pipeline.c
index 43fe867..b2fd215 100644
--- a/examples/ip_pipeline/pipeline.c
+++ b/examples/ip_pipeline/pipeline.c
@@ -22,6 +22,7 @@
 #include <rte_table_acl.h>
 #include <rte_table_array.h>
 #include <rte_table_hash.h>
+#include <rte_table_hash_func.h>
 #include <rte_table_lpm.h>
 #include <rte_table_lpm_ipv6.h>
 #include <rte_table_stub.h>
@@ -36,8 +37,6 @@
 #include "tmgr.h"
 #include "swq.h"
 
-#include "hash_func.h"
-
 #ifndef PIPELINE_MSGQ_SIZE
 #define PIPELINE_MSGQ_SIZE                                 64
 #endif
@@ -818,28 +817,28 @@ pipeline_table_create(const char *pipeline_name,
 
 		switch (params->match.hash.key_size) {
 		case  8:
-			f_hash = hash_default_key8;
+			f_hash = rte_table_hash_crc_key8;
 			break;
 		case 16:
-			f_hash = hash_default_key16;
+			f_hash = rte_table_hash_crc_key16;
 			break;
 		case 24:
-			f_hash = hash_default_key24;
+			f_hash = rte_table_hash_crc_key24;
 			break;
 		case 32:
-			f_hash = hash_default_key32;
+			f_hash = rte_table_hash_crc_key32;
 			break;
 		case 40:
-			f_hash = hash_default_key40;
+			f_hash = rte_table_hash_crc_key40;
 			break;
 		case 48:
-			f_hash = hash_default_key48;
+			f_hash = rte_table_hash_crc_key48;
 			break;
 		case 56:
-			f_hash = hash_default_key56;
+			f_hash = rte_table_hash_crc_key56;
 			break;
 		case 64:
-			f_hash = hash_default_key64;
+			f_hash = rte_table_hash_crc_key64;
 			break;
 		default:
 			return -1;
-- 
2.9.5

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH v4 3/3] net/softnic: modify to use new table lib headers
  2018-09-25 15:32 ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func " Kevin Laatz
  2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 2/3] examples/ip_pipeline: modify to use new table lib headers Kevin Laatz
@ 2018-09-25 15:32   ` Kevin Laatz
  2018-09-25 16:28     ` Jerin Jacob
  2018-09-25 16:25   ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func header files Jerin Jacob
  2018-09-28 10:34   ` Dumitrescu, Cristian
  3 siblings, 1 reply; 14+ messages in thread
From: Kevin Laatz @ 2018-09-25 15:32 UTC (permalink / raw)
  To: dev; +Cc: jianbo.liu, gavin.hu, jerin.jacob, cristian.dumitrescu, Kevin Laatz

This commit modifies SoftNIC to make use of the new header files in
librte_table.

As we are now using the new header files in librte_table in SoftNIC, we no
longer need the old header files so they can be removed.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Acked-by: Gavin Hu <gavin.hu@arm.com>
---
 drivers/net/softnic/hash_func.h                | 359 -------------------------
 drivers/net/softnic/hash_func_arm64.h          | 261 ------------------
 drivers/net/softnic/rte_eth_softnic_action.c   |  34 +--
 drivers/net/softnic/rte_eth_softnic_pipeline.c |  19 +-
 4 files changed, 26 insertions(+), 647 deletions(-)
 delete mode 100644 drivers/net/softnic/hash_func.h
 delete mode 100644 drivers/net/softnic/hash_func_arm64.h

diff --git a/drivers/net/softnic/hash_func.h b/drivers/net/softnic/hash_func.h
deleted file mode 100644
index 198d2b2..0000000
--- a/drivers/net/softnic/hash_func.h
+++ /dev/null
@@ -1,359 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef __INCLUDE_HASH_FUNC_H__
-#define __INCLUDE_HASH_FUNC_H__
-
-#include <rte_common.h>
-
-static inline uint64_t
-hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = seed ^ (k[0] & m[0]);
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-
-	xor0 ^= k[2] & m[2];
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-
-	xor0 ^= xor1;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-
-	xor0 ^= xor1;
-
-	xor0 ^= k[4] & m[4];
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-
-	xor0 ^= xor1;
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-
-	xor0 ^= xor1;
-	xor2 ^= k[6] & m[6];
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-static inline uint64_t
-hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t xor0, xor1, xor2, xor3;
-
-	xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
-	xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
-	xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
-	xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
-
-	xor0 ^= xor1;
-	xor2 ^= xor3;
-
-	xor0 ^= xor2;
-
-	return (xor0 >> 32) ^ xor0;
-}
-
-#if defined(RTE_ARCH_X86_64)
-
-#include <x86intrin.h>
-
-static inline uint64_t
-hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t crc0;
-
-	crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, crc0, crc1;
-
-	k0 = k[0] & m[0];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc0 = _mm_crc32_u64(crc0, k2);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-
-	crc0 = _mm_crc32_u64(crc0, crc1);
-	crc1 = _mm_crc32_u64(crc2, crc3);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc0 = _mm_crc32_u64(crc0, crc1);
-	crc1 = _mm_crc32_u64(crc2, crc3);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, k5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
-	crc5 = k5 >> 32;
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = _mm_crc32_u64(k0, seed);
-	crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
-
-	crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
-	crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
-
-	crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
-	crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
-
-	crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
-	crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-#define hash_default_key8			hash_crc_key8
-#define hash_default_key16			hash_crc_key16
-#define hash_default_key24			hash_crc_key24
-#define hash_default_key32			hash_crc_key32
-#define hash_default_key40			hash_crc_key40
-#define hash_default_key48			hash_crc_key48
-#define hash_default_key56			hash_crc_key56
-#define hash_default_key64			hash_crc_key64
-
-#elif defined(RTE_ARCH_ARM64)
-#include "hash_func_arm64.h"
-#else
-
-#define hash_default_key8			hash_xor_key8
-#define hash_default_key16			hash_xor_key16
-#define hash_default_key24			hash_xor_key24
-#define hash_default_key32			hash_xor_key32
-#define hash_default_key40			hash_xor_key40
-#define hash_default_key48			hash_xor_key48
-#define hash_default_key56			hash_xor_key56
-#define hash_default_key64			hash_xor_key64
-
-#endif
-
-#endif
diff --git a/drivers/net/softnic/hash_func_arm64.h b/drivers/net/softnic/hash_func_arm64.h
deleted file mode 100644
index ae6c0f4..0000000
--- a/drivers/net/softnic/hash_func_arm64.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2017 Linaro Limited. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __HASH_FUNC_ARM64_H__
-#define __HASH_FUNC_ARM64_H__
-
-#define _CRC32CX(crc, val)	\
-	__asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
-
-static inline uint64_t
-hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key;
-	uint64_t *m = mask;
-	uint32_t crc0;
-
-	crc0 = seed;
-	_CRC32CX(crc0, k[0] & m[0]);
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1;
-
-	k0 = k[0] & m[0];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	_CRC32CX(crc0, k2);
-
-	crc0 ^= crc1;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-
-	_CRC32CX(crc0, crc1);
-	_CRC32CX(crc2, crc3);
-
-	crc0 ^= crc2;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	_CRC32CX(crc0, crc1);
-	_CRC32CX(crc2, crc3);
-
-	crc0 ^= crc2;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, k5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	crc4 = k5;
-	 _CRC32CX(crc4, k[6] & m[6]);
-	crc5 = k5 >> 32;
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-static inline uint64_t
-hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
-	uint64_t seed)
-{
-	uint64_t *k = key, k0, k2, k5;
-	uint64_t *m = mask;
-	uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
-
-	k0 = k[0] & m[0];
-	k2 = k[2] & m[2];
-	k5 = k[5] & m[5];
-
-	crc0 = k0;
-	_CRC32CX(crc0, seed);
-	crc1 = k0 >> 32;
-	_CRC32CX(crc1, k[1] & m[1]);
-
-	crc2 = k2;
-	_CRC32CX(crc2, k[3] & m[3]);
-	crc3 = k2 >> 32;
-	_CRC32CX(crc3, k[4] & m[4]);
-
-	crc4 = k5;
-	 _CRC32CX(crc4, k[6] & m[6]);
-	crc5 = k5 >> 32;
-	_CRC32CX(crc5, k[7] & m[7]);
-
-	_CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
-	_CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
-
-	crc0 ^= crc3;
-
-	return crc0;
-}
-
-#define hash_default_key8			hash_crc_key8
-#define hash_default_key16			hash_crc_key16
-#define hash_default_key24			hash_crc_key24
-#define hash_default_key32			hash_crc_key32
-#define hash_default_key40			hash_crc_key40
-#define hash_default_key48			hash_crc_key48
-#define hash_default_key56			hash_crc_key56
-#define hash_default_key64			hash_crc_key64
-
-#endif
diff --git a/drivers/net/softnic/rte_eth_softnic_action.c b/drivers/net/softnic/rte_eth_softnic_action.c
index c25f4dd..c542688 100644
--- a/drivers/net/softnic/rte_eth_softnic_action.c
+++ b/drivers/net/softnic/rte_eth_softnic_action.c
@@ -7,8 +7,8 @@
 #include <string.h>
 
 #include <rte_string_fns.h>
+#include <rte_table_hash_func.h>
 
-#include "hash_func.h"
 #include "rte_eth_softnic_internals.h"
 
 /**
@@ -72,35 +72,35 @@ softnic_port_in_action_profile_create(struct pmd_internals *p,
 		params->lb.f_hash == NULL) {
 		switch (params->lb.key_size) {
 		case  8:
-			params->lb.f_hash = hash_default_key8;
+			params->lb.f_hash = rte_table_hash_crc_key8;
 			break;
 
 		case 16:
-			params->lb.f_hash = hash_default_key16;
+			params->lb.f_hash = rte_table_hash_crc_key16;
 			break;
 
 		case 24:
-			params->lb.f_hash = hash_default_key24;
+			params->lb.f_hash = rte_table_hash_crc_key24;
 			break;
 
 		case 32:
-			params->lb.f_hash = hash_default_key32;
+			params->lb.f_hash = rte_table_hash_crc_key32;
 			break;
 
 		case 40:
-			params->lb.f_hash = hash_default_key40;
+			params->lb.f_hash = rte_table_hash_crc_key40;
 			break;
 
 		case 48:
-			params->lb.f_hash = hash_default_key48;
+			params->lb.f_hash = rte_table_hash_crc_key48;
 			break;
 
 		case 56:
-			params->lb.f_hash = hash_default_key56;
+			params->lb.f_hash = rte_table_hash_crc_key56;
 			break;
 
 		case 64:
-			params->lb.f_hash = hash_default_key64;
+			params->lb.f_hash = rte_table_hash_crc_key64;
 			break;
 
 		default:
@@ -223,35 +223,35 @@ softnic_table_action_profile_create(struct pmd_internals *p,
 		params->lb.f_hash == NULL) {
 		switch (params->lb.key_size) {
 		case 8:
-			params->lb.f_hash = hash_default_key8;
+			params->lb.f_hash = rte_table_hash_crc_key8;
 			break;
 
 		case 16:
-			params->lb.f_hash = hash_default_key16;
+			params->lb.f_hash = rte_table_hash_crc_key16;
 			break;
 
 		case 24:
-			params->lb.f_hash = hash_default_key24;
+			params->lb.f_hash = rte_table_hash_crc_key24;
 			break;
 
 		case 32:
-			params->lb.f_hash = hash_default_key32;
+			params->lb.f_hash = rte_table_hash_crc_key32;
 			break;
 
 		case 40:
-			params->lb.f_hash = hash_default_key40;
+			params->lb.f_hash = rte_table_hash_crc_key40;
 			break;
 
 		case 48:
-			params->lb.f_hash = hash_default_key48;
+			params->lb.f_hash = rte_table_hash_crc_key48;
 			break;
 
 		case 56:
-			params->lb.f_hash = hash_default_key56;
+			params->lb.f_hash = rte_table_hash_crc_key56;
 			break;
 
 		case 64:
-			params->lb.f_hash = hash_default_key64;
+			params->lb.f_hash = rte_table_hash_crc_key64;
 			break;
 
 		default:
diff --git a/drivers/net/softnic/rte_eth_softnic_pipeline.c b/drivers/net/softnic/rte_eth_softnic_pipeline.c
index 45136a4..0aababe 100644
--- a/drivers/net/softnic/rte_eth_softnic_pipeline.c
+++ b/drivers/net/softnic/rte_eth_softnic_pipeline.c
@@ -19,14 +19,13 @@
 #include <rte_table_acl.h>
 #include <rte_table_array.h>
 #include <rte_table_hash.h>
+#include <rte_table_hash_func.h>
 #include <rte_table_lpm.h>
 #include <rte_table_lpm_ipv6.h>
 #include <rte_table_stub.h>
 
 #include "rte_eth_softnic_internals.h"
 
-#include "hash_func.h"
-
 #ifndef PIPELINE_MSGQ_SIZE
 #define PIPELINE_MSGQ_SIZE                                 64
 #endif
@@ -797,28 +796,28 @@ softnic_pipeline_table_create(struct pmd_internals *softnic,
 
 		switch (params->match.hash.key_size) {
 		case  8:
-			f_hash = hash_default_key8;
+			f_hash = rte_table_hash_crc_key8;
 			break;
 		case 16:
-			f_hash = hash_default_key16;
+			f_hash = rte_table_hash_crc_key16;
 			break;
 		case 24:
-			f_hash = hash_default_key24;
+			f_hash = rte_table_hash_crc_key24;
 			break;
 		case 32:
-			f_hash = hash_default_key32;
+			f_hash = rte_table_hash_crc_key32;
 			break;
 		case 40:
-			f_hash = hash_default_key40;
+			f_hash = rte_table_hash_crc_key40;
 			break;
 		case 48:
-			f_hash = hash_default_key48;
+			f_hash = rte_table_hash_crc_key48;
 			break;
 		case 56:
-			f_hash = hash_default_key56;
+			f_hash = rte_table_hash_crc_key56;
 			break;
 		case 64:
-			f_hash = hash_default_key64;
+			f_hash = rte_table_hash_crc_key64;
 			break;
 		default:
 			return -1;
-- 
2.9.5

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func header files
  2018-09-25 15:32 ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func " Kevin Laatz
  2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 2/3] examples/ip_pipeline: modify to use new table lib headers Kevin Laatz
  2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 3/3] net/softnic: " Kevin Laatz
@ 2018-09-25 16:25   ` Jerin Jacob
  2018-09-28 10:34   ` Dumitrescu, Cristian
  3 siblings, 0 replies; 14+ messages in thread
From: Jerin Jacob @ 2018-09-25 16:25 UTC (permalink / raw)
  To: Kevin Laatz; +Cc: dev, jianbo.liu, gavin.hu, cristian.dumitrescu

-----Original Message-----
> Date: Tue, 25 Sep 2018 16:32:28 +0100
> From: Kevin Laatz <kevin.laatz@intel.com>
> To: dev@dpdk.org
> CC: jianbo.liu@arm.com, gavin.hu@arm.com, jerin.jacob@caviumnetworks.com,
>  cristian.dumitrescu@intel.com, Kevin Laatz <kevin.laatz@intel.com>
> Subject: [PATCH v4 1/3] lib/librte_table: add hash func header files
> X-Mailer: git-send-email 2.9.5
> 
> External Email
> 
> This commit adds rte_table_hash_func.h and rte_table_hash_func_arm64.h to
> librte_table. This reduces code duplication by removing duplicate header
> files within two folders and consolidating them into a single one. This
> also adds a scalar implementation of the x86_64 intrinsic for crc32 as a
> generic fallback.
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
> Acked-by: Gavin Hu <gavin.hu@arm.com>
> ---
> v2:
>    - Fixed typo in commit message
>    - Fixed typo in arm header that caused some compilations to fail for the
>      entire patchset
> v3:
>    - Improved commit message
> 
> v4:
>    - Fixed checkpatch.sh and check-git-log.sh errors

Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH v4 2/3] examples/ip_pipeline: modify to use new table lib headers
  2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 2/3] examples/ip_pipeline: modify to use new table lib headers Kevin Laatz
@ 2018-09-25 16:27     ` Jerin Jacob
  0 siblings, 0 replies; 14+ messages in thread
From: Jerin Jacob @ 2018-09-25 16:27 UTC (permalink / raw)
  To: Kevin Laatz; +Cc: dev, jianbo.liu, gavin.hu, cristian.dumitrescu

-----Original Message-----
> Date: Tue, 25 Sep 2018 16:32:29 +0100
> From: Kevin Laatz <kevin.laatz@intel.com>
> To: dev@dpdk.org
> CC: jianbo.liu@arm.com, gavin.hu@arm.com, jerin.jacob@caviumnetworks.com,
>  cristian.dumitrescu@intel.com, Kevin Laatz <kevin.laatz@intel.com>
> Subject: [PATCH v4 2/3] examples/ip_pipeline: modify to use new table lib
>  headers
> X-Mailer: git-send-email 2.9.5
> 
> This commit modifies the IP Pipeline application to use the new header
> files in librte_table.
> 
> As we are now using the new header files, we can remove the old ones from
> the application directory.
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
> Acked-by: Gavin Hu <gavin.hu@arm.com>

Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH v4 3/3] net/softnic: modify to use new table lib headers
  2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 3/3] net/softnic: " Kevin Laatz
@ 2018-09-25 16:28     ` Jerin Jacob
  0 siblings, 0 replies; 14+ messages in thread
From: Jerin Jacob @ 2018-09-25 16:28 UTC (permalink / raw)
  To: Kevin Laatz; +Cc: dev, jianbo.liu, gavin.hu, cristian.dumitrescu

-----Original Message-----
> Date: Tue, 25 Sep 2018 16:32:30 +0100
> From: Kevin Laatz <kevin.laatz@intel.com>
> To: dev@dpdk.org
> CC: jianbo.liu@arm.com, gavin.hu@arm.com, jerin.jacob@caviumnetworks.com,
>  cristian.dumitrescu@intel.com, Kevin Laatz <kevin.laatz@intel.com>
> Subject: [PATCH v4 3/3] net/softnic: modify to use new table lib headers
> X-Mailer: git-send-email 2.9.5
> 
> 
> This commit modifies SoftNIC to make use of the new header files in
> librte_table.
> 
> As we are now using the new header files in librte_table in SoftNIC, we no
> longer need the old header files so they can be removed.
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
> Acked-by: Gavin Hu <gavin.hu@arm.com>

Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func header files
  2018-09-25 15:32 ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func " Kevin Laatz
                     ` (2 preceding siblings ...)
  2018-09-25 16:25   ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func header files Jerin Jacob
@ 2018-09-28 10:34   ` Dumitrescu, Cristian
  3 siblings, 0 replies; 14+ messages in thread
From: Dumitrescu, Cristian @ 2018-09-28 10:34 UTC (permalink / raw)
  To: Laatz, Kevin, dev; +Cc: jianbo.liu, gavin.hu, jerin.jacob



> -----Original Message-----
> From: Laatz, Kevin
> Sent: Tuesday, September 25, 2018 4:32 PM
> To: dev@dpdk.org
> Cc: jianbo.liu@arm.com; gavin.hu@arm.com;
> jerin.jacob@caviumnetworks.com; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; Laatz, Kevin <kevin.laatz@intel.com>
> Subject: [PATCH v4 1/3] lib/librte_table: add hash func header files
> 
> This commit adds rte_table_hash_func.h and rte_table_hash_func_arm64.h
> to
> librte_table. This reduces code duplication by removing duplicate header
> files within two folders and consolidating them into a single one. This
> also adds a scalar implementation of the x86_64 intrinsic for crc32 as a
> generic fallback.
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
> Acked-by: Gavin Hu <gavin.hu@arm.com>
> ---

Patchset applied to next-pipeline tree, thanks!

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2018-09-28 10:34 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-07 10:06 [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Kevin Laatz
2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 2/3] examples/ip_pipeline: modify application to use librte_table headers Kevin Laatz
2018-09-07 10:20   ` Gavin Hu (Arm Technology China)
2018-09-07 10:06 ` [dpdk-dev] [PATCH v3 3/3] net/softnic: modify softnic " Kevin Laatz
2018-09-07 10:20   ` Gavin Hu (Arm Technology China)
2018-09-25  4:42 ` [dpdk-dev] [PATCH v3 1/3] lib/librte_table: add hash_func header files Jerin Jacob
2018-09-25  9:15   ` Dumitrescu, Cristian
2018-09-25 15:32 ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func " Kevin Laatz
2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 2/3] examples/ip_pipeline: modify to use new table lib headers Kevin Laatz
2018-09-25 16:27     ` Jerin Jacob
2018-09-25 15:32   ` [dpdk-dev] [PATCH v4 3/3] net/softnic: " Kevin Laatz
2018-09-25 16:28     ` Jerin Jacob
2018-09-25 16:25   ` [dpdk-dev] [PATCH v4 1/3] lib/librte_table: add hash func header files Jerin Jacob
2018-09-28 10:34   ` Dumitrescu, Cristian

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).