On Wed, 20 May 2026 14:57:56 +0200 Michal Sieron <[email protected]> wrote:
> 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) { No don't use a loop with compare_exchange_strong here. It could get stuck. Should just a an relaxed load be enough to get the page in?

