X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fnode.h;h=2acd61ce3f6a088efd6f1280dd3dc96c575e40b0;hb=149a1433b0e6301a34989f5e8c7ebed3fa5bf74e;hp=b624e9d636d2d55e00f0ad6e58c7cde8e0b96484;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vlib/node.h b/src/vlib/node.h index b624e9d636d..2acd61ce3f6 100644 --- a/src/vlib/node.h +++ b/src/vlib/node.h @@ -42,7 +42,7 @@ #include #include -#include +#include #include /* for vlib_trace_filter_t */ /* Forward declaration. */ @@ -326,7 +326,7 @@ 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 VLIB_MAX_CPUS +#define VLIB_FRAME_ALIGN CLIB_CACHE_LINE_BYTES /* Calling frame (think stack frame) for a node. */ typedef struct vlib_frame_t @@ -343,9 +343,6 @@ typedef struct vlib_frame_t /* Number of vector elements currently in frame. */ u16 n_vectors; - /* Owner cpuid / heap id */ - u16 cpu_index; - /* Scalar and vector arguments to next node. */ u8 arguments[0]; } vlib_frame_t; @@ -411,65 +408,72 @@ typedef struct typedef struct vlib_node_runtime_t { - CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); - /* Node function to call. */ - vlib_node_function_t *function; + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); /**< cacheline mark */ - /* Vector of errors for this node. */ - vlib_error_t *errors; + vlib_node_function_t *function; /**< Node function to call. */ - /* Number of clock cycles. */ - u32 clocks_since_last_overflow; + vlib_error_t *errors; /**< Vector of errors for this node. */ - /* Maximum clock cycle for an invocation. */ - u32 max_clock; +#if __SIZEOF_POINTER__ == 4 + u8 pad[8]; +#endif - /* Number of vectors in the recorded max_clock. */ - u32 max_clock_n; + u32 clocks_since_last_overflow; /**< Number of clock cycles. */ - /* Number of calls. */ - u32 calls_since_last_overflow; + u32 max_clock; /**< Maximum clock cycle for an + invocation. */ - /* Number of vector elements processed by this node. */ - u32 vectors_since_last_overflow; + u32 max_clock_n; /**< Number of vectors in the recorded + max_clock. */ - /* Start of next frames for this node. */ - u32 next_frame_index; + u32 calls_since_last_overflow; /**< Number of calls. */ - /* Node index. */ - u32 node_index; + u32 vectors_since_last_overflow; /**< Number of vector elements + processed by this node. */ - /* For input nodes: decremented on each main loop interation until it reaches zero - and function is called. Allows some input nodes to be called - more than others. */ - u32 input_main_loops_per_call; + u32 next_frame_index; /**< Start of next frames for this + node. */ - /* Saved main loop counter of last dispatch of this node. */ - u32 main_loop_count_last_dispatch; + u32 node_index; /**< Node index. */ - u32 main_loop_vector_stats[2]; + u32 input_main_loops_per_call; /**< For input nodes: decremented + on each main loop interation until + it reaches zero and function is + called. Allows some input nodes to + be called more than others. */ - /* Copy of main node flags. */ - u16 flags; + u32 main_loop_count_last_dispatch; /**< Saved main loop counter of last + dispatch of this node. */ - /* Input node state. */ - u16 state; + u32 main_loop_vector_stats[2]; - u16 n_next_nodes; + u16 flags; /**< Copy of main node flags. */ - /* Next frame index that vector arguments were last enqueued to - last time this node ran. Set to zero before first run - of this node. */ - u16 cached_next_index; + u16 state; /**< Input node state. */ - /* CPU this node runs on */ - u16 cpu_index; + u16 n_next_nodes; - /* Function dependent node-runtime. */ - u8 runtime_data[0]; + u16 cached_next_index; /**< Next frame index that vector + arguments were last enqueued to + last time this node ran. Set to + zero before first run of this + node. */ + + u16 thread_index; /**< thread this node runs on */ + + u8 runtime_data[0]; /**< Function dependent + node-runtime data. This data is + thread local, and it is not + cloned from main thread. It needs + to be initialized for each thread + before it is used unless + runtime_data template exists in + vlib_node_t. */ } vlib_node_runtime_t; +#define VLIB_NODE_RUNTIME_DATA_SIZE (sizeof (vlib_node_runtime_t) - STRUCT_OFFSET_OF (vlib_node_runtime_t, runtime_data)) + typedef struct { /* Number of allocated frames for this scalar/vector size. */ @@ -534,8 +538,14 @@ typedef struct /* Pool of currently valid event types. */ vlib_process_event_type_t *event_type_pool; - /* When suspending saves cpu cycle counter when process is to be resumed. */ - u64 resume_cpu_time; + /* + * When suspending saves clock time (10us ticks) when process + * is to be resumed. + */ + u64 resume_clock_interval; + + /* Handle from timer code, to cancel an unexpired timer */ + u32 stop_timer_handle; /* Default output function and its argument for any CLI outputs within the process. */ @@ -641,6 +651,7 @@ typedef struct /* Node runtime indices for input nodes with pending interrupts. */ u32 *pending_interrupt_node_runtime_indices; + clib_spinlock_t pending_interrupt_lock; /* Input nodes are switched from/to interrupt to/from polling mode when average vector length goes above/below polling/interrupt @@ -655,7 +666,7 @@ typedef struct vlib_pending_frame_t *pending_frames; /* Timing wheel for scheduling time-based node dispatch. */ - timing_wheel_t timing_wheel; + void *timing_wheel; vlib_signal_timed_event_data_t *signal_timed_event_data_pool; @@ -663,7 +674,7 @@ typedef struct u32 *data_from_advancing_timing_wheel; /* CPU time of next process to be ready on timing wheel. */ - u64 cpu_time_next_process_ready; + f64 time_next_process_ready; /* Vector of process nodes. One for each node of type VLIB_NODE_TYPE_PROCESS. */