diff options
Diffstat (limited to 'vlib')
-rw-r--r-- | vlib/vlib/main.h | 1 | ||||
-rw-r--r-- | vlib/vlib/node.c | 26 | ||||
-rw-r--r-- | vlib/vlib/threads.c | 4 | ||||
-rw-r--r-- | vlib/vlib/unix/main.c | 10 | ||||
-rw-r--r-- | vlib/vlib/unix/physmem.c | 5 |
5 files changed, 35 insertions, 11 deletions
diff --git a/vlib/vlib/main.h b/vlib/vlib/main.h index 5a8d745661b..1a110459826 100644 --- a/vlib/vlib/main.h +++ b/vlib/vlib/main.h @@ -171,6 +171,7 @@ typedef struct vlib_main_t { /* control-plane API queue signal pending */ volatile u32 queue_signal_pending; void (*queue_signal_callback)(struct vlib_main_t *); + u8 **argv; } vlib_main_t; /* Global main structure. */ diff --git a/vlib/vlib/node.c b/vlib/vlib/node.c index 4fb117e4f3e..66a2d09fdb8 100644 --- a/vlib/vlib/node.c +++ b/vlib/vlib/node.c @@ -262,7 +262,7 @@ static void node_elog_init (vlib_main_t * vm, uword ni) } #ifdef CLIB_UNIX -#define STACK_ALIGN 4096 +#define STACK_ALIGN (clib_mem_get_page_size()) #else #define STACK_ALIGN CLIB_CACHE_LINE_BYTES #endif @@ -272,6 +272,7 @@ static void register_node (vlib_main_t * vm, { vlib_node_main_t * nm = &vm->node_main; vlib_node_t * n; + u32 page_size = clib_mem_get_page_size(); int i; if (CLIB_DEBUG > 0) @@ -363,9 +364,26 @@ static void register_node (vlib_main_t * vm, log2_n_stack_bytes = clib_max (r->process_log2_n_stack_bytes, 15); - p = clib_mem_alloc_aligned_no_fail +#ifdef CLIB_UNIX + /* + * Bump the stack size if running over a kernel with a large page size, + * and the stack isn't any too big to begin with. Otherwise, we'll + * trip over the stack guard page for sure. + */ + if ((page_size > (4<<10)) && log2_n_stack_bytes < 19) + { + if ((1<<log2_n_stack_bytes) <= page_size) + log2_n_stack_bytes = min_log2 (page_size) + 1; + else + log2_n_stack_bytes++; + } +#endif + + p = clib_mem_alloc_aligned_at_offset (sizeof (p[0]) + (1 << log2_n_stack_bytes), - STACK_ALIGN); + STACK_ALIGN, STRUCT_OFFSET_OF (vlib_process_t, stack)); + if (p == 0) + clib_panic ("failed to allocate process stack (%d bytes)", 1<<log2_n_stack_bytes); memset (p, 0, sizeof (p[0])); p->log2_n_stack_bytes = log2_n_stack_bytes; @@ -388,7 +406,7 @@ static void register_node (vlib_main_t * vm, * Disallow writes to the bottom page of the stack, to * catch stack overflows. */ - if (mprotect (p->stack, 4096, PROT_READ) < 0) + if (mprotect (p->stack, page_size, PROT_READ) < 0) clib_unix_warning ("process stack"); #endif diff --git a/vlib/vlib/threads.c b/vlib/vlib/threads.c index 73abba83f70..3eed1080d31 100644 --- a/vlib/vlib/threads.c +++ b/vlib/vlib/threads.c @@ -1025,7 +1025,7 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input) VLIB_EARLY_CONFIG_FUNCTION (cpu_config, "cpu"); -#if !defined (__x86_64__) +#if !defined (__x86_64__) && !defined (__aarch64__) && !defined (__powerpc64__) void __sync_fetch_and_add_8 (void) { fformat(stderr, "%s called\n", __FUNCTION__); @@ -1128,6 +1128,7 @@ show_threads_fn (vlib_main_t * vm, "ID", "Name", "Type", "LWP", "lcore", "Core", "Socket", "State"); +#if !defined(__powerpc64__) for (i = 0; i < vec_len(vlib_worker_threads); i++) { w = vlib_worker_threads + i; @@ -1166,6 +1167,7 @@ show_threads_fn (vlib_main_t * vm, vlib_cli_output(vm, "%v", line); vec_free(line); } +#endif return 0; } diff --git a/vlib/vlib/unix/main.c b/vlib/vlib/unix/main.c index b85f3e73326..1aac32759a8 100644 --- a/vlib/vlib/unix/main.c +++ b/vlib/vlib/unix/main.c @@ -397,15 +397,13 @@ VLIB_MAIN_LOOP_EXIT_FUNCTION (unix_exit); u8 **vlib_thread_stacks; -static char **argv_global; - static uword thread0 (uword arg) { vlib_main_t * vm = (vlib_main_t *)arg; unformat_input_t input; int i; - unformat_init_command_line (&input, argv_global); + unformat_init_command_line (&input, vm->argv); i = vlib_main (vm, &input); unformat_free (&input); @@ -423,7 +421,7 @@ int vlib_unix_main (int argc, char * argv[]) clib_error_t * e; int i; - argv_global = argv; + vm->argv = (u8 **)argv; vm->name = argv[0]; vm->heap_base = clib_mem_get_heap (); ASSERT(vm->heap_base); @@ -432,7 +430,7 @@ int vlib_unix_main (int argc, char * argv[]) if (i) return i; - unformat_init_command_line (&input, argv_global); + unformat_init_command_line (&input, vm->argv); vm->init_functions_called = hash_create (0, /* value bytes */ 0); e = vlib_call_all_config_functions (vm, &input, 1 /* early */); if (e != 0) @@ -459,7 +457,7 @@ int vlib_unix_main (int argc, char * argv[]) * Disallow writes to the bottom page of the stack, to * catch stack overflows. */ - if (mprotect (thread_stacks, 4096, PROT_READ) < 0) + if (mprotect (thread_stacks, clib_mem_get_page_size(), PROT_READ) < 0) clib_unix_warning ("thread stack"); thread_stacks += VLIB_THREAD_STACK_SIZE; diff --git a/vlib/vlib/unix/physmem.c b/vlib/vlib/unix/physmem.c index 83b40be6449..d7428c9b227 100644 --- a/vlib/vlib/unix/physmem.c +++ b/vlib/vlib/unix/physmem.c @@ -261,6 +261,11 @@ clib_error_t * unix_physmem_init (vlib_main_t * vm, int physical_memory_required else error = clib_error_return (0, "uio_dma deprecated"); + vpm->page_mask = pow2_mask (vpm->log2_n_bytes_per_page); + vpm->virtual.start = pointer_to_uword (pm->mem); + vpm->virtual.size = pm->mem_size; + vpm->virtual.end = vpm->virtual.start + vpm->virtual.size; + if (using_fake_memory) fformat(stderr, "%s: use fake dma pages\n", __FUNCTION__); else |