diff options
-rw-r--r-- | src/plugins/avf/input.c | 1 | ||||
-rw-r--r-- | src/plugins/dpdk/device/node.c | 1 | ||||
-rw-r--r-- | src/plugins/memif/node.c | 1 | ||||
-rw-r--r-- | src/vlib/main.c | 10 | ||||
-rw-r--r-- | src/vlib/node.h | 3 | ||||
-rw-r--r-- | src/vlib/node_funcs.h | 6 | ||||
-rw-r--r-- | src/vnet/devices/virtio/vhost_user_input.c | 1 | ||||
-rw-r--r-- | src/vnet/pg/input.c | 1 |
8 files changed, 20 insertions, 4 deletions
diff --git a/src/plugins/avf/input.c b/src/plugins/avf/input.c index 8072e94346b..541a235c7f2 100644 --- a/src/plugins/avf/input.c +++ b/src/plugins/avf/input.c @@ -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; diff --git a/src/plugins/dpdk/device/node.c b/src/plugins/dpdk/device/node.c index 194c359dbac..4066a89b00d 100644 --- a/src/plugins/dpdk/device/node.c +++ b/src/plugins/dpdk/device/node.c @@ -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); diff --git a/src/plugins/memif/node.c b/src/plugins/memif/node.c index 3cb79541c17..ae6e6e74ef8 100644 --- a/src/plugins/memif/node.c +++ b/src/plugins/memif/node.c @@ -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); } } diff --git a/src/vlib/main.c b/src/vlib/main.c index ae78c430134..049d80d9d17 100644 --- a/src/vlib/main.c +++ b/src/vlib/main.c @@ -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) diff --git a/src/vlib/node.h b/src/vlib/node.h index f41eb60aa2c..a4ab0e34d1c 100644 --- a/src/vlib/node.h +++ b/src/vlib/node.h @@ -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) diff --git a/src/vlib/node_funcs.h b/src/vlib/node_funcs.h index 777746a0f78..bf11a0eb6d4 100644 --- a/src/vlib/node_funcs.h +++ b/src/vlib/node_funcs.h @@ -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) { diff --git a/src/vnet/devices/virtio/vhost_user_input.c b/src/vnet/devices/virtio/vhost_user_input.c index 812f9d3f6ab..911fde03544 100644 --- a/src/vnet/devices/virtio/vhost_user_input.c +++ b/src/vnet/devices/virtio/vhost_user_input.c @@ -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) diff --git a/src/vnet/pg/input.c b/src/vnet/pg/input.c index 792c67cd88d..b69bbab5d83 100644 --- a/src/vnet/pg/input.c +++ b/src/vnet/pg/input.c @@ -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); |