X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Ffreebsd%2Feal.c;h=e2cdad528376da48f6befc597ddee942f54024e4;hb=378cd4887d6c02bf771eee3a8b56a3af41f37b7c;hp=040b1b7ee5c1f32b3f2519fbbf3ad4a836ce23bd;hpb=598be723953889a6e0af410c82c223dee8381dab;p=dpdk.git diff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c index 040b1b7ee5..e2cdad5283 100644 --- a/lib/librte_eal/freebsd/eal.c +++ b/lib/librte_eal/freebsd/eal.c @@ -41,7 +41,6 @@ #include #include #include -#include #include #include @@ -400,6 +399,10 @@ rte_config_init(void) } if (rte_eal_config_reattach() < 0) return -1; + if (!__rte_mp_enable()) { + RTE_LOG(ERR, EAL, "Primary process refused secondary attachment\n"); + return -1; + } eal_mcfg_update_internal(); break; case RTE_PROC_AUTO: @@ -622,10 +625,10 @@ eal_check_mem_on_local_socket(void) int socket_id; const struct rte_config *config = rte_eal_get_configuration(); - socket_id = rte_lcore_to_socket_id(config->master_lcore); + socket_id = rte_lcore_to_socket_id(config->main_lcore); if (rte_memseg_list_walk(check_socket, &socket_id) == 0) - RTE_LOG(WARNING, EAL, "WARNING: Master core has no memory on local socket!\n"); + RTE_LOG(WARNING, EAL, "WARNING: Main core has no memory on local socket!\n"); } @@ -661,7 +664,8 @@ rte_eal_init(int argc, char **argv) { int i, fctret, ret; pthread_t thread_id; - static rte_atomic32_t run_once = RTE_ATOMIC32_INIT(0); + static uint32_t run_once; + uint32_t has_run = 0; char cpuset[RTE_CPU_AFFINITY_STR_LEN]; char thread_name[RTE_MAX_THREAD_NAME_LEN]; const struct rte_config *config = rte_eal_get_configuration(); @@ -675,7 +679,8 @@ rte_eal_init(int argc, char **argv) return -1; } - if (!rte_atomic32_test_and_set(&run_once)) { + if (!__atomic_compare_exchange_n(&run_once, &has_run, 1, 0, + __ATOMIC_RELAXED, __ATOMIC_RELAXED)) { rte_eal_init_alert("already called initialization."); rte_errno = EALREADY; return -1; @@ -701,7 +706,7 @@ rte_eal_init(int argc, char **argv) if (fctret < 0) { rte_eal_init_alert("Invalid 'command line' arguments."); rte_errno = EINVAL; - rte_atomic32_clear(&run_once); + __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); return -1; } @@ -711,20 +716,20 @@ rte_eal_init(int argc, char **argv) if (eal_plugins_init() < 0) { rte_eal_init_alert("Cannot init plugins"); rte_errno = EINVAL; - rte_atomic32_clear(&run_once); + __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); return -1; } if (eal_trace_init() < 0) { rte_eal_init_alert("Cannot init trace"); rte_errno = EFAULT; - rte_atomic32_clear(&run_once); + __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); return -1; } if (eal_option_device_parse()) { rte_errno = ENODEV; - rte_atomic32_clear(&run_once); + __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); return -1; } @@ -758,7 +763,7 @@ rte_eal_init(int argc, char **argv) if (rte_bus_scan()) { rte_eal_init_alert("Cannot scan the buses for devices"); rte_errno = ENODEV; - rte_atomic32_clear(&run_once); + __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); return -1; } @@ -786,7 +791,7 @@ rte_eal_init(int argc, char **argv) if (ret < 0) { rte_eal_init_alert("Cannot get hugepage information."); rte_errno = EACCES; - rte_atomic32_clear(&run_once); + __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); return -1; } } @@ -845,23 +850,30 @@ rte_eal_init(int argc, char **argv) eal_check_mem_on_local_socket(); - eal_thread_init_master(config->master_lcore); + if (pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t), + &lcore_config[config->main_lcore].cpuset) != 0) { + rte_eal_init_alert("Cannot set affinity"); + rte_errno = EINVAL; + return -1; + } + __rte_thread_init(config->main_lcore, + &lcore_config[config->main_lcore].cpuset); - ret = eal_thread_dump_affinity(cpuset, sizeof(cpuset)); + ret = eal_thread_dump_current_affinity(cpuset, sizeof(cpuset)); - RTE_LOG(DEBUG, EAL, "Master lcore %u is ready (tid=%p;cpuset=[%s%s])\n", - config->master_lcore, thread_id, cpuset, + RTE_LOG(DEBUG, EAL, "Main lcore %u is ready (tid=%p;cpuset=[%s%s])\n", + config->main_lcore, thread_id, cpuset, ret == 0 ? "" : "..."); - RTE_LCORE_FOREACH_SLAVE(i) { + RTE_LCORE_FOREACH_WORKER(i) { /* - * create communication pipes between master thread + * create communication pipes between main thread * and children */ - if (pipe(lcore_config[i].pipe_master2slave) < 0) + if (pipe(lcore_config[i].pipe_main2worker) < 0) rte_panic("Cannot create pipe\n"); - if (pipe(lcore_config[i].pipe_slave2master) < 0) + if (pipe(lcore_config[i].pipe_worker2main) < 0) rte_panic("Cannot create pipe\n"); lcore_config[i].state = WAIT; @@ -874,22 +886,27 @@ rte_eal_init(int argc, char **argv) /* Set thread_name for aid in debugging. */ snprintf(thread_name, sizeof(thread_name), - "lcore-slave-%d", i); + "lcore-worker-%d", i); rte_thread_setname(lcore_config[i].thread_id, thread_name); + + ret = pthread_setaffinity_np(lcore_config[i].thread_id, + sizeof(rte_cpuset_t), &lcore_config[i].cpuset); + if (ret != 0) + rte_panic("Cannot set affinity\n"); } /* - * Launch a dummy function on all slave lcores, so that master lcore + * Launch a dummy function on all worker lcores, so that main lcore * knows they are all ready when this function returns. */ - rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER); + rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MAIN); rte_eal_mp_wait_lcore(); /* initialize services so vdevs register service during bus_probe. */ ret = rte_service_init(); if (ret) { rte_eal_init_alert("rte_service_init() failed"); - rte_errno = ENOEXEC; + rte_errno = -ret; return -1; } @@ -905,7 +922,7 @@ rte_eal_init(int argc, char **argv) */ ret = rte_service_start_with_defaults(); if (ret < 0 && ret != -ENOTSUP) { - rte_errno = ENOEXEC; + rte_errno = -ret; return -1; } @@ -947,6 +964,8 @@ rte_eal_cleanup(void) eal_get_internal_configuration(); rte_service_finalize(); rte_mp_channel_cleanup(); + /* after this point, any DPDK pointers will become dangling */ + rte_eal_memory_detach(); rte_trace_save(); eal_trace_fini(); eal_cleanup_config(internal_conf);