diff options
Diffstat (limited to 'src/vlib/threads.h')
-rw-r--r-- | src/vlib/threads.h | 93 |
1 files changed, 47 insertions, 46 deletions
diff --git a/src/vlib/threads.h b/src/vlib/threads.h index 91727bacc23..3072d0e67dd 100644 --- a/src/vlib/threads.h +++ b/src/vlib/threads.h @@ -17,7 +17,11 @@ #include <vlib/main.h> #include <vppinfra/callback.h> +#ifdef __linux__ #include <linux/sched.h> +#elif __FreeBSD__ +#include <sys/sched.h> +#endif /* __linux__ */ void vlib_set_thread_name (char *name); @@ -45,22 +49,6 @@ typedef struct vlib_thread_registration_ uword *coremask; } vlib_thread_registration_t; -/* - * Frames have their cpu / vlib_main_t index in the low-order N bits - * Make VLIB_MAX_CPUS a power-of-two, please... - */ - -#ifndef VLIB_MAX_CPUS -#define VLIB_MAX_CPUS 256 -#endif - -#if VLIB_MAX_CPUS > CLIB_MAX_MHEAPS -#error Please increase number of per-cpu mheaps -#endif - -#define VLIB_CPU_MASK (VLIB_MAX_CPUS - 1) /* 0x3f, max */ -#define VLIB_OFFSET_MASK (~VLIB_CPU_MASK) - #define VLIB_LOG2_THREAD_STACK_SIZE (21) #define VLIB_THREAD_STACK_SIZE (1<<VLIB_LOG2_THREAD_STACK_SIZE) @@ -75,6 +63,7 @@ typedef struct CLIB_CACHE_LINE_ALIGN_MARK (cacheline1); u32 buffer_index[VLIB_FRAME_SIZE]; + u32 aux_data[VLIB_FRAME_SIZE]; } vlib_frame_queue_elt_t; @@ -101,6 +90,9 @@ typedef struct const char *barrier_caller; const char *barrier_context; volatile u32 *node_reforks_required; + volatile u32 wait_before_barrier; + volatile u32 workers_before_barrier; + volatile u32 done_work_before_barrier; long lwp; int cpu_id; @@ -130,7 +122,10 @@ typedef struct } vlib_frame_queue_t; -typedef struct +struct vlib_frame_queue_main_t_; +typedef u32 (vlib_frame_queue_dequeue_fn_t) ( + vlib_main_t *vm, struct vlib_frame_queue_main_t_ *fqm); +typedef struct vlib_frame_queue_main_t_ { u32 node_index; u32 frame_queue_nelts; @@ -140,6 +135,7 @@ typedef struct /* for frame queue tracing */ frame_queue_trace_t *frame_queue_traces; frame_queue_nelt_counter_t *frame_queue_histogram; + vlib_frame_queue_dequeue_fn_t *frame_queue_dequeue_fn; } vlib_frame_queue_main_t; typedef struct @@ -182,6 +178,10 @@ void vlib_worker_thread_node_refork (void); * Wait until each of the workers has been once around the track */ void vlib_worker_wait_one_loop (void); +/** + * Flush worker's pending rpc requests to main thread's rpc queue + */ +void vlib_worker_flush_pending_rpc_requests (vlib_main_t *vm); static_always_inline uword vlib_get_thread_index (void) @@ -218,12 +218,20 @@ __foreach_vlib_main_helper (vlib_main_t *ii, vlib_main_t **p) __foreach_vlib_main_helper (ii, &this_vlib_main); ii++) \ if (this_vlib_main) -#define foreach_sched_policy \ - _(SCHED_OTHER, OTHER, "other") \ - _(SCHED_BATCH, BATCH, "batch") \ - _(SCHED_IDLE, IDLE, "idle") \ - _(SCHED_FIFO, FIFO, "fifo") \ - _(SCHED_RR, RR, "rr") +#define foreach_sched_policy_posix \ + _ (SCHED_OTHER, OTHER, "other") \ + _ (SCHED_FIFO, FIFO, "fifo") \ + _ (SCHED_RR, RR, "rr") +#define foreach_sched_policy_linux \ + _ (SCHED_BATCH, BATCH, "batch") \ + _ (SCHED_IDLE, IDLE, "idle") + +#ifdef __linux__ +#define foreach_sched_policy \ + foreach_sched_policy_posix foreach_sched_policy_linux +#else +#define foreach_sched_policy foreach_sched_policy_posix +#endif /* __linux__ */ typedef enum { @@ -235,13 +243,6 @@ typedef enum typedef struct { - clib_error_t *(*vlib_launch_thread_cb) (void *fp, vlib_worker_thread_t * w, - unsigned cpu_id); - clib_error_t *(*vlib_thread_set_lcore_cb) (u32 thread, u16 cpu); -} vlib_thread_callbacks_t; - -typedef struct -{ /* Link list of registrations, built by constructors */ vlib_thread_registration_t *next; @@ -252,12 +253,10 @@ typedef struct vlib_worker_thread_t *worker_threads; - /* - * Launch all threads as pthreads, - * not eal_rte_launch (strict affinity) threads - */ int use_pthreads; + int use_main_core_auto; + /* Number of vlib_main / vnet_main clones */ u32 n_vlib_mains; @@ -285,6 +284,9 @@ typedef struct /* Bitmap of available CPU sockets (NUMA nodes) */ uword *cpu_socket_bitmap; + /* Bitmap of CPU affinity for VPP process */ + uword *cpu_affinity_bitmap; + /* Worker handoff queues */ vlib_frame_queue_main_t *frame_queue_mains; @@ -297,10 +299,6 @@ typedef struct /* scheduling policy priority */ u32 sched_priority; - /* callbacks */ - vlib_thread_callbacks_t cb; - int extern_thread_mgmt; - /* NUMA-bound heap size */ uword numa_heap_size; @@ -370,12 +368,10 @@ vlib_worker_thread_barrier_check (void) if (PREDICT_FALSE (vlib_worker_threads->barrier_elog_enabled)) { vlib_worker_thread_t *w = vlib_worker_threads + thread_index; - /* *INDENT-OFF* */ ELOG_TYPE_DECLARE (e) = { .format = "barrier-wait-thread-%d", .format_args = "i4", }; - /* *INDENT-ON* */ struct { @@ -419,12 +415,10 @@ vlib_worker_thread_barrier_check (void) { t = vlib_time_now (vm) - t; vlib_worker_thread_t *w = vlib_worker_threads + thread_index; - /* *INDENT-OFF* */ ELOG_TYPE_DECLARE (e) = { .format = "barrier-refork-thread-%d", .format_args = "i4", }; - /* *INDENT-ON* */ struct { @@ -446,12 +440,10 @@ vlib_worker_thread_barrier_check (void) { t = vlib_time_now (vm) - t; vlib_worker_thread_t *w = vlib_worker_threads + thread_index; - /* *INDENT-OFF* */ ELOG_TYPE_DECLARE (e) = { .format = "barrier-released-thread-%d: %dus", .format_args = "i4i4", }; - /* *INDENT-ON* */ struct { @@ -490,8 +482,6 @@ vlib_thread_is_main_w_barrier (void) } u8 *vlib_thread_stack_init (uword thread_index); -int vlib_thread_cb_register (struct vlib_main_t *vm, - vlib_thread_callbacks_t * cb); extern void *rpc_call_main_thread_cb_fn; void @@ -501,6 +491,17 @@ void vlib_rpc_call_main_thread (void *function, u8 * args, u32 size); void vlib_get_thread_core_numa (vlib_worker_thread_t * w, unsigned cpu_id); vlib_thread_main_t *vlib_get_thread_main_not_inline (void); +/** + * Force workers sync from within worker + * + * Must be paired with @ref vlib_workers_continue + */ +void vlib_workers_sync (void); +/** + * Release barrier after workers sync + */ +void vlib_workers_continue (void); + #endif /* included_vlib_threads_h */ /* |