vlib: define minimum chained buffer segment size 28/15628/4
authorDamjan Marion <damarion@cisco.com>
Wed, 31 Oct 2018 09:59:02 +0000 (10:59 +0100)
committerMarco Varlese <marco.varlese@suse.de>
Fri, 2 Nov 2018 08:54:02 +0000 (08:54 +0000)
Change-Id: I9b5f7b264f9978e3dd97b2d1eb103b7d10ac3170
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/vlib/buffer.h
src/vnet/bier/bier_lookup.c
src/vnet/dpo/replicate_dpo.c
src/vnet/l2/l2_flood.c

index f9750ec..99f40e8 100644 (file)
 #define VLIB_BUFFER_DATA_SIZE          (2048)
 #define VLIB_BUFFER_PRE_DATA_SIZE      __PRE_DATA_SIZE
 
+/* Minimum buffer chain segment size. Does not apply to last buffer in chain.
+   Dataplane code can safely asume that specified amount of data is not split
+   into 2 chained buffers */
+#define VLIB_BUFFER_MIN_CHAIN_SEG_SIZE (128)
+
+/* Amount of head buffer data copied to each replica head buffer */
+#define VLIB_BUFFER_CLONE_HEAD_SIZE (256)
+
 typedef u8 vlib_buffer_free_list_index_t;
 
 /** \file
@@ -224,6 +232,9 @@ vlib_buffer_advance (vlib_buffer_t * b, word l)
   ASSERT (b->current_length >= l);
   b->current_data += l;
   b->current_length -= l;
+
+  ASSERT ((b->flags & VLIB_BUFFER_NEXT_PRESENT) == 0 ||
+         b->current_length >= VLIB_BUFFER_MIN_CHAIN_SEG_SIZE);
 }
 
 /** \brief Check if there is enough space in buffer to advance
index d450082..51011c9 100644 (file)
@@ -223,7 +223,7 @@ bier_lookup (vlib_main_t * vm,
                 num_cloned = vlib_buffer_clone(vm, bi0,
                                                blm->blm_clones[thread_index],
                                                n_clones,
-                                               n_bytes + 8);
+                                              VLIB_BUFFER_CLONE_HEAD_SIZE);
 
                 if (num_cloned != vec_len(blm->blm_fmasks[thread_index]))
                 {
index c9d86f3..39b17f1 100644 (file)
@@ -673,7 +673,8 @@ replicate_inline (vlib_main_t * vm,
            vec_validate (rm->clones[thread_index], rep0->rep_n_buckets - 1);
 
            num_cloned = vlib_buffer_clone (vm, bi0, rm->clones[thread_index],
-                                            rep0->rep_n_buckets, 128);
+                                            rep0->rep_n_buckets,
+                                           VLIB_BUFFER_CLONE_HEAD_SIZE);
 
            if (num_cloned != rep0->rep_n_buckets)
              {
index 8908c43..aeac8ff 100644 (file)
@@ -223,9 +223,7 @@ l2flood_node_fn (vlib_main_t * vm,
              n_cloned = vlib_buffer_clone (vm, bi0,
                                            msm->clones[thread_index],
                                            n_clones,
-                                           (vnet_buffer (b0)->l2.l2_len +
-                                            sizeof (udp_header_t) +
-                                            2 * sizeof (ip6_header_t)));
+                                           VLIB_BUFFER_CLONE_HEAD_SIZE);
 
              if (PREDICT_FALSE (n_cloned != n_clones))
                {