Add no-append flag to vlib_frame_t 73/17773/1
authorDamjan Marion <[email protected]>
Thu, 21 Feb 2019 19:24:54 +0000 (20:24 +0100)
committerDamjan Marion <[email protected]>
Fri, 22 Feb 2019 10:31:43 +0000 (11:31 +0100)
Change-Id: I01c4f5755d579282773ac227b0bc24f8ddbb2bd1
Signed-off-by: Damjan Marion <[email protected]>
src/plugins/avf/input.c
src/plugins/dpdk/device/node.c
src/plugins/memif/node.c
src/vlib/main.c
src/vlib/node.h
src/vlib/node_funcs.h
src/vnet/devices/virtio/vhost_user_input.c
src/vnet/pg/input.c

index 8072e94..541a235 100644 (file)
@@ -411,6 +411,7 @@ no_more_desc:
 
       if ((or_qw1 & AVF_RXD_ERROR_IPE) == 0)
        f->flags |= ETH_INPUT_FRAME_F_IP4_CKSUM_OK;
+      vlib_frame_no_append (f);
     }
 
   n_left_to_next -= n_rx_packets;
index 194c359..4066a89 100644 (file)
@@ -389,6 +389,7 @@ dpdk_device_input (vlib_main_t * vm, dpdk_main_t * dm, dpdk_device_t * xd,
          if (xd->flags & DPDK_DEVICE_FLAG_RX_IP4_CKSUM &&
              (or_flags & PKT_RX_IP_CKSUM_BAD) == 0)
            f->flags |= ETH_INPUT_FRAME_F_IP4_CKSUM_OK;
+         vlib_frame_no_append (f);
        }
       n_left_to_next -= n_rx_packets;
       vlib_put_next_frame (vm, node, next_index, n_left_to_next);
index 3cb7954..ae6e6e7 100644 (file)
@@ -366,6 +366,7 @@ memif_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
          ef = vlib_frame_scalar_args (f);
          ef->sw_if_index = mif->sw_if_index;
          ef->hw_if_index = mif->hw_if_index;
+         vlib_frame_no_append (f);
        }
     }
 
index ae78c43..049d80d 100644 (file)
@@ -233,7 +233,7 @@ vlib_frame_free (vlib_main_t * vm, vlib_node_runtime_t * r, vlib_frame_t * f)
        ASSERT (nf->frame_index != frame_index);
     }
 
-  f->frame_flags &= ~VLIB_FRAME_IS_ALLOCATED;
+  f->frame_flags &= ~(VLIB_FRAME_IS_ALLOCATED | VLIB_FRAME_NO_APPEND);
 
   vec_add1 (fs->free_frame_indices, frame_index);
   ASSERT (fs->n_alloc_frames > 0);
@@ -387,9 +387,11 @@ vlib_get_next_frame_internal (vlib_main_t * vm,
       f->flags = 0;
     }
 
-  /* Allocate new frame if current one is already full. */
+  /* Allocate new frame if current one is marked as no-append or
+     it is already full. */
   n_used = f->n_vectors;
-  if (n_used >= VLIB_FRAME_SIZE || (allocate_new_next_frame && n_used > 0))
+  if (n_used >= VLIB_FRAME_SIZE || (allocate_new_next_frame && n_used > 0) ||
+      (f->frame_flags & VLIB_FRAME_NO_APPEND))
     {
       /* Old frame may need to be freed after dispatch, since we'll have
          two redundant frames from node -> next node. */
@@ -1347,7 +1349,7 @@ dispatch_pending_node (vlib_main_t * vm, uword pending_frame_index,
                                   VLIB_NODE_STATE_POLLING,
                                   f, last_time_stamp);
 
-  f->frame_flags &= ~VLIB_FRAME_PENDING;
+  f->frame_flags &= ~(VLIB_FRAME_PENDING | VLIB_FRAME_NO_APPEND);
 
   /* Frame is ready to be used again, so restore it. */
   if (restore_frame_index != ~0)
index f41eb60..a4ab0e3 100644 (file)
@@ -438,6 +438,9 @@ typedef struct
 #define VLIB_FRAME_NO_FREE_AFTER_DISPATCH \
   VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH
 
+  /* Don't append this frame */
+#define VLIB_FRAME_NO_APPEND (1 << 14)
+
   /* This next frame owns enqueue to node
      corresponding to node_runtime_index. */
 #define VLIB_FRAME_OWNER (1 << 15)
index 777746a..bf11a0e 100644 (file)
@@ -242,6 +242,12 @@ vlib_get_frame (vlib_main_t * vm, uword frame_index)
   return f;
 }
 
+always_inline void
+vlib_frame_no_append (vlib_frame_t * f)
+{
+  f->frame_flags |= VLIB_FRAME_NO_APPEND;
+}
+
 always_inline u32
 vlib_frame_index (vlib_main_t * vm, vlib_frame_t * f)
 {
index 812f9d3..911fde0 100644 (file)
@@ -402,6 +402,7 @@ vhost_user_if_input (vlib_main_t * vm,
       ef = vlib_frame_scalar_args (f);
       ef->sw_if_index = vui->sw_if_index;
       ef->hw_if_index = vui->hw_if_index;
+      vlib_frame_no_append (f);
     }
 
   while (n_left > 0)
index 792c67c..b69bbab 100644 (file)
@@ -1577,6 +1577,7 @@ pg_generate_packets (vlib_node_runtime_t * node,
          pi = pool_elt_at_index (pg->interfaces, s->pg_if_index);
          ef->sw_if_index = pi->sw_if_index;
          ef->hw_if_index = pi->hw_if_index;
+         vlib_frame_no_append (f);
        }
       else
        vlib_get_next_frame (vm, node, next_index, to_next, n_left);