Use crc32 wrapper (VPP-1086) 54/9854/2
authorGabriel Ganne <gabriel.ganne@enea.com>
Thu, 14 Dec 2017 15:20:37 +0000 (16:20 +0100)
committerDamjan Marion <dmarion.lists@gmail.com>
Sat, 16 Dec 2017 19:32:25 +0000 (19:32 +0000)
This allows arm platforms to also take advantage of crc32 hardware
acceleration.

* add a wrapper for crc32_u64. It's the only one really used. Using it
  instead of a call to clib_crc32c() eases building symmetrical hash
  functions.
* replace #ifdef on SSE4 by a test on clib_crc32c_uses_intrinsics.
  Note: keep the test on i386
* fix typo in lb test log

Change-Id: I03a0897b70f6c1717e6901d93cf0fe024d5facb5
Signed-off-by: Gabriel Ganne <gabriel.ganne@enea.com>
src/plugins/lb/lbhash.h
src/vnet/bfd/bfd_main.c
src/vppinfra/crc32.h
src/vppinfra/cuckoo_8_8.h
test/test_lb.py

index c514fb5..10d3bea 100644 (file)
@@ -101,16 +101,16 @@ void lb_hash_free(lb_hash_t *h)
   vec_free(mem);
 }
 
-#if __SSE4_2__ && !defined (__i386__)
+#if defined(clib_crc32c_uses_intrinsics) && !defined (__i386__)
 static_always_inline
 u32 lb_hash_hash(u64 k0, u64 k1, u64 k2, u64 k3, u64 k4)
 {
   u64 val = 0;
-  val = _mm_crc32_u64(val, k0);
-  val = _mm_crc32_u64(val, k1);
-  val = _mm_crc32_u64(val, k2);
-  val = _mm_crc32_u64(val, k3);
-  val = _mm_crc32_u64(val, k4);
+  val = crc32_u64(val, k0);
+  val = crc32_u64(val, k1);
+  val = crc32_u64(val, k2);
+  val = crc32_u64(val, k3);
+  val = crc32_u64(val, k4);
   return (u32) val;
 }
 #else
index 5d1c540..668a44e 100644 (file)
@@ -39,10 +39,10 @@ static u64
 bfd_calc_echo_checksum (u32 discriminator, u64 expire_time, u32 secret)
 {
   u64 checksum = 0;
-#if __SSE4_2__ && !defined (__i386__)
-  checksum = _mm_crc32_u64 (0, discriminator);
-  checksum = _mm_crc32_u64 (checksum, expire_time);
-  checksum = _mm_crc32_u64 (checksum, secret);
+#if defined(clib_crc32c_uses_intrinsics) && !defined (__i386__)
+  checksum = crc32_u64 (0, discriminator);
+  checksum = crc32_u64 (checksum, expire_time);
+  checksum = crc32_u64 (checksum, secret);
 #else
   checksum = clib_xxhash (discriminator ^ expire_time ^ secret);
 #endif
index 242278f..340b539 100644 (file)
@@ -22,6 +22,8 @@
 #define clib_crc32c_uses_intrinsics
 #include <x86intrin.h>
 
+#define crc32_u64 _mm_crc32_u64
+
 static_always_inline u32
 clib_crc32c (u8 * s, int len)
 {
@@ -52,6 +54,9 @@ clib_crc32c (u8 * s, int len)
 #define clib_crc32c_uses_intrinsics
 #include <arm_acle.h>
 
+
+#define crc32_u64 __crc32cd
+
 static_always_inline u32
 clib_crc32c (u8 * s, int len)
 {
index 608cb0e..6fe334d 100644 (file)
@@ -91,8 +91,8 @@ format_cuckoo_kvp_8_8 (u8 * s, va_list * args)
 always_inline u64
 clib_cuckoo_hash_8_8 (clib_cuckoo_kv_8_8_t * v)
 {
-#if __SSE4_2__ && !defined (__i386__)
-  return _mm_crc32_u64 (0, v->key);
+#if defined(clib_crc32c_uses_intrinsics) && !defined (__i386__)
+  return crc32_u64 (0, v->key);
 #else
   return clib_xxhash (v->key);
 #endif
index ab9a209..e653b60 100644 (file)
@@ -142,7 +142,7 @@ class TestLB(VppTestCase):
         # is not completly biased.
         for asid in self.ass:
             if load[asid] < len(self.packets) / (len(self.ass) * 2):
-                self.log(
+                self.logger.error(
                     "ASS is not balanced: load[%d] = %d" % (asid, load[asid]))
                 raise Exception("Load Balancer algorithm is biased")