Honor vnet_rewrite_data_t data_bytes == 0
[vpp.git] / src / vnet / adj / rewrite.h
index 712f686..3278113 100644 (file)
@@ -115,24 +115,24 @@ struct {                                                          \
 always_inline void
 vnet_rewrite_clear_data_internal (vnet_rewrite_header_t * rw, int max_size)
 {
-  /* Sanity check values carefully for this memset operation */
+  /* Sanity check values carefully for this clib_memset operation */
   ASSERT ((max_size > 0) && (max_size < VLIB_BUFFER_PRE_DATA_SIZE));
 
   rw->data_bytes = 0;
-  memset (rw->data, 0xfe, max_size);
+  clib_memset (rw->data, 0xfe, max_size);
 }
 
 always_inline void
 vnet_rewrite_set_data_internal (vnet_rewrite_header_t * rw,
                                int max_size, void *data, int data_bytes)
 {
-  /* Sanity check values carefully for this memset operation */
+  /* Sanity check values carefully for this clib_memset operation */
   ASSERT ((max_size > 0) && (max_size < VLIB_BUFFER_PRE_DATA_SIZE));
   ASSERT ((data_bytes >= 0) && (data_bytes < max_size));
 
   rw->data_bytes = data_bytes;
-  clib_memcpy (rw->data + max_size - data_bytes, data, data_bytes);
-  memset (rw->data, 0xfe, max_size - data_bytes);
+  clib_memcpy_fast (rw->data + max_size - data_bytes, data, data_bytes);
+  clib_memset (rw->data, 0xfe, max_size - data_bytes);
 }
 
 #define vnet_rewrite_set_data(rw,data,data_bytes)              \
@@ -189,7 +189,13 @@ _vnet_rewrite_one_header (vnet_rewrite_header_t * h0,
       clib_memcpy (d, s, sizeof (eh_copy_t));
       return;
     }
-
+  /*
+   * Stop now if the data_bytes field is zero, to avoid the cache
+   * miss consequences of spraying [functionally harmless] junk into
+   * un-prefetched rewrite space.
+   */
+  if (PREDICT_FALSE (h0->data_bytes == 0))
+    return;
 
 #define _(i)                                                           \
   do {                                                                 \
@@ -244,6 +250,14 @@ _vnet_rewrite_two_headers (vnet_rewrite_header_t * h0,
       return;
     }
 
+  /*
+   * Stop now if both rewrite data_bytes fields are zero, to avoid the cache
+   * miss consequences of spraying [functionally harmless] junk into
+   * un-prefetched rewrite space.
+   */
+  if (PREDICT_FALSE (h0->data_bytes + h1->data_bytes == 0))
+    return;
+
 #define _(i)                                                           \
   do {                                                                 \
     if (most_likely_size > ((i)-1)*sizeof (vnet_rewrite_data_t))       \
@@ -314,11 +328,12 @@ u32 vnet_tx_node_index_for_sw_interface (struct vnet_main_t *vnm,
 
 void vnet_rewrite_init (struct vnet_main_t *vnm,
                        u32 sw_if_index,
+                       vnet_link_t linkt,
                        u32 this_node,
                        u32 next_node, vnet_rewrite_header_t * rw);
 
 void vnet_rewrite_update_mtu (struct vnet_main_t *vnm,
-                             vnet_rewrite_header_t * rw);
+                             vnet_link_t linkt, vnet_rewrite_header_t * rw);
 
 u8 *vnet_build_rewrite_for_sw_interface (struct vnet_main_t *vnm,
                                         u32 sw_if_index,