FD.io VPP  v16.12-rc0-308-g931be3a
Vector Packet Processing
threads.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef included_vlib_threads_h
16 #define included_vlib_threads_h
17 
18 #include <vlib/main.h>
19 #include <linux/sched.h>
20 
22 
23 void vlib_set_thread_name (char *name);
24 
25 /* arg is actually a vlib__thread_t * */
26 typedef void (vlib_thread_function_t) (void *arg);
27 
29 {
30  /* constructor generated list of thread registrations */
32 
33  /* config parameters */
34  char *name;
35  char *short_name;
42 
43  /* All threads of this type run on pthreads */
48 
49 /*
50  * Frames have their cpu / vlib_main_t index in the low-order N bits
51  * Make VLIB_MAX_CPUS a power-of-two, please...
52  */
53 
54 #ifndef VLIB_MAX_CPUS
55 #define VLIB_MAX_CPUS 256
56 #endif
57 
58 #if VLIB_MAX_CPUS > CLIB_MAX_MHEAPS
59 #error Please increase number of per-cpu mheaps
60 #endif
61 
62 #define VLIB_CPU_MASK (VLIB_MAX_CPUS - 1) /* 0x3f, max */
63 #define VLIB_OFFSET_MASK (~VLIB_CPU_MASK)
64 
65 #define VLIB_LOG2_THREAD_STACK_SIZE (20)
66 #define VLIB_THREAD_STACK_SIZE (1<<VLIB_LOG2_THREAD_STACK_SIZE)
67 
68 typedef enum
69 {
72 
73 typedef struct
74 {
75  volatile u32 valid;
79 
80  /* 256 * 4 = 1024 bytes, even mult of cache line size */
81  u32 buffer_index[VLIB_FRAME_SIZE];
82 
83  /* Pad to a cache line boundary */
84  u8 pad[CLIB_CACHE_LINE_BYTES - 4 * sizeof (u32)];
85 }
87 
88 typedef struct
89 {
90  /* First cache line */
91  volatile u32 *wait_at_barrier;
93  u8 pad0[CLIB_CACHE_LINE_BYTES - (2 * sizeof (u32 *))];
94 
95  /* Second Cache Line */
96  void *thread_mheap;
98  void (*thread_function) (void *);
106 
107  long lwp;
108  int lcore_id;
109  pthread_t thread_id;
111 
113 
114 typedef struct
115 {
116  /* enqueue side */
117  volatile u64 tail;
123  u8 pad2[CLIB_CACHE_LINE_BYTES - (2 * sizeof (u32)) - (4 * sizeof (u64))];
124 
125  /* dequeue side */
126  volatile u64 head;
132  u8 pad4[CLIB_CACHE_LINE_BYTES - (6 * sizeof (u64))];
133 
134  /* dequeue hint to enqueue side */
135  volatile u64 head_hint;
136  u8 pad5[CLIB_CACHE_LINE_BYTES - sizeof (u64)];
137 
138  /* read-only, constant, shared */
141 }
143 
145 
146 /* Called early, in thread 0's context */
148 
150 
151 int vlib_frame_queue_enqueue (vlib_main_t * vm, u32 node_runtime_index,
152  u32 frame_queue_index, vlib_frame_t * frame,
154 
155 int vlib_frame_queue_dequeue (int thread_id,
156  vlib_main_t * vm, vlib_node_main_t * nm);
157 
159  vlib_node_runtime_t * node,
161  vlib_node_state_t dispatch_state,
162  vlib_frame_t * frame, u64 last_time_stamp);
163 
165  vlib_pending_frame_t * p, u64 last_time_stamp);
166 
168 
169 void vlib_create_worker_threads (vlib_main_t * vm, int n,
170  void (*thread_function) (void *));
171 
173 
174 /* Check for a barrier sync request every 30ms */
175 #define BARRIER_SYNC_DELAY (0.030000)
176 
177 #if CLIB_DEBUG > 0
178 /* long barrier timeout, for gdb... */
179 #define BARRIER_SYNC_TIMEOUT (600.1)
180 #else
181 #define BARRIER_SYNC_TIMEOUT (1.0)
182 #endif
183 
186 
187 always_inline void
189 {
190  if (CLIB_DEBUG > 0)
191  {
192  if (os_get_cpu_number ())
193  fformat (stderr, "%s: SMP unsafe warning...\n", __FUNCTION__);
194  }
195 }
196 
197 typedef enum
198 {
202 
203 void vlib_worker_thread_fork_fixup (vlib_fork_fixup_t which);
204 
205 static inline void
207 {
208  if (PREDICT_FALSE (*vlib_worker_threads->wait_at_barrier))
209  {
210  clib_smp_atomic_add (vlib_worker_threads->workers_at_barrier, 1);
211  while (*vlib_worker_threads->wait_at_barrier)
212  ;
213  clib_smp_atomic_add (vlib_worker_threads->workers_at_barrier, -1);
214  }
215 }
216 
217 #define foreach_vlib_main(body) \
218 do { \
219  vlib_main_t ** __vlib_mains = 0, *this_vlib_main; \
220  int ii; \
221  \
222  if (vec_len (vlib_mains) == 0) \
223  vec_add1 (__vlib_mains, &vlib_global_main); \
224  else \
225  { \
226  for (ii = 0; ii < vec_len (vlib_mains); ii++) \
227  { \
228  this_vlib_main = vlib_mains[ii]; \
229  if (this_vlib_main) \
230  vec_add1 (__vlib_mains, this_vlib_main); \
231  } \
232  } \
233  \
234  for (ii = 0; ii < vec_len (__vlib_mains); ii++) \
235  { \
236  this_vlib_main = __vlib_mains[ii]; \
237  /* body uses this_vlib_main... */ \
238  (body); \
239  } \
240  vec_free (__vlib_mains); \
241 } while (0);
242 
243 
244 /* Early-Fast-Discard (EFD) */
245 #define VLIB_EFD_DISABLED 0
246 #define VLIB_EFD_DISCARD_ENABLED (1 << 0)
247 #define VLIB_EFD_MONITOR_ENABLED (1 << 1)
248 
249 #define VLIB_EFD_DEF_WORKER_HI_THRESH_PCT 90
250 
251 /* EFD worker thread settings */
252 typedef struct vlib_efd_t
253 {
260 } vlib_efd_t;
261 
262 #define foreach_sched_policy \
263  _(SCHED_OTHER, OTHER, "other") \
264  _(SCHED_BATCH, BATCH, "batch") \
265  _(SCHED_IDLE, IDLE, "idle") \
266  _(SCHED_FIFO, FIFO, "fifo") \
267  _(SCHED_RR, RR, "rr")
268 
269 typedef enum
270 {
271 #define _(v,f,s) SCHED_POLICY_##f = v,
273 #undef _
276 
277 typedef struct
278 {
279  /* Link list of registrations, built by constructors */
281 
282  /* Vector of registrations, w/ non-data-structure clones at the top */
284 
286 
288 
289  /*
290  * Launch all threads as pthreads,
291  * not eal_rte_launch (strict affinity) threads
292  */
294 
295  /* Number of vlib_main / vnet_main clones */
297 
298  /* Number of thread stacks to create */
300 
301  /* Number of pthreads */
303 
304  /* Number of DPDK eal threads */
306 
307  /* Number of cores to skip, must match the core mask */
309 
310  /* Thread prefix name */
312 
313  /* main thread lcore */
315 
316  /* Bitmap of available CPU cores */
318 
319  /* Bitmap of available CPU sockets (NUMA nodes) */
321 
323 
324  /* handoff node index */
326 
327  /* for frame queue tracing */
330 
331  /* worker thread initialization barrier */
333 
334  /* scheduling policy */
336 
337  /* scheduling policy priority */
339 
341 
343 
344 #define VLIB_REGISTER_THREAD(x,...) \
345  __VA_ARGS__ vlib_thread_registration_t x; \
346 static void __vlib_add_thread_registration_##x (void) \
347  __attribute__((__constructor__)) ; \
348 static void __vlib_add_thread_registration_##x (void) \
349 { \
350  vlib_thread_main_t * tm = &vlib_thread_main; \
351  x.next = tm->next; \
352  tm->next = &x; \
353 } \
354 __VA_ARGS__ vlib_thread_registration_t x
355 
356 #endif /* included_vlib_threads_h */
357 
358 /*
359  * fd.io coding-style-patch-verification: ON
360  *
361  * Local Variables:
362  * eval: (c-set-style "gnu")
363  * End:
364  */
u8 pad[3]
log2 (size of the packing page block)
Definition: bihash_doc.h:61
void vlib_worker_thread_init(vlib_worker_thread_t *w)
Definition: threads.c:474
int vlib_frame_queue_enqueue(vlib_main_t *vm, u32 node_runtime_index, u32 frame_queue_index, vlib_frame_t *frame, vlib_frame_queue_msg_type_t type)
bad routing header type(not 4)") sr_error (NO_MORE_SEGMENTS
vlib_worker_thread_t * vlib_alloc_thread(vlib_main_t *vm)
Definition: threads.c:298
void vlib_set_thread_name(char *name)
Definition: threads.c:92
void * thread_function_arg
Definition: threads.h:99
elog_track_t elog_track
Definition: threads.h:101
frame_queue_trace_t * frame_queue_traces
Definition: threads.h:328
vlib_worker_thread_t * vlib_worker_threads
Definition: threads.h:112
struct vlib_thread_registration_ * next
Definition: threads.h:31
volatile u32 valid
Definition: threads.h:75
vlib_node_state_t
Definition: node.h:207
static void vlib_smp_unsafe_warning(void)
Definition: threads.h:188
u32 handoff_dispatch_node_index
Definition: threads.h:325
u8 mpls_exp_bitmap
Definition: threads.h:257
static void vlib_worker_thread_barrier_check(void)
Definition: threads.h:206
vlib_thread_registration_t * next
Definition: threads.h:280
u64 dispatch_node(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_node_type_t type, vlib_node_state_t dispatch_state, vlib_frame_t *frame, u64 last_time_stamp)
Definition: main.c:919
#define clib_smp_atomic_add(addr, increment)
Definition: smp.h:46
#define always_inline
Definition: clib.h:84
vlib_frame_queue_msg_type_t
Definition: threads.h:68
u16 queue_hi_thresh
Definition: threads.h:255
uword * cpu_core_bitmap
Definition: threads.h:317
unsigned long u64
Definition: types.h:89
vlib_frame_queue_elt_t * elts
Definition: threads.h:139
vlib_frame_queue_t ** vlib_frame_queues
Definition: threads.h:144
vlib_fork_fixup_t
Definition: threads.h:197
sched_policy_t
Definition: threads.h:269
void * thread_mheap
Definition: threads.h:96
volatile u64 head
Definition: threads.h:126
vlib_node_type_t
Definition: node.h:58
uword os_get_cpu_number(void)
Definition: unix-misc.c:224
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
Definition: threads.c:1214
#define PREDICT_FALSE(x)
Definition: clib.h:97
#define VLIB_FRAME_SIZE
Definition: node.h:328
long i64
Definition: types.h:82
void vlib_worker_thread_node_runtime_update(void)
Definition: threads.c:826
struct vlib_efd_t vlib_efd_t
void vlib_worker_thread_fork_fixup(vlib_fork_fixup_t which)
Definition: threads.c:1159
volatile u64 tail
Definition: threads.h:117
u8 ip_prec_bitmap
Definition: threads.h:256
u8 vlan_cos_bitmap
Definition: threads.h:258
vlib_worker_thread_t * worker_threads
Definition: threads.h:287
int vlib_frame_queue_dequeue(int thread_id, vlib_main_t *vm, vlib_node_main_t *nm)
volatile u32 * wait_at_barrier
Definition: threads.h:91
frame_queue_nelt_counter_t * frame_queue_histogram
Definition: threads.h:329
unsigned int u32
Definition: types.h:88
struct vlib_thread_registration_ vlib_thread_registration_t
uword * thread_registrations_by_name
Definition: threads.h:285
clib_error_t * vlib_thread_init(vlib_main_t *vm)
Definition: threads.c:147
u64 uword
Definition: types.h:112
u32 enqueue_full_events
Definition: threads.h:121
unsigned short u16
Definition: types.h:57
unsigned char u8
Definition: types.h:56
vlib_main_t ** vlib_mains
Definition: threads.h:21
u32 enqueue_efd_discards
Definition: threads.h:122
void vlib_create_worker_threads(vlib_main_t *vm, int n, void(*thread_function)(void *))
volatile u64 head_hint
Definition: threads.h:135
word fformat(FILE *f, char *fmt,...)
Definition: format.c:452
void vlib_worker_thread_barrier_sync(vlib_main_t *vm)
Definition: threads.c:1182
volatile u32 * workers_at_barrier
Definition: threads.h:92
u64 dispatch_pending_node(vlib_main_t *vm, vlib_pending_frame_t *p, u64 last_time_stamp)
Definition: main.c:1087
uword * cpu_socket_bitmap
Definition: threads.h:320
#define foreach_sched_policy
Definition: threads.h:262
void( vlib_thread_function_t)(void *arg)
Definition: threads.h:26
vlib_thread_registration_t ** registrations
Definition: threads.h:283
vlib_thread_main_t vlib_thread_main
Definition: threads.h:342
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:67
pthread_t thread_id
Definition: threads.h:109
vlib_thread_registration_t * registration
Definition: threads.h:103
volatile u32 worker_thread_release
Definition: threads.h:332
u16 enabled
Definition: threads.h:254
vlib_efd_t efd
Definition: threads.h:322