[v2,1/4] eal: use C11 atomic builtins for already initialized check

Message ID 1600244628-13062-2-git-send-email-phil.yang@arm.com (mailing list archive)
State Superseded, archived
Delegated to: David Marchand
Headers
Series use C11 atomic builtins for libs |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Phil Yang Sept. 16, 2020, 8:23 a.m. UTC
  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>
---
 lib/librte_eal/freebsd/eal.c | 18 ++++++++++--------
 lib/librte_eal/linux/eal.c   | 20 +++++++++++---------
 2 files changed, 21 insertions(+), 17 deletions(-)
  

Comments

David Marchand Sept. 23, 2020, 1:06 p.m. UTC | #1
On Wed, Sep 16, 2020 at 10:24 AM Phil Yang <phil.yang@arm.com> wrote:
>
> 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>
> ---
>  lib/librte_eal/freebsd/eal.c | 18 ++++++++++--------
>  lib/librte_eal/linux/eal.c   | 20 +++++++++++---------
>  2 files changed, 21 insertions(+), 17 deletions(-)
>
> diff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c
> index 798add0..9f4c7bb 100644
> --- a/lib/librte_eal/freebsd/eal.c
> +++ b/lib/librte_eal/freebsd/eal.c
> @@ -665,7 +665,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 +680,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 +707,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 +717,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 +764,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 +792,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;
>                 }
>         }
> diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c
> index 0960f01..82a73ed 100644
> --- a/lib/librte_eal/linux/eal.c
> +++ b/lib/librte_eal/linux/eal.c
> @@ -960,7 +960,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 +978,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 +1007,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 +1026,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 +1066,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 +1140,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 +1164,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 +1172,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
> --
> 2.7.4
>

I see no reason to include rte_atomic.h in those files after this patch.
Did I miss something?
  
Phil Yang Sept. 24, 2020, 3:44 a.m. UTC | #2
David Marchand <david.marchand@redhat.com> writes:

> Subject: Re: [PATCH v2 1/4] eal: use C11 atomic builtins for already initialized
> check
> 
> On Wed, Sep 16, 2020 at 10:24 AM Phil Yang <phil.yang@arm.com> wrote:
> >
> > 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>
> > ---
> >  lib/librte_eal/freebsd/eal.c | 18 ++++++++++--------
> >  lib/librte_eal/linux/eal.c   | 20 +++++++++++---------
> >  2 files changed, 21 insertions(+), 17 deletions(-)
> >
> > diff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c
> > index 798add0..9f4c7bb 100644
> > --- a/lib/librte_eal/freebsd/eal.c
> > +++ b/lib/librte_eal/freebsd/eal.c
> > @@ -665,7 +665,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 +680,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 +707,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 +717,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 +764,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 +792,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;
> >                 }
> >         }
> > diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c
> > index 0960f01..82a73ed 100644
> > --- a/lib/librte_eal/linux/eal.c
> > +++ b/lib/librte_eal/linux/eal.c
> > @@ -960,7 +960,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 +978,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 +1007,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 +1026,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 +1066,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 +1140,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 +1164,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 +1172,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
> > --
> > 2.7.4
> >
> 
> I see no reason to include rte_atomic.h in those files after this patch.
> Did I miss something?

No, it is not needed anymore. 
Will remove them.


Thanks,
Phil

> 
> 
> --
> David Marchand
  

Patch

diff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c
index 798add0..9f4c7bb 100644
--- a/lib/librte_eal/freebsd/eal.c
+++ b/lib/librte_eal/freebsd/eal.c
@@ -665,7 +665,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 +680,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 +707,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 +717,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 +764,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 +792,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;
 		}
 	}
diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c
index 0960f01..82a73ed 100644
--- a/lib/librte_eal/linux/eal.c
+++ b/lib/librte_eal/linux/eal.c
@@ -960,7 +960,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 +978,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 +1007,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 +1026,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 +1066,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 +1140,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 +1164,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 +1172,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