X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fnode.h;h=68813c2c3e1993a8766e25b3e872dd3fa1f3df86;hb=3eb6cbec50a5cbe4c3465d60ba6aea7bf2845cd1;hp=a06c20211d43b794442aba0638140b77759d56af;hpb=2c4acdd8d47a14867d9658debc674323efc78323;p=vpp.git diff --git a/src/vlib/node.h b/src/vlib/node.h index a06c20211d4..68813c2c3e1 100644 --- a/src/vlib/node.h +++ b/src/vlib/node.h @@ -149,7 +149,8 @@ typedef struct _vlib_node_registration u8 protocol_hint; /* Size of scalar and vector arguments in bytes. */ - u16 scalar_size, vector_size; + u8 vector_size, aux_size; + u16 scalar_size; /* Number of error codes used by this node. */ u16 n_errors; @@ -200,7 +201,8 @@ static __clib_unused vlib_node_registration_t __clib_unused_##x #endif #define VLIB_NODE_FN(node) \ - uword CLIB_MARCH_SFX (node##_fn) (); \ + uword CLIB_MARCH_SFX (node##_fn) (vlib_main_t *, vlib_node_runtime_t *, \ + vlib_frame_t *); \ static vlib_node_fn_registration_t CLIB_MARCH_SFX ( \ node##_fn_registration) = { \ .function = &CLIB_MARCH_SFX (node##_fn), \ @@ -273,7 +275,7 @@ typedef struct vlib_node_t u32 runtime_index; /* Runtime data for this node. */ - void *runtime_data; + u8 *runtime_data; /* Node flags. */ u16 flags; @@ -309,7 +311,8 @@ typedef struct vlib_node_t u16 n_errors; /* Size of scalar and vector arguments in bytes. */ - u16 scalar_size, vector_size; + u16 frame_size, scalar_offset, vector_offset, magic_offset, aux_offset; + u16 frame_size_index; /* Handle/index in error heap for this node. */ u32 error_heap_handle; @@ -367,7 +370,10 @@ typedef struct vlib_node_t /* Max number of vector elements to process at once per node. */ #define VLIB_FRAME_SIZE 256 -#define VLIB_FRAME_ALIGN CLIB_CACHE_LINE_BYTES +/* Number of extra elements allocated at the end of vecttor. */ +#define VLIB_FRAME_SIZE_EXTRA 4 +/* Frame data alignment */ +#define VLIB_FRAME_DATA_ALIGN 16 /* Calling frame (think stack frame) for a node. */ typedef struct vlib_frame_t @@ -378,15 +384,15 @@ typedef struct vlib_frame_t /* User flags. Used for sending hints to the next node. */ u16 flags; - /* Number of scalar bytes in arguments. */ - u8 scalar_size; - - /* Number of bytes per vector argument. */ - u8 vector_size; + /* Scalar, vector and aux offsets in this frame. */ + u16 scalar_offset, vector_offset, aux_offset; /* Number of vector elements currently in frame. */ u16 n_vectors; + /* Index of frame size corresponding to allocated node. */ + u16 frame_size_index; + /* Scalar and vector arguments to next node. */ u8 arguments[0]; } vlib_frame_t; @@ -501,7 +507,7 @@ typedef struct vlib_node_runtime_t zero before first run of this node. */ - u16 thread_index; /**< thread this node runs on */ + CLIB_ALIGN_MARK (runtime_data_pad, 8); u8 runtime_data[0]; /**< Function dependent node-runtime data. This data is @@ -521,10 +527,15 @@ typedef struct /* Number of allocated frames for this scalar/vector size. */ u32 n_alloc_frames; + /* Frame size */ + u16 frame_size; + /* Vector of free frames for this scalar/vector size. */ vlib_frame_t **free_frames; } vlib_frame_size_t; +STATIC_ASSERT_SIZEOF (vlib_frame_size_t, 16); + typedef struct { /* Users opaque value for event type. */ @@ -566,7 +577,7 @@ typedef struct u32 n_suspends; /* Vectors of pending event data indexed by event type index. */ - void **pending_event_data_by_type_index; + u8 **pending_event_data_by_type_index; /* Bitmap of event type-indices with non-empty vectors. */ uword *non_empty_event_type_bitmap; @@ -679,8 +690,8 @@ typedef struct vlib_node_runtime_t *nodes_by_type[VLIB_N_NODE_TYPE]; /* Node runtime indices for input nodes with pending interrupts. */ - void *interrupts; - volatile u32 *pending_interrupts; + void *input_node_interrupts; + void *pre_input_node_interrupts; /* Input nodes are switched from/to interrupt to/from polling mode when average vector length goes above/below polling/interrupt @@ -721,9 +732,6 @@ typedef struct /* Current counts of nodes in each state. */ u32 input_node_counts_by_state[VLIB_N_NODE_STATE]; - /* Hash of (scalar_size,vector_size) to frame_sizes index. */ - uword *frame_size_hash; - /* Per-size frame allocation information. */ vlib_frame_size_t *frame_sizes; @@ -765,7 +773,6 @@ typedef struct { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); u64 head; - u64 head_hint; u64 tail; u32 n_in_use; u32 nelts;