acl-plugin: tm: avoid hash calculation dependency on a memory store operation 77/13177/8
authorAndrew Yourtchenko <ayourtch@gmail.com>
Thu, 21 Jun 2018 11:45:37 +0000 (13:45 +0200)
committerDave Barach <openvpp@barachs.net>
Wed, 27 Jun 2018 11:46:50 +0000 (11:46 +0000)
A small store into a middle of a larger structure that was subsequently
loaded for calculating the bihash key was noticeably impacting the performance.

Change-Id: If7f33e1b66e8b438ba7cc91abc0ca749850c6e45
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
src/plugins/acl/public_inlines.h

index ca42519..576d081 100644 (file)
@@ -605,7 +605,15 @@ multi_acl_match_get_applied_ace_index (acl_main_t * am, int is_ip6, fa_5tuple_t
       *pkey++ = *pmatch++ & *pmask++;
       *pkey++ = *pmatch++ & *pmask++;
 
-      kv_key->pkt.mask_type_index_lsb = mask_type_index;
+      /*
+       * The use of temporary variable convinces the compiler
+       * to make a u64 write, avoiding the stall on crc32 operation
+       * just a bit later.
+       */
+      fa_packet_info_t tmp_pkt = kv_key->pkt;
+      tmp_pkt.mask_type_index_lsb = mask_type_index;
+      kv_key->pkt.as_u64 = tmp_pkt.as_u64;
+
       int res =
        clib_bihash_search_inline_2_48_8 (&am->acl_lookup_hash, &kv, &result);