#include <rte_dev.h>
#include <rte_devargs.h>
#include <rte_version.h>
-#include <rte_atomic.h>
#include <malloc_heap.h>
#include <rte_vfio.h>
#include <rte_telemetry.h>
}
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:
" --"OPT_FILE_PREFIX" Prefix for hugepage filenames\n"
" --"OPT_CREATE_UIO_DEV" Create /dev/uioX (usually done by hotplug)\n"
" --"OPT_VFIO_INTR" Interrupt mode for VFIO (legacy|msi|msix)\n"
+ " --"OPT_VFIO_VF_TOKEN" VF token (UUID) shared between SR-IOV PF and VFs\n"
" --"OPT_LEGACY_MEM" Legacy memory mode (no dynamic allocation, contiguous segments)\n"
" --"OPT_SINGLE_FILE_SEGMENTS" Put all hugepage memory in single files\n"
" --"OPT_MATCH_ALLOCATIONS" Free hugepages exactly as allocated\n"
return -1;
}
+static int
+eal_parse_vfio_vf_token(const char *vf_token)
+{
+ struct internal_config *cfg = eal_get_internal_configuration();
+ rte_uuid_t uuid;
+
+ if (!rte_uuid_parse(vf_token, uuid)) {
+ rte_uuid_copy(cfg->vfio_vf_token, uuid);
+ return 0;
+ }
+
+ return -1;
+}
+
/* Parse the arguments for --log-level only */
static void
eal_log_level_parse(int argc, char **argv)
}
break;
+ case OPT_VFIO_VF_TOKEN_NUM:
+ if (eal_parse_vfio_vf_token(optarg) < 0) {
+ RTE_LOG(ERR, EAL, "invalid parameters for --"
+ OPT_VFIO_VF_TOKEN "\n");
+ eal_usage(prgname);
+ ret = -1;
+ goto out;
+ }
+ break;
+
case OPT_CREATE_UIO_DEV_NUM:
internal_conf->create_uio_dev = 1;
break;
{
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;
const char *p;
static char logid[PATH_MAX];
char cpuset[RTE_CPU_AFFINITY_STR_LEN];
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;
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;
}
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_option_device_parse()) {
rte_errno = ENODEV;
- rte_atomic32_clear(&run_once);
+ __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
return -1;
}
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;
}
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;
}
}
if (rte_eal_log_init(logid, internal_conf->syslog_facility) < 0) {
rte_eal_init_alert("Cannot init logging.");
rte_errno = ENOMEM;
- rte_atomic32_clear(&run_once);
+ __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
return -1;
}
if (rte_eal_vfio_setup() < 0) {
rte_eal_init_alert("Cannot init VFIO");
rte_errno = EAGAIN;
- rte_atomic32_clear(&run_once);
+ __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
return -1;
}
#endif
eal_check_mem_on_local_socket();
- eal_thread_init_master(config->master_lcore);
-
- ret = eal_thread_dump_affinity(cpuset, sizeof(cpuset));
+ if (pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t),
+ &lcore_config[config->master_lcore].cpuset) != 0) {
+ rte_eal_init_alert("Cannot set affinity");
+ rte_errno = EINVAL;
+ return -1;
+ }
+ __rte_thread_init(config->master_lcore,
+ &lcore_config[config->master_lcore].cpuset);
+ ret = eal_thread_dump_current_affinity(cpuset, sizeof(cpuset));
RTE_LOG(DEBUG, EAL, "Master lcore %u is ready (tid=%zx;cpuset=[%s%s])\n",
config->master_lcore, (uintptr_t)thread_id, cpuset,
ret == 0 ? "" : "...");
if (ret != 0)
RTE_LOG(DEBUG, EAL,
"Cannot set name for lcore thread\n");
+
+ 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");
}
/*
return internal_conf->vfio_intr_mode;
}
+void
+rte_eal_vfio_get_vf_token(rte_uuid_t vf_token)
+{
+ struct internal_config *cfg = eal_get_internal_configuration();
+
+ rte_uuid_copy(vf_token, cfg->vfio_vf_token);
+}
+
int
rte_eal_check_module(const char *module_name)
{