Type: improvement
Change-Id: If3da7d4338470912f37ff1794620418d928fb77f
Signed-off-by: Damjan Marion <damarion@cisco.com>
43 files changed:
{
trace_bitmap |= 0x80000000;
}
{
trace_bitmap |= 0x80000000;
}
- ASSERT (f_sess_id.thread_index < vec_len (vlib_mains));
+ ASSERT (f_sess_id.thread_index < vlib_get_n_threads ());
b[0]->error = no_error_existing_session;
acl_check_needed = 0;
pkts_exist_session += 1;
b[0]->error = no_error_existing_session;
acl_check_needed = 0;
pkts_exist_session += 1;
if (!pw->interrupt_is_pending)
{
pw->interrupt_is_pending = 1;
if (!pw->interrupt_is_pending)
{
pw->interrupt_is_pending = 1;
- vlib_node_set_interrupt_pending (vlib_mains[thread_index],
- acl_fa_worker_session_cleaner_process_node.index);
+ vlib_node_set_interrupt_pending (
+ vlib_get_main_by_index (thread_index),
+ acl_fa_worker_session_cleaner_process_node.index);
elog_acl_maybe_trace_X1 (am,
"send_one_worker_interrupt: send interrupt to worker %u",
"i4", ((u32) thread_index));
elog_acl_maybe_trace_X1 (am,
"send_one_worker_interrupt: send interrupt to worker %u",
"i4", ((u32) thread_index));
{
int i;
/* Can't use vec_len(am->per_worker_data) since the threads might not have come up yet; */
{
int i;
/* Can't use vec_len(am->per_worker_data) since the threads might not have come up yet; */
- int n_threads = vec_len (vlib_mains);
+ int n_threads = vlib_get_n_threads ();
for (i = 0; i < n_threads; i++)
{
send_one_worker_interrupt (vm, am, i);
for (i = 0; i < n_threads; i++)
{
send_one_worker_interrupt (vm, am, i);
*
* Also, while we are at it, calculate the earliest we need to wake up.
*/
*
* Also, while we are at it, calculate the earliest we need to wake up.
*/
- for (ti = 0; ti < vec_len (vlib_mains); ti++)
+ for (ti = 0; ti < vlib_get_n_threads (); ti++)
{
if (ti >= vec_len (am->per_worker_data))
{
{
if (ti >= vec_len (am->per_worker_data))
{
/* now wait till they all complete */
acl_log_info ("CLEANER mains len: %u per-worker len: %d",
/* now wait till they all complete */
acl_log_info ("CLEANER mains len: %u per-worker len: %d",
vec_len (am->per_worker_data));
vec_foreach (pw0, am->per_worker_data)
{
vec_len (am->per_worker_data));
vec_foreach (pw0, am->per_worker_data)
{
{
u64 curr_sess_count;
curr_sess_count = am->fa_session_total_adds - am->fa_session_total_dels;
{
u64 curr_sess_count;
curr_sess_count = am->fa_session_total_adds - am->fa_session_total_dels;
- return (curr_sess_count + vec_len (vlib_mains) <
+ return (curr_sess_count + vlib_get_n_threads () <
am->fa_conn_table_max_entries);
}
am->fa_conn_table_max_entries);
}
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
ptd = cmt->per_thread_data + i;
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
ptd = cmt->per_thread_data + i;
- numa = vlib_mains[i]->numa_node;
+ numa = vlib_get_main_by_index (i)->numa_node;
ptd->aad_buf = rte_zmalloc_socket (0, CRYPTODEV_NB_CRYPTO_OPS *
CRYPTODEV_MAX_AAD_SIZE,
ptd->aad_buf = rte_zmalloc_socket (0, CRYPTODEV_NB_CRYPTO_OPS *
CRYPTODEV_MAX_AAD_SIZE,
vec_reset_length (event_data);
int i;
vec_reset_length (event_data);
int i;
- if (vec_len (vlib_mains) == 0)
+ if (vlib_get_n_threads () == 0)
vec_add1 (worker_vms, vm);
else
{
vec_add1 (worker_vms, vm);
else
{
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- worker_vm = vlib_mains[i];
+ worker_vm = vlib_get_main_by_index (i);
if (worker_vm)
vec_add1 (worker_vms, worker_vm);
}
if (worker_vm)
vec_add1 (worker_vms, worker_vm);
}
/* Turn on the builtin client input nodes */
for (i = 0; i < thread_main->n_vlib_mains; i++)
/* Turn on the builtin client input nodes */
for (i = 0; i < thread_main->n_vlib_mains; i++)
- vlib_node_set_state (vlib_mains[i], echo_clients_node.index,
+ vlib_node_set_state (vlib_get_main_by_index (i), echo_clients_node.index,
VLIB_NODE_STATE_POLLING);
if (preallocate_sessions)
VLIB_NODE_STATE_POLLING);
if (preallocate_sessions)
http_process_free (http_server_args * args)
{
vlib_node_runtime_t *rt;
http_process_free (http_server_args * args)
{
vlib_node_runtime_t *rt;
- vlib_main_t *vm = &vlib_global_main;
+ vlib_main_t *vm = vlib_get_first_main ();
http_server_main_t *hsm = &http_server_main;
vlib_node_t *n;
u32 node_index;
http_server_main_t *hsm = &http_server_main;
vlib_node_t *n;
u32 node_index;
if (vec_len (mmp->before_per_thread) == 0)
{
mdata_none.node_index = ~0;
if (vec_len (mmp->before_per_thread) == 0)
{
mdata_none.node_index = ~0;
- vec_validate (mmp->before_per_thread, vec_len (vlib_mains) - 1);
+ vec_validate (mmp->before_per_thread, vlib_get_n_threads () - 1);
}
/* Reset the per-node accumulator, see vec_validate_init_empty above */
vec_reset_length (mmp->modifies);
}
/* Reset the per-node accumulator, see vec_validate_init_empty above */
vec_reset_length (mmp->modifies);
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- if (vlib_mains[i] == 0)
+ vlib_main_t *ovm = vlib_get_main_by_index (i);
+ if (ovm == 0)
- clib_callback_data_enable_disable
- (&vlib_mains[i]->vlib_node_runtime_perf_callbacks,
- mdata_trace_callback, enable_disable);
+ clib_callback_data_enable_disable (
+ &ovm->vlib_node_runtime_perf_callbacks, mdata_trace_callback,
+ enable_disable);
thread_index);
u8 tx_queues = vec_len (mif->tx_queues);
thread_index);
u8 tx_queues = vec_len (mif->tx_queues);
- if (tx_queues < vec_len (vlib_mains))
+ if (tx_queues < vlib_get_n_threads ())
{
ASSERT (tx_queues > 0);
mq = vec_elt_at_index (mif->tx_queues, thread_index % tx_queues);
{
ASSERT (tx_queues > 0);
mq = vec_elt_at_index (mif->tx_queues, thread_index % tx_queues);
mq->int_clib_file_index);
}
ti = vnet_hw_if_get_rx_queue_thread_index (vnm, qi);
mq->int_clib_file_index);
}
ti = vnet_hw_if_get_rx_queue_thread_index (vnm, qi);
- mq->buffer_pool_index =
- vlib_buffer_pool_get_default_for_numa (vm, vlib_mains[ti]->numa_node);
+ mq->buffer_pool_index = vlib_buffer_pool_get_default_for_numa (
+ vm, vlib_get_main_by_index (ti)->numa_node);
rv = vnet_hw_if_set_rx_queue_mode (vnm, qi, VNET_HW_IF_RX_MODE_DEFAULT);
vnet_hw_if_update_runtime_data (vnm, mif->hw_if_index);
rv = vnet_hw_if_set_rx_queue_mode (vnm, qi, VNET_HW_IF_RX_MODE_DEFAULT);
vnet_hw_if_update_runtime_data (vnm, mif->hw_if_index);
#define MEMIF_DEFAULT_TX_QUEUES 1
#define MEMIF_DEFAULT_BUFFER_SIZE 2048
#define MEMIF_DEFAULT_TX_QUEUES 1
#define MEMIF_DEFAULT_BUFFER_SIZE 2048
-#define MEMIF_MAX_M2S_RING (vec_len (vlib_mains))
+#define MEMIF_MAX_M2S_RING (vlib_get_n_threads ())
#define MEMIF_MAX_S2M_RING 256
#define MEMIF_MAX_REGION 256
#define MEMIF_MAX_LOG2_RING_SIZE 14
#define MEMIF_MAX_S2M_RING 256
#define MEMIF_MAX_REGION 256
#define MEMIF_MAX_LOG2_RING_SIZE 14
if (PREDICT_FALSE (!silm->worker_vms))
{
if (PREDICT_FALSE (!silm->worker_vms))
{
- for (i = 1; i < vec_len (vlib_mains); i++)
- {
- worker_vm = vlib_mains[i];
- if (worker_vm)
- vec_add1 (silm->worker_vms, worker_vm);
- }
+ for (i = 1; i < vlib_get_n_threads (); i++)
+ {
+ worker_vm = vlib_get_main_by_index (i);
+ if (worker_vm)
+ vec_add1 (silm->worker_vms, worker_vm);
+ }
}
/* Trigger flush for each worker thread */
}
/* Trigger flush for each worker thread */
nat_ha_message_header_t *h;
ip4_header_t *ip;
udp_header_t *udp;
nat_ha_message_header_t *h;
ip4_header_t *ip;
udp_header_t *udp;
- vlib_main_t *vm = vlib_mains[thread_index];
+ vlib_main_t *vm = vlib_get_main_by_index (thread_index);
ip = vlib_buffer_get_current (b);
udp = ip4_next_header (ip);
ip = vlib_buffer_get_current (b);
udp = ip4_next_header (ip);
nat44_ei_main_t *nm = &nat44_ei_main;
nat_ha_main_t *ha = &nat_ha_main;
nat_ha_per_thread_data_t *td = &ha->per_thread_data[thread_index];
nat44_ei_main_t *nm = &nat44_ei_main;
nat_ha_main_t *ha = &nat_ha_main;
nat_ha_per_thread_data_t *td = &ha->per_thread_data[thread_index];
- vlib_main_t *vm = vlib_mains[thread_index];
+ vlib_main_t *vm = vlib_get_main_by_index (thread_index);
vlib_buffer_t *b = 0;
vlib_frame_t *f;
u32 bi = ~0, offset;
vlib_buffer_t *b = 0;
vlib_frame_t *f;
u32 bi = ~0, offset;
vlib_process_wait_for_event_or_clock (vm, 1.0);
event_type = vlib_process_get_events (vm, &event_data);
vec_reset_length (event_data);
vlib_process_wait_for_event_or_clock (vm, 1.0);
event_type = vlib_process_get_events (vm, &event_data);
vec_reset_length (event_data);
- for (ti = 0; ti < vec_len (vlib_mains); ti++)
+ for (ti = 0; ti < vlib_get_n_threads (); ti++)
{
if (ti >= vec_len (ha->per_thread_data))
continue;
{
if (ti >= vec_len (ha->per_thread_data))
continue;
- vlib_node_set_interrupt_pending (vlib_mains[ti],
+ vlib_node_set_interrupt_pending (vlib_get_main_by_index (ti),
nat_ha_worker_node.index);
}
}
nat_ha_worker_node.index);
}
}
static_bib->is_add = is_add;
static_bib->thread_index = thread_index;
static_bib->done = 0;
static_bib->is_add = is_add;
static_bib->thread_index = thread_index;
static_bib->done = 0;
- worker_vm = vlib_mains[thread_index];
+ worker_vm = vlib_get_main_by_index (thread_index);
if (worker_vm)
vlib_node_set_interrupt_pending (worker_vm,
nat64_static_bib_worker_node.index);
if (worker_vm)
vlib_node_set_interrupt_pending (worker_vm,
nat64_static_bib_worker_node.index);
int i;
uword event_type, *event_data = 0;
int i;
uword event_type, *event_data = 0;
- if (vec_len (vlib_mains) == 0)
+ if (vlib_get_n_threads () == 0)
vec_add1 (worker_vms, vm);
else
{
vec_add1 (worker_vms, vm);
else
{
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- worker_vm = vlib_mains[i];
+ worker_vm = vlib_get_main_by_index (i);
if (worker_vm)
vec_add1 (worker_vms, worker_vm);
}
if (worker_vm)
vec_add1 (worker_vms, worker_vm);
}
static void test_table(test_t *t, int no_tests) {
// walk through table of tests
int i;
static void test_table(test_t *t, int no_tests) {
// walk through table of tests
int i;
- vlib_main_t *vm = &vlib_global_main;
+ vlib_main_t *vm = vlib_get_first_main();
/* Generate packet data */
for (i = 0; i < no_tests; i++) {
/* Generate packet data */
for (i = 0; i < no_tests; i++) {
void test_performance(void) {
pnat_main_t *pm = &pnat_main;
int i;
void test_performance(void) {
pnat_main_t *pm = &pnat_main;
int i;
- vlib_main_t *vm = &vlib_global_main;
+ vlib_main_t *vm = vlib_get_first_main();
for (i = 0; i < sizeof(rules) / sizeof(rules[0]); i++) {
add_translation(&rules[i]);
for (i = 0; i < sizeof(rules) / sizeof(rules[0]); i++) {
add_translation(&rules[i]);
void test_checksum(void) {
int i;
void test_checksum(void) {
int i;
- vlib_main_t *vm = &vlib_global_main;
+ vlib_main_t *vm = vlib_get_first_main();
pnat_main_t *pm = &pnat_main;
test_t test = {
pnat_main_t *pm = &pnat_main;
test_t test = {
clib_mem_init(0, 3ULL << 30);
clib_mem_init(0, 3ULL << 30);
- vlib_main_t *vm = &vlib_global_main;
+ vlib_main_t *vm = vlib_get_first_main();
buffers_vector = buffer_init(buffers_vector, 256);
buffers_vector = buffer_init(buffers_vector, 256);
i = (!nsm->poll_main_thread && num_workers) ? 1 : 0;
for (; i < num_workers + 1; i++)
{
i = (!nsm->poll_main_thread && num_workers) ? 1 : 0;
for (; i < num_workers + 1; i++)
{
- vlib_main_t *this_vm = vlib_mains[i];
+ vlib_main_t *this_vm = vlib_get_main_by_index (i);
vlib_node_set_state (this_vm, nsim_input_node.index,
VLIB_NODE_STATE_POLLING);
vlib_node_set_state (this_vm, nsim_input_node.index,
VLIB_NODE_STATE_POLLING);
uword page_size = clib_mem_get_page_size ();
if (pm->is_running)
uword page_size = clib_mem_get_page_size ();
if (pm->is_running)
- for (int i = 0; i < vec_len (vlib_mains); i++)
- vlib_node_set_dispatch_wrapper (vlib_mains[i], 0);
+ for (int i = 0; i < vlib_get_n_threads (); i++)
+ vlib_node_set_dispatch_wrapper (vlib_get_main_by_index (i), 0);
for (int i = 0; i < vec_len (pm->fds_to_close); i++)
close (pm->fds_to_close[i]);
for (int i = 0; i < vec_len (pm->fds_to_close); i++)
close (pm->fds_to_close[i]);
{
vec_add2 (pm->default_instance_type, it, 1);
it->name = is_node ? "Thread/Node" : "Thread";
{
vec_add2 (pm->default_instance_type, it, 1);
it->name = is_node ? "Thread/Node" : "Thread";
- for (int i = 0; i < vec_len (vlib_mains); i++)
+ for (int i = 0; i < vlib_get_n_threads (); i++)
{
vlib_worker_thread_t *w = vlib_worker_threads + i;
perfmon_instance_t *in;
{
vlib_worker_thread_t *w = vlib_worker_threads + i;
perfmon_instance_t *in;
in->name = (char *) format (0, "%s (%u)%c", w->name, i, 0);
}
if (is_node)
in->name = (char *) format (0, "%s (%u)%c", w->name, i, 0);
}
if (is_node)
- vec_validate (pm->thread_runtimes, vec_len (vlib_mains) - 1);
+ vec_validate (pm->thread_runtimes, vlib_get_n_threads () - 1);
}
if (pm->active_bundle->type == PERFMON_BUNDLE_TYPE_NODE)
{
}
if (pm->active_bundle->type == PERFMON_BUNDLE_TYPE_NODE)
{
- for (int i = 0; i < vec_len (vlib_mains); i++)
- vlib_node_set_dispatch_wrapper (vlib_mains[i],
+ for (int i = 0; i < vlib_get_n_threads (); i++)
+ vlib_node_set_dispatch_wrapper (vlib_get_main_by_index (i),
perfmon_dispatch_wrapper);
}
pm->sample_time = vlib_time_now (vm);
perfmon_dispatch_wrapper);
}
pm->sample_time = vlib_time_now (vm);
if (pm->active_bundle->type == PERFMON_BUNDLE_TYPE_NODE)
{
if (pm->active_bundle->type == PERFMON_BUNDLE_TYPE_NODE)
{
- for (int i = 0; i < vec_len (vlib_mains); i++)
- vlib_node_set_dispatch_wrapper (vlib_mains[i], 0);
+ for (int i = 0; i < vlib_get_n_threads (); i++)
+ vlib_node_set_dispatch_wrapper (vlib_get_main_by_index (i), 0);
}
for (int i = 0; i < n_groups; i++)
}
for (int i = 0; i < n_groups; i++)
if (vec_len (client_trace_cache) == 0
&& (iterator_thread_id != ~0 || iterator_position != ~0))
{
if (vec_len (client_trace_cache) == 0
&& (iterator_thread_id != ~0 || iterator_position != ~0))
{
- vlib_worker_thread_barrier_sync (&vlib_global_main);
+ vlib_worker_thread_barrier_sync (vlib_get_first_main ());
/* Make a slot for each worker thread */
/* Make a slot for each worker thread */
- vec_validate (client_trace_cache, vec_len (vlib_mains) - 1);
+ vec_validate (client_trace_cache, vlib_get_n_threads () - 1);
i = 0;
/* *INDENT-OFF* */
i = 0;
/* *INDENT-OFF* */
i++;
}));
/* *INDENT-ON* */
i++;
}));
/* *INDENT-ON* */
- vlib_worker_thread_barrier_release (&vlib_global_main);
+ vlib_worker_thread_barrier_release (vlib_get_first_main ());
}
/* Save the cache, one way or the other */
}
/* Save the cache, one way or the other */
- s = format (s, "%U", format_vlib_trace, &vlib_global_main, th[0]);
+ s =
+ format (s, "%U", format_vlib_trace, vlib_get_first_main (), th[0]);
dmp = vl_msg_api_alloc (sizeof (*dmp) + vec_len (s));
dmp->_vl_msg_id =
dmp = vl_msg_api_alloc (sizeof (*dmp) + vec_len (s));
dmp->_vl_msg_id =
bp->data_size = data_size;
bp->numa_node = m->numa_node;
bp->data_size = data_size;
bp->numa_node = m->numa_node;
- vec_validate_aligned (bp->threads, vec_len (vlib_mains) - 1,
+ vec_validate_aligned (bp->threads, vlib_get_n_threads () - 1,
CLIB_CACHE_LINE_BYTES);
alloc_size = vlib_buffer_alloc_size (bm->ext_hdr_size, data_size);
CLIB_CACHE_LINE_BYTES);
alloc_size = vlib_buffer_alloc_size (bm->ext_hdr_size, data_size);
vec_foreach (bp, bm->buffer_pools)
{
clib_spinlock_lock (&bp->lock);
vec_foreach (bp, bm->buffer_pools)
{
clib_spinlock_lock (&bp->lock);
- vec_validate_aligned (bp->threads, vec_len (vlib_mains) - 1,
+ vec_validate_aligned (bp->threads, vlib_get_n_threads () - 1,
CLIB_CACHE_LINE_BYTES);
clib_spinlock_unlock (&bp->lock);
}
CLIB_CACHE_LINE_BYTES);
clib_spinlock_unlock (&bp->lock);
}
{
hf->n_vectors = VLIB_FRAME_SIZE;
vlib_put_frame_queue_elt (hf);
{
hf->n_vectors = VLIB_FRAME_SIZE;
vlib_put_frame_queue_elt (hf);
- vlib_mains[current_thread_index]->check_frame_queues = 1;
+ vlib_get_main_by_index (current_thread_index)->check_frame_queues =
+ 1;
current_thread_index = ~0;
ptd->handoff_queue_elt_by_thread_index[next_thread_index] = 0;
hf = 0;
current_thread_index = ~0;
ptd->handoff_queue_elt_by_thread_index[next_thread_index] = 0;
hf = 0;
if (1 || hf->n_vectors == hf->last_n_vectors)
{
vlib_put_frame_queue_elt (hf);
if (1 || hf->n_vectors == hf->last_n_vectors)
{
vlib_put_frame_queue_elt (hf);
- vlib_mains[i]->check_frame_queues = 1;
+ vlib_get_main_by_index (i)->check_frame_queues = 1;
ptd->handoff_queue_elt_by_thread_index[i] = 0;
}
else
ptd->handoff_queue_elt_by_thread_index[i] = 0;
}
else
#ifndef included_vlib_global_funcs_h_
#define included_vlib_global_funcs_h_
#ifndef included_vlib_global_funcs_h_
#define included_vlib_global_funcs_h_
+always_inline u32
+vlib_get_n_threads ()
+{
+ return vec_len (vlib_mains);
+}
+
always_inline vlib_main_t *
always_inline vlib_main_t *
+vlib_get_main_by_index (u32 thread_index)
- vm = vlib_mains[vlib_get_thread_index ()];
+ vm = vlib_mains[thread_index];
ASSERT (vm);
return vm;
}
ASSERT (vm);
return vm;
}
+always_inline vlib_main_t *
+vlib_get_main (void)
+{
+ return vlib_get_main_by_index (vlib_get_thread_index ());
+}
+
+always_inline vlib_main_t *
+vlib_get_first_main (void)
+{
+ return vlib_get_main_by_index (0);
+}
+
always_inline vlib_thread_main_t *
vlib_get_thread_main ()
{
always_inline vlib_thread_main_t *
vlib_get_thread_main ()
{
if (vec_len (stat_vms) == 0)
{
if (vec_len (stat_vms) == 0)
{
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- stat_vm = vlib_mains[i];
+ stat_vm = vlib_get_main_by_index (i);
if (stat_vm)
vec_add1 (stat_vms, stat_vm);
}
if (stat_vm)
vec_add1 (stat_vms, stat_vm);
}
{
n->function = fnr->function;
{
n->function = fnr->function;
- for (int i = 0; i < vec_len (vlib_mains); i++)
+ for (int i = 0; i < vlib_get_n_threads (); i++)
{
vlib_node_runtime_t *nrt;
{
vlib_node_runtime_t *nrt;
- nrt = vlib_node_get_runtime (vlib_mains[i], n->index);
+ nrt =
+ vlib_node_get_runtime (vlib_get_main_by_index (i), n->index);
nrt->function = fnr->function;
}
return 0;
nrt->function = fnr->function;
}
return 0;
/* Updating the stats for multithreaded use cases.
* We need to dup the nodes to sum the stats from all threads.*/
nodes = vec_dup (nm->nodes);
/* Updating the stats for multithreaded use cases.
* We need to dup the nodes to sum the stats from all threads.*/
nodes = vec_dup (nm->nodes);
- for (i = 1; i < vec_len (vlib_mains); i++)
+ for (i = 1; i < vlib_get_n_threads (); i++)
{
vlib_node_main_t *nm_clone;
vlib_main_t *vm_clone;
vlib_node_runtime_t *rt;
vlib_node_t *n;
{
vlib_node_main_t *nm_clone;
vlib_main_t *vm_clone;
vlib_node_runtime_t *rt;
vlib_node_t *n;
- vm_clone = vlib_mains[i];
+ vm_clone = vlib_get_main_by_index (i);
nm_clone = &vm_clone->node_main;
for (j = 0; j < vec_len (nm_clone->nodes); j++)
nm_clone = &vm_clone->node_main;
for (j = 0; j < vec_len (nm_clone->nodes); j++)
|| unformat (input, "su"))
summary = 1;
|| unformat (input, "su"))
summary = 1;
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- stat_vm = vlib_mains[i];
+ stat_vm = vlib_get_main_by_index (i);
if (stat_vm)
vec_add1 (stat_vms, stat_vm);
}
if (stat_vm)
vec_add1 (stat_vms, stat_vm);
}
- if (vec_len (vlib_mains) > 1)
+ if (vlib_get_n_threads () > 1)
{
vlib_worker_thread_t *w = vlib_worker_threads + j;
if (j > 0)
{
vlib_worker_thread_t *w = vlib_worker_threads + j;
if (j > 0)
vlib_main_t **stat_vms = 0, *stat_vm;
vlib_node_runtime_t *r;
vlib_main_t **stat_vms = 0, *stat_vm;
vlib_node_runtime_t *r;
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- stat_vm = vlib_mains[i];
+ stat_vm = vlib_get_main_by_index (i);
if (stat_vm)
vec_add1 (stat_vms, stat_vm);
}
if (stat_vm)
vec_add1 (stat_vms, stat_vm);
}
s = format (s, "\n%8s %=12s %=12s %=12s %=12s %=12s\n", "Thread", "Calls",
"Clocks", "Vectors", "Max Clock", "Max Vectors");
s = format (s, "\n%8s %=12s %=12s %=12s %=12s %=12s\n", "Thread", "Calls",
"Clocks", "Vectors", "Max Clock", "Max Vectors");
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- n = vlib_get_node (vlib_mains[i], node_index);
- vlib_node_sync_stats (vlib_mains[i], n);
+ n = vlib_get_node (vlib_get_main_by_index (i), node_index);
+ vlib_node_sync_stats (vlib_get_main_by_index (i), n);
cl = n->stats_total.clocks - n->stats_last_clear.clocks;
ca = n->stats_total.calls - n->stats_last_clear.calls;
cl = n->stats_total.clocks - n->stats_last_clear.clocks;
ca = n->stats_total.calls - n->stats_last_clear.calls;
__os_thread_index = w - vlib_worker_threads;
__os_thread_index = w - vlib_worker_threads;
- vlib_process_start_switch_stack (vlib_mains[__os_thread_index], 0);
+ vlib_process_start_switch_stack (vlib_get_main_by_index (__os_thread_index),
+ 0);
rv = (void *) clib_calljmp
((uword (*)(uword)) w->thread_function,
(uword) arg, w->thread_stack + VLIB_THREAD_STACK_SIZE);
rv = (void *) clib_calljmp
((uword (*)(uword)) w->thread_function,
(uword) arg, w->thread_stack + VLIB_THREAD_STACK_SIZE);
ASSERT (vlib_get_thread_index () == 0);
ASSERT (vlib_get_thread_index () == 0);
+ vm = vlib_get_first_main ();
nm = &vm->node_main;
ASSERT (*vlib_worker_threads->wait_at_barrier == 1);
nm = &vm->node_main;
ASSERT (*vlib_worker_threads->wait_at_barrier == 1);
vlib_node_sync_stats (vm, n);
}
vlib_node_sync_stats (vm, n);
}
- for (i = 1; i < vec_len (vlib_mains); i++)
+ for (i = 1; i < vlib_get_n_threads (); i++)
- vm_clone = vlib_mains[i];
+ vm_clone = vlib_get_main_by_index (i);
nm_clone = &vm_clone->node_main;
for (j = 0; j < vec_len (nm_clone->nodes); j++)
nm_clone = &vm_clone->node_main;
for (j = 0; j < vec_len (nm_clone->nodes); j++)
+ vm = vlib_get_first_main ();
nm = &vm->node_main;
vm_clone = vlib_get_main ();
nm_clone = &vm_clone->node_main;
nm = &vm->node_main;
vm_clone = vlib_get_main ();
nm_clone = &vm_clone->node_main;
{
f64 deadline;
f64 now = vlib_time_now (vm);
{
f64 deadline;
f64 now = vlib_time_now (vm);
- u32 count = vec_len (vlib_mains) - 1;
+ u32 count = vlib_get_n_threads () - 1;
/* No worker threads? */
if (count == 0)
/* No worker threads? */
if (count == 0)
u8
vlib_worker_thread_barrier_held (void)
{
u8
vlib_worker_thread_barrier_held (void)
{
- if (vec_len (vlib_mains) < 2)
+ if (vlib_get_n_threads () < 2)
return (1);
return (*vlib_worker_threads->wait_at_barrier == 1);
return (1);
return (*vlib_worker_threads->wait_at_barrier == 1);
- if (vec_len (vlib_mains) < 2)
+ if (vlib_get_n_threads () < 2)
return;
ASSERT (vlib_get_thread_index () == 0);
vlib_worker_threads[0].barrier_caller = func_name;
return;
ASSERT (vlib_get_thread_index () == 0);
vlib_worker_threads[0].barrier_caller = func_name;
- count = vec_len (vlib_mains) - 1;
+ count = vlib_get_n_threads () - 1;
/* Record entry relative to last close */
now = vlib_time_now (vm);
/* Record entry relative to last close */
now = vlib_time_now (vm);
* the barrier hold-down timer.
*/
max_vector_rate = 0.0;
* the barrier hold-down timer.
*/
max_vector_rate = 0.0;
- for (i = 1; i < vec_len (vlib_mains); i++)
- max_vector_rate =
- clib_max (max_vector_rate,
- (f64) vlib_last_vectors_per_main_loop (vlib_mains[i]));
+ for (i = 1; i < vlib_get_n_threads (); i++)
+ {
+ vlib_main_t *ovm = vlib_get_main_by_index (i);
+ max_vector_rate = clib_max (max_vector_rate,
+ (f64) vlib_last_vectors_per_main_loop (ovm));
+ }
vlib_worker_threads[0].barrier_sync_count++;
vlib_worker_threads[0].barrier_sync_count++;
f64 t_update_main = 0.0;
int refork_needed = 0;
f64 t_update_main = 0.0;
int refork_needed = 0;
- if (vec_len (vlib_mains) < 2)
+ if (vlib_get_n_threads () < 2)
return;
ASSERT (vlib_get_thread_index () == 0);
return;
ASSERT (vlib_get_thread_index () == 0);
/* Do per thread rebuilds in parallel */
refork_needed = 1;
clib_atomic_fetch_add (vlib_worker_threads->node_reforks_required,
/* Do per thread rebuilds in parallel */
refork_needed = 1;
clib_atomic_fetch_add (vlib_worker_threads->node_reforks_required,
- (vec_len (vlib_mains) - 1));
+ (vlib_get_n_threads () - 1));
now = vlib_time_now (vm);
t_update_main = now - vm->barrier_epoch;
}
now = vlib_time_now (vm);
t_update_main = now - vm->barrier_epoch;
}
{
ASSERT (vlib_get_thread_index () == 0);
{
ASSERT (vlib_get_thread_index () == 0);
- if (vec_len (vlib_mains) < 2)
+ if (vlib_get_n_threads () < 2)
return;
if (vlib_worker_thread_barrier_held ())
return;
if (vlib_worker_thread_barrier_held ())
- vec_validate (counts, vec_len (vlib_mains) - 1);
+ vec_validate (counts, vlib_get_n_threads () - 1);
/* record the current loop counts */
vec_foreach_index (ii, vlib_mains)
/* record the current loop counts */
vec_foreach_index (ii, vlib_mains)
verbose, format_clib_timebase_time,
clib_timebase_now (tb));
verbose, format_clib_timebase_time,
clib_timebase_now (tb));
- if (vec_len (vlib_mains) == 1)
+ if (vlib_get_n_threads () == 1)
return 0;
vlib_cli_output (vm, "Time last barrier release %.9f",
vm->time_last_barrier_release);
return 0;
vlib_cli_output (vm, "Time last barrier release %.9f",
vm->time_last_barrier_release);
- for (i = 1; i < vec_len (vlib_mains); i++)
+ for (i = 1; i < vlib_get_n_threads (); i++)
- if (vlib_mains[i] == 0)
+ vlib_main_t *ovm = vlib_get_main_by_index (i);
+ if (ovm == 0)
- vlib_cli_output (vm, "%d: %U", i, format_clib_time,
- &vlib_mains[i]->clib_time, verbose);
+ vlib_cli_output (vm, "%d: %U", i, format_clib_time, &ovm->clib_time,
+ verbose);
- vlib_cli_output (vm, "Thread %d offset %.9f error %.9f", i,
- vlib_mains[i]->time_offset,
- vm->time_last_barrier_release -
- vlib_mains[i]->time_last_barrier_release);
+ vlib_cli_output (
+ vm, "Thread %d offset %.9f error %.9f", i, ovm->time_offset,
+ vm->time_last_barrier_release - ovm->time_last_barrier_release);
vlib_main_t *vm;
vlib_thread_main_t *tm = &vlib_thread_main;
ASSERT (worker_index < tm->n_vlib_mains - 1);
vlib_main_t *vm;
vlib_thread_main_t *tm = &vlib_thread_main;
ASSERT (worker_index < tm->n_vlib_mains - 1);
- vm = vlib_mains[worker_index + 1];
+ vm = vlib_get_main_by_index (worker_index + 1);
ASSERT (vm);
return vm;
}
ASSERT (vm);
return vm;
}
* the same new name.
* Then, throw away the old shared name-vector.
*/
* the same new name.
* Then, throw away the old shared name-vector.
*/
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- this_vlib_main = vlib_mains[i];
+ this_vlib_main = vlib_get_main_by_index (i);
if (this_vlib_main == 0)
continue;
n = vlib_get_node (this_vlib_main,
if (this_vlib_main == 0)
continue;
n = vlib_get_node (this_vlib_main,
}
node->input_main_loops_per_call = 0;
}
}
node->input_main_loops_per_call = 0;
}
- else if (is_main == 0 && vector_rate < 2
- && (vlib_global_main.time_last_barrier_release + 0.5 < now)
- && nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] == 0)
+ else if (is_main == 0 && vector_rate < 2 &&
+ (vlib_get_first_main ()->time_last_barrier_release + 0.5 < now) &&
+ nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] == 0)
{
timeout = 10e-3;
timeout_ms = max_timeout_ms;
{
timeout = 10e-3;
timeout_ms = max_timeout_ms;
int
vlib_unix_main (int argc, char *argv[])
{
int
vlib_unix_main (int argc, char *argv[])
{
- vlib_main_t *vm = &vlib_global_main; /* one and only time for this! */
+ vlib_main_t *vm = vlib_get_first_main (); /* one and only time for this! */
unformat_input_t input;
clib_error_t *e;
int i;
unformat_input_t input;
clib_error_t *e;
int i;
void
vl_api_send_pending_rpc_requests (vlib_main_t * vm)
{
void
vl_api_send_pending_rpc_requests (vlib_main_t * vm)
{
- vlib_main_t *vm_global = &vlib_global_main;
+ vlib_main_t *vm_global = vlib_get_first_main ();
ASSERT (vm != vm_global);
ASSERT (vm != vm_global);
u8 force_rpc)
{
vl_api_rpc_call_t *mp;
u8 force_rpc)
{
vl_api_rpc_call_t *mp;
- vlib_main_t *vm_global = &vlib_global_main;
+ vlib_main_t *vm_global = vlib_get_first_main ();
vlib_main_t *vm = vlib_get_main ();
/* Main thread and not a forced RPC: call the function directly */
vlib_main_t *vm = vlib_get_main ();
/* Main thread and not a forced RPC: call the function directly */
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
- vlib_node_state_t state =
- vlib_node_get_state (vlib_mains[i], cm->crypto_node_index);
+ vlib_node_state_t state = vlib_node_get_state (
+ vlib_get_main_by_index (i), cm->crypto_node_index);
if (state == VLIB_NODE_STATE_POLLING)
vlib_cli_output (vm, "threadId: %-6d POLLING", i);
if (state == VLIB_NODE_STATE_INTERRUPT)
if (state == VLIB_NODE_STATE_POLLING)
vlib_cli_output (vm, "threadId: %-6d POLLING", i);
if (state == VLIB_NODE_STATE_INTERRUPT)
if (state_change)
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
if (state_change)
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
- if (state !=
- vlib_node_get_state (vlib_mains[i], cm->crypto_node_index))
- vlib_node_set_state (vlib_mains[i], cm->crypto_node_index, state);
+ vlib_main_t *ovm = vlib_get_main_by_index (i);
+ if (state != vlib_node_get_state (ovm, cm->crypto_node_index))
+ vlib_node_set_state (ovm, cm->crypto_node_index, state);
if (state_change)
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
if (state_change)
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
- if (state !=
- vlib_node_get_state (vlib_mains[i], cm->crypto_node_index))
- vlib_node_set_state (vlib_mains[i], cm->crypto_node_index, state);
+ vlib_main_t *ovm = vlib_get_main_by_index (i);
+ if (state != vlib_node_get_state (ovm, cm->crypto_node_index))
+ vlib_node_set_state (ovm, cm->crypto_node_index, state);
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
for (i = skip_master; i < tm->n_vlib_mains; i++)
{
- if (state != vlib_node_get_state (vlib_mains[i], cm->crypto_node_index))
- vlib_node_set_state (vlib_mains[i], cm->crypto_node_index, state);
+ vlib_main_t *ovm = vlib_get_main_by_index (i);
+ if (state != vlib_node_get_state (ovm, cm->crypto_node_index))
+ vlib_node_set_state (ovm, cm->crypto_node_index, state);
if (cm->dispatch_mode == VNET_CRYPTO_ASYNC_DISPATCH_INTERRUPT)
{
for (; i < tm->n_vlib_mains; i++)
if (cm->dispatch_mode == VNET_CRYPTO_ASYNC_DISPATCH_INTERRUPT)
{
for (; i < tm->n_vlib_mains; i++)
- vlib_node_set_interrupt_pending (vlib_mains[i],
+ vlib_node_set_interrupt_pending (vlib_get_main_by_index (i),
cm->crypto_node_index);
}
}
cm->crypto_node_index);
}
}
if (cm->dispatch_mode == VNET_CRYPTO_ASYNC_DISPATCH_INTERRUPT
&& n_elts > 0)
{
if (cm->dispatch_mode == VNET_CRYPTO_ASYNC_DISPATCH_INTERRUPT
&& n_elts > 0)
{
- vlib_node_set_interrupt_pending (vlib_mains[enqueue_thread_idx],
- cm->crypto_node_index);
+ vlib_node_set_interrupt_pending (
+ vlib_get_main_by_index (enqueue_thread_idx),
+ cm->crypto_node_index);
vnet_hw_if_rx_queue_t *rxq;
vnet_hw_if_rxq_poll_vector_t *pv, **d = 0;
vlib_node_state_t *per_thread_node_state = 0;
vnet_hw_if_rx_queue_t *rxq;
vnet_hw_if_rxq_poll_vector_t *pv, **d = 0;
vlib_node_state_t *per_thread_node_state = 0;
- u32 n_threads = vec_len (vlib_mains);
+ u32 n_threads = vlib_get_n_threads ();
u16 *per_thread_node_adaptive = 0;
int something_changed = 0;
clib_bitmap_t *pending_int = 0;
u16 *per_thread_node_adaptive = 0;
int something_changed = 0;
clib_bitmap_t *pending_int = 0;
* unnecesary barrier */
for (int i = 0; i < n_threads; i++)
{
* unnecesary barrier */
for (int i = 0; i < n_threads; i++)
{
+ vlib_main_t *ovm = vlib_get_main_by_index (i);
vlib_node_state_t old_state;
vec_sort_with_function (d[i], poll_data_sort);
vlib_node_state_t old_state;
vec_sort_with_function (d[i], poll_data_sort);
- old_state = vlib_node_get_state (vlib_mains[i], node_index);
+ old_state = vlib_node_get_state (ovm, node_index);
if (per_thread_node_state[i] != old_state)
{
something_changed = 1;
if (per_thread_node_state[i] != old_state)
{
something_changed = 1;
if (something_changed == 0)
{
vnet_hw_if_rx_node_runtime_t *rt;
if (something_changed == 0)
{
vnet_hw_if_rx_node_runtime_t *rt;
- rt = vlib_node_get_runtime_data (vlib_mains[i], node_index);
+ rt = vlib_node_get_runtime_data (ovm, node_index);
if (vec_len (rt->rxq_poll_vector) != vec_len (d[i]))
something_changed = 1;
else if (memcmp (d[i], rt->rxq_poll_vector,
if (vec_len (rt->rxq_poll_vector) != vec_len (d[i]))
something_changed = 1;
else if (memcmp (d[i], rt->rxq_poll_vector,
for (int i = 0; i < n_threads; i++)
{
for (int i = 0; i < n_threads; i++)
{
- vlib_main_t *vm = vlib_mains[i];
+ vlib_main_t *vm = vlib_get_main_by_index (i);
vnet_hw_if_rx_node_runtime_t *rt;
rt = vlib_node_get_runtime_data (vm, node_index);
pv = rt->rxq_poll_vector;
vnet_hw_if_rx_node_runtime_t *rt;
rt = vlib_node_get_runtime_data (vm, node_index);
pv = rt->rxq_poll_vector;
{
vnet_hw_if_rx_queue_t *rxq = vnet_hw_if_get_rx_queue (vnm, queue_index);
vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, rxq->hw_if_index);
{
vnet_hw_if_rx_queue_t *rxq = vnet_hw_if_get_rx_queue (vnm, queue_index);
vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, rxq->hw_if_index);
- vlib_main_t *vm = vlib_mains[rxq->thread_index];
+ vlib_main_t *vm = vlib_get_main_by_index (rxq->thread_index);
vnet_hw_if_rx_node_runtime_t *rt;
if (PREDICT_FALSE (rxq->mode != VNET_HW_IF_RX_MODE_INTERRUPT &&
rxq->mode != VNET_HW_IF_RX_MODE_ADAPTIVE))
vnet_hw_if_rx_node_runtime_t *rt;
if (PREDICT_FALSE (rxq->mode != VNET_HW_IF_RX_MODE_INTERRUPT &&
rxq->mode != VNET_HW_IF_RX_MODE_ADAPTIVE))
application_t *app;
int i, n_threads;
application_t *app;
int i, n_threads;
- n_threads = vec_len (vlib_mains);
+ n_threads = vlib_get_n_threads ();
for (i = 0; i < n_threads; i++)
{
for (i = 0; i < n_threads; i++)
{
wrk->ctrl_head = clib_llist_make_head (wrk->event_elts, evt_list);
wrk->new_head = clib_llist_make_head (wrk->event_elts, evt_list);
wrk->old_head = clib_llist_make_head (wrk->event_elts, evt_list);
wrk->ctrl_head = clib_llist_make_head (wrk->event_elts, evt_list);
wrk->new_head = clib_llist_make_head (wrk->event_elts, evt_list);
wrk->old_head = clib_llist_make_head (wrk->event_elts, evt_list);
- wrk->vm = vlib_mains[i];
+ wrk->vm = vlib_get_main_by_index (i);
wrk->last_vlib_time = vlib_time_now (vm);
wrk->last_vlib_us_time = wrk->last_vlib_time * CLIB_US_TIME_FREQ;
vec_validate (wrk->session_to_enqueue, smm->last_transport_proto_type);
wrk->last_vlib_time = vlib_time_now (vm);
wrk->last_vlib_us_time = wrk->last_vlib_time * CLIB_US_TIME_FREQ;
vec_validate (wrk->session_to_enqueue, smm->last_transport_proto_type);
void
dump_thread_0_event_queue (void)
{
void
dump_thread_0_event_queue (void)
{
- vlib_main_t *vm = &vlib_global_main;
+ vlib_main_t *vm = vlib_get_first_main ();
u32 my_thread_index = vm->thread_index;
session_event_t _e, *e = &_e;
svm_msg_q_shared_queue_t *sq;
u32 my_thread_index = vm->thread_index;
session_event_t _e, *e = &_e;
svm_msg_q_shared_queue_t *sq;
static clib_error_t *
session_queue_exit (vlib_main_t * vm)
{
static clib_error_t *
session_queue_exit (vlib_main_t * vm)
{
- if (vec_len (vlib_mains) < 2)
+ if (vlib_get_n_threads () < 2)
vec_reset_length (wrk->pending_deq_acked);
vec_reset_length (wrk->pending_disconnects);
vec_reset_length (wrk->pending_resets);
vec_reset_length (wrk->pending_deq_acked);
vec_reset_length (wrk->pending_disconnects);
vec_reset_length (wrk->pending_resets);
- wrk->vm = vlib_mains[thread];
+ wrk->vm = vlib_get_main_by_index (thread);
wrk->max_timers_per_loop = 10;
if (thread > 0)
wrk->max_timers_per_loop = 10;
if (thread > 0)
- s = format (s, "Packet %d\n%U\n\n", i + 1,
- format_vlib_trace, vlib_mains[0], traces[i]);
+ s = format (s, "Packet %d\n%U\n\n", i + 1, format_vlib_trace,
+ vlib_get_first_main (), traces[i]);
/* Initial wait for the world to settle down */
vlib_process_suspend (vm, 5.0);
/* Initial wait for the world to settle down */
vlib_process_suspend (vm, 5.0);
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
vec_add1 (gm->my_vlib_mains, vlib_mains[i]);
while (1)
vec_add1 (gm->my_vlib_mains, vlib_mains[i]);
while (1)
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
- this_vlib_main = vlib_mains[i];
+ this_vlib_main = vlib_get_main_by_index (i);
this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
vlib_clear_internal_node_vector_rate (this_vlib_main);
this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
vlib_clear_internal_node_vector_rate (this_vlib_main);