In rare cases, when a secondary process calls rte_eal_init() it can cause a data race during page prefaulting in alloc_seg().
An atomic compare-exchange in a loop should eliminate the data race. Signed-off-by: Michal Sieron <[email protected]> --- lib/eal/linux/eal_memalloc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/eal/linux/eal_memalloc.c b/lib/eal/linux/eal_memalloc.c index a39bc31c7b..cb92fda2e8 100644 --- a/lib/eal/linux/eal_memalloc.c +++ b/lib/eal/linux/eal_memalloc.c @@ -30,6 +30,7 @@ #include <rte_eal.h> #include <rte_memory.h> #include <rte_cycles.h> +#include <rte_atomic.h> #include "eal_filesystem.h" #include "eal_internal_cfg.h" @@ -600,7 +601,9 @@ alloc_seg(struct rte_memseg *ms, void *addr, int socket_id, * that is already there, so read the old value, and write itback. * kernel populates the page with zeroes initially. */ - *(volatile int *)addr = *(volatile int *)addr; + int snapshot = *(volatile int *)addr; + while (!rte_atomic_compare_exchange_strong((volatile int *)addr, &snapshot, snapshot)) + ; iova = rte_mem_virt2iova(addr); if (iova == RTE_BAD_PHYS_ADDR) { -- 2.43.0

