vnet: disable the expansion of the heap allocated for classifier tables
[vpp.git] / src / vnet / classify / vnet_classify.c
index 9d8694a..d8a5a45 100644 (file)
@@ -128,10 +128,10 @@ vnet_classify_new_table (vnet_classify_main_t * cm,
   nbuckets = 1 << (max_log2 (nbuckets));
 
   pool_get_aligned (cm->tables, t, CLIB_CACHE_LINE_BYTES);
-  memset (t, 0, sizeof (*t));
+  clib_memset (t, 0, sizeof (*t));
 
   vec_validate_aligned (t->mask, match_n_vectors - 1, sizeof (u32x4));
-  clib_memcpy (t->mask, mask, match_n_vectors * sizeof (u32x4));
+  clib_memcpy_fast (t->mask, mask, match_n_vectors * sizeof (u32x4));
 
   t->next_table_index = ~0;
   t->nbuckets = nbuckets;
@@ -144,6 +144,8 @@ vnet_classify_new_table (vnet_classify_main_t * cm,
   t->mheap = mheap_alloc (0 /* use VM */ , memory_size);
 #else
   t->mheap = create_mspace (memory_size, 1 /* locked */ );
+  /* classifier requires the memory to be contiguous, so can not expand. */
+  mspace_disable_expand (t->mheap);
 #endif
 
   vec_validate_aligned (t->buckets, nbuckets - 1, CLIB_CACHE_LINE_BYTES);
@@ -211,7 +213,7 @@ vnet_classify_entry_alloc (vnet_classify_table_t * t, u32 log2_pages)
 initialize:
   ASSERT (rv);
 
-  memset (rv, 0xff, required_length);
+  clib_memset (rv, 0xff, required_length);
   return rv;
 }
 
@@ -273,7 +275,7 @@ static inline void make_working_copy
 
   v = vnet_classify_get_entry (t, b->offset);
 
-  clib_memcpy (working_copy, v, required_length);
+  clib_memcpy_fast (working_copy, v, required_length);
 
   working_bucket.as_u64 = b->as_u64;
   working_bucket.offset = vnet_classify_get_offset (t, working_copy);
@@ -317,8 +319,8 @@ split_and_rehash (vnet_classify_table_t * t,
 
              if (vnet_classify_entry_is_free (new_v))
                {
-                 clib_memcpy (new_v, v, sizeof (vnet_classify_entry_t)
-                              + (t->match_n_vectors * sizeof (u32x4)));
+                 clib_memcpy_fast (new_v, v, sizeof (vnet_classify_entry_t)
+                                   + (t->match_n_vectors * sizeof (u32x4)));
                  new_v->flags &= ~(VNET_CLASSIFY_ENTRY_FREE);
                  goto doublebreak;
                }
@@ -361,8 +363,8 @@ split_and_rehash_linear (vnet_classify_table_t * t,
                  clib_warning ("BUG: linear rehash new entry not free!");
                  continue;
                }
-             clib_memcpy (new_v, v, sizeof (vnet_classify_entry_t)
-                          + (t->match_n_vectors * sizeof (u32x4)));
+             clib_memcpy_fast (new_v, v, sizeof (vnet_classify_entry_t)
+                               + (t->match_n_vectors * sizeof (u32x4)));
              new_v->flags &= ~(VNET_CLASSIFY_ENTRY_FREE);
              j++;
              goto doublebreak;
@@ -444,7 +446,7 @@ vnet_classify_add_del (vnet_classify_table_t * t,
 
   hash >>= t->log2_nbuckets;
 
-  while (__sync_lock_test_and_set (t->writer_lock, 1))
+  while (clib_atomic_test_and_set (t->writer_lock))
     ;
 
   /* First elt in the bucket? */
@@ -457,8 +459,8 @@ vnet_classify_add_del (vnet_classify_table_t * t,
        }
 
       v = vnet_classify_entry_alloc (t, 0 /* new_log2_pages */ );
-      clib_memcpy (v, add_v, sizeof (vnet_classify_entry_t) +
-                  t->match_n_vectors * sizeof (u32x4));
+      clib_memcpy_fast (v, add_v, sizeof (vnet_classify_entry_t) +
+                       t->match_n_vectors * sizeof (u32x4));
       v->flags &= ~(VNET_CLASSIFY_ENTRY_FREE);
       vnet_classify_entry_claim_resource (v);
 
@@ -496,8 +498,8 @@ vnet_classify_add_del (vnet_classify_table_t * t,
          if (!memcmp
              (v->key, add_v->key, t->match_n_vectors * sizeof (u32x4)))
            {
-             clib_memcpy (v, add_v, sizeof (vnet_classify_entry_t) +
-                          t->match_n_vectors * sizeof (u32x4));
+             clib_memcpy_fast (v, add_v, sizeof (vnet_classify_entry_t) +
+                               t->match_n_vectors * sizeof (u32x4));
              v->flags &= ~(VNET_CLASSIFY_ENTRY_FREE);
              vnet_classify_entry_claim_resource (v);
 
@@ -513,8 +515,8 @@ vnet_classify_add_del (vnet_classify_table_t * t,
 
          if (vnet_classify_entry_is_free (v))
            {
-             clib_memcpy (v, add_v, sizeof (vnet_classify_entry_t) +
-                          t->match_n_vectors * sizeof (u32x4));
+             clib_memcpy_fast (v, add_v, sizeof (vnet_classify_entry_t) +
+                               t->match_n_vectors * sizeof (u32x4));
              v->flags &= ~(VNET_CLASSIFY_ENTRY_FREE);
              vnet_classify_entry_claim_resource (v);
 
@@ -536,8 +538,8 @@ vnet_classify_add_del (vnet_classify_table_t * t,
              (v->key, add_v->key, t->match_n_vectors * sizeof (u32x4)))
            {
              vnet_classify_entry_release_resource (v);
-             memset (v, 0xff, sizeof (vnet_classify_entry_t) +
-                     t->match_n_vectors * sizeof (u32x4));
+             clib_memset (v, 0xff, sizeof (vnet_classify_entry_t) +
+                          t->match_n_vectors * sizeof (u32x4));
              v->flags |= VNET_CLASSIFY_ENTRY_FREE;
 
              CLIB_MEMORY_BARRIER ();
@@ -609,8 +611,8 @@ vnet_classify_add_del (vnet_classify_table_t * t,
 
       if (vnet_classify_entry_is_free (new_v))
        {
-         clib_memcpy (new_v, add_v, sizeof (vnet_classify_entry_t) +
-                      t->match_n_vectors * sizeof (u32x4));
+         clib_memcpy_fast (new_v, add_v, sizeof (vnet_classify_entry_t) +
+                           t->match_n_vectors * sizeof (u32x4));
          new_v->flags &= ~(VNET_CLASSIFY_ENTRY_FREE);
          vnet_classify_entry_claim_resource (new_v);
 
@@ -845,7 +847,7 @@ unformat_tcp_mask (unformat_input_t * input, va_list * args)
 
   tcp = (tcp_header_t *) mask;
 
-#define _(a) if (a) memset (&tcp->a, 0xff, sizeof (tcp->a));
+#define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a));
   foreach_tcp_proto_field;
 #undef _
 
@@ -886,7 +888,7 @@ unformat_udp_mask (unformat_input_t * input, va_list * args)
 
   udp = (udp_header_t *) mask;
 
-#define _(a) if (a) memset (&udp->a, 0xff, sizeof (udp->a));
+#define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a));
   foreach_udp_proto_field;
 #undef _
 
@@ -981,7 +983,7 @@ unformat_ip4_mask (unformat_input_t * input, va_list * args)
 
   ip = (ip4_header_t *) mask;
 
-#define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
+#define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
   foreach_ip4_proto_field;
 #undef _
 
@@ -1053,7 +1055,7 @@ unformat_ip6_mask (unformat_input_t * input, va_list * args)
 
   ip = (ip6_header_t *) mask;
 
-#define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
+#define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
   foreach_ip6_proto_field;
 #undef _
 
@@ -1149,10 +1151,10 @@ unformat_l2_mask (unformat_input_t * input, va_list * args)
   vec_validate (mask, len - 1);
 
   if (dst)
-    memset (mask, 0xff, 6);
+    clib_memset (mask, 0xff, 6);
 
   if (src)
-    memset (mask + 6, 0xff, 6);
+    clib_memset (mask + 6, 0xff, 6);
 
   if (tag2 || dot1ad)
     {
@@ -1885,10 +1887,10 @@ unformat_ip6_match (unformat_input_t * input, va_list * args)
   ip = (ip6_header_t *) match;
 
   if (src)
-    clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
+    clib_memcpy_fast (&ip->src_address, &src_val, sizeof (ip->src_address));
 
   if (dst)
-    clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
+    clib_memcpy_fast (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
 
   if (proto)
     ip->protocol = proto_val;
@@ -2012,10 +2014,10 @@ unformat_l2_match (unformat_input_t * input, va_list * args)
   vec_validate_aligned (match, len - 1, sizeof (u32x4));
 
   if (dst)
-    clib_memcpy (match, dst_val, 6);
+    clib_memcpy_fast (match, dst_val, 6);
 
   if (src)
-    clib_memcpy (match + 6, src_val, 6);
+    clib_memcpy_fast (match + 6, src_val, 6);
 
   if (tag2)
     {
@@ -2188,8 +2190,8 @@ vnet_classify_add_del_session (vnet_classify_main_t * cm,
     e->metadata = 0;
 
   /* Copy key data, honoring skip_n_vectors */
-  clib_memcpy (&e->key, match + t->skip_n_vectors * sizeof (u32x4),
-              t->match_n_vectors * sizeof (u32x4));
+  clib_memcpy_fast (&e->key, match + t->skip_n_vectors * sizeof (u32x4),
+                   t->match_n_vectors * sizeof (u32x4));
 
   /* Clear don't-care bits; likely when dynamically creating sessions */
   for (i = 0; i < t->match_n_vectors; i++)
@@ -2302,7 +2304,7 @@ classify_session_command_fn (vlib_main_t * vm,
 VLIB_CLI_COMMAND (classify_session_command, static) = {
     .path = "classify session",
     .short_help =
-    "classify session [hit-next|l2-hit-next|"
+    "classify session [hit-next|l2-input-hit-next|l2-output-hit-next|"
     "acl-hit-next <next_index>|policer-hit-next <policer_name>]"
     "\n table-index <nn> match [hex] [l2] [l3 ip4] [opaque-index <index>]"
     "\n [action set-ip4-fib-id|set-ip6-fib-id|set-sr-policy-index <n>] [del]",
@@ -2501,7 +2503,7 @@ test_classify_churn (test_classify_main_t * tm)
   data = (classify_data_or_mask_t *) dp;
 
   /* Mask on src address */
-  memset (&mask->ip.src_address, 0xff, 4);
+  clib_memset (&mask->ip.src_address, 0xff, 4);
 
   tmp = clib_host_to_net_u32 (tm->src.as_u32);