eal: use C11 atomics for initialization check

Since rte_atomicXX APIs are not allowed to be used, use C11 builtins to
check if EAL is already initialized.

Signed-off-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
This commit is contained in:
Phil Yang 2020-09-24 13:39:25 +08:00 committed by David Marchand
parent 84fb33fec1
commit c5d6c47257
2 changed files with 21 additions and 19 deletions

View File

@ -41,7 +41,6 @@
#include <rte_devargs.h>
#include <rte_version.h>
#include <rte_vfio.h>
#include <rte_atomic.h>
#include <malloc_heap.h>
#include <rte_telemetry.h>
@ -665,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();
@ -679,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;
@ -705,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;
}
@ -715,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;
}
@ -762,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;
}
@ -790,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;
}
}

View File

@ -47,7 +47,6 @@
#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>
@ -960,7 +959,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;
const char *p;
static char logid[PATH_MAX];
char cpuset[RTE_CPU_AFFINITY_STR_LEN];
@ -977,7 +977,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;
@ -1005,14 +1006,14 @@ 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;
}
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;
}
@ -1024,7 +1025,7 @@ rte_eal_init(int argc, char **argv)
if (eal_option_device_parse()) {
rte_errno = ENODEV;
rte_atomic32_clear(&run_once);
__atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
return -1;
}
@ -1064,7 +1065,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;
}
@ -1138,7 +1139,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;
}
}
@ -1162,7 +1163,7 @@ rte_eal_init(int argc, char **argv)
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;
}
@ -1170,7 +1171,7 @@ rte_eal_init(int argc, char **argv)
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