diff options
author | Dave Barach <dave@barachs.net> | 2019-01-26 09:50:26 -0500 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2019-01-27 03:01:59 +0000 |
commit | 53fe4a79269671fd37bf8a1fbb147bcc99b04fab (patch) | |
tree | bc9f614004a9f51081f9a652a45b6fe51992ebf0 /src/vlib/threads.c | |
parent | f23a885b892e432c7eac0f00c9e010fc21b6b211 (diff) |
perfmon: collect data on selected thread(s)
Add missing pre-input node runtime fork and refork code.
unix-epoll-input runs on all threads; each instance needs its own
runtime stats.
Change-Id: I16b02e42d0c95f863161176c4bb9f9917bef809d
Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'src/vlib/threads.c')
-rw-r--r-- | src/vlib/threads.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/src/vlib/threads.c b/src/vlib/threads.c index 45e4d89b7ab..e6ac6db543a 100644 --- a/src/vlib/threads.c +++ b/src/vlib/threads.c @@ -801,7 +801,7 @@ start_workers (vlib_main_t * vm) /* fork the frame dispatch queue */ nm_clone->pending_frames = 0; - vec_validate (nm_clone->pending_frames, 10); /* $$$$$?????? */ + vec_validate (nm_clone->pending_frames, 10); _vec_len (nm_clone->pending_frames) = 0; /* fork nodes */ @@ -850,6 +850,21 @@ start_workers (vlib_main_t * vm) n->runtime_data_bytes)); } + nm_clone->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT] = + vec_dup_aligned (nm->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT], + CLIB_CACHE_LINE_BYTES); + vec_foreach (rt, + nm_clone->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT]) + { + vlib_node_t *n = vlib_get_node (vm, rt->node_index); + rt->thread_index = vm_clone->thread_index; + /* copy initial runtime_data from node */ + if (n->runtime_data && n->runtime_data_bytes > 0) + clib_memcpy (rt->runtime_data, n->runtime_data, + clib_min (VLIB_NODE_RUNTIME_DATA_SIZE, + n->runtime_data_bytes)); + } + nm_clone->processes = vec_dup_aligned (nm->processes, CLIB_CACHE_LINE_BYTES); @@ -1173,6 +1188,33 @@ vlib_worker_thread_node_refork (void) vec_free (old_rt); + /* re-clone pre-input nodes */ + old_rt = nm_clone->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT]; + nm_clone->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT] = + vec_dup_aligned (nm->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT], + CLIB_CACHE_LINE_BYTES); + + vec_foreach (rt, nm_clone->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT]) + { + vlib_node_t *n = vlib_get_node (vm, rt->node_index); + rt->thread_index = vm_clone->thread_index; + /* copy runtime_data, will be overwritten later for existing rt */ + if (n->runtime_data && n->runtime_data_bytes > 0) + clib_memcpy_fast (rt->runtime_data, n->runtime_data, + clib_min (VLIB_NODE_RUNTIME_DATA_SIZE, + n->runtime_data_bytes)); + } + + for (j = 0; j < vec_len (old_rt); j++) + { + rt = vlib_node_get_runtime (vm_clone, old_rt[j].node_index); + rt->state = old_rt[j].state; + clib_memcpy_fast (rt->runtime_data, old_rt[j].runtime_data, + VLIB_NODE_RUNTIME_DATA_SIZE); + } + + vec_free (old_rt); + nm_clone->processes = vec_dup_aligned (nm->processes, CLIB_CACHE_LINE_BYTES); } |