This patch fixes a race-condition when a primary and
secondary process simultaneously probe PCI devices.
This is implemented by moving the rte_eal_mcfg_complete()
function call in rte_eal_init() until after rte_eal_pci_probe().
The memory mapping of PCI device in the secondary process *must*
happen after the primary has finished doing the mapping as it
relies on information written by the primary.
The end result is that the secondary process waits longer,
until the primary has completed its PCI probing, and then
notifies the secondary process.
This race-condition became visible during the development of
a function that allows a secondary process to be polling until
a primary process exists. The secondary would then probe PCI
devices at the same time, causing an error during rte_eal_init()
Linux EAL:
Fixes:
916e4f4f4e45 ("memory: fix for multi process support")
BSD EAL:
Fixes:
764bf26873b9 ("add FreeBSD support")
Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
/*-
* BSD LICENSE
*
- * Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
* Copyright(c) 2014 6WIND S.A.
* All rights reserved.
*
eal_check_mem_on_local_socket();
- rte_eal_mcfg_complete();
-
if (eal_plugins_init() < 0)
rte_panic("Cannot init plugins\n");
if (rte_eal_pci_probe())
rte_panic("Cannot probe PCI\n");
+ rte_eal_mcfg_complete();
+
return fctret;
}
/*-
* BSD LICENSE
*
- * Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
* Copyright(c) 2012-2014 6WIND S.A.
* All rights reserved.
*
eal_check_mem_on_local_socket();
- rte_eal_mcfg_complete();
-
if (eal_plugins_init() < 0)
rte_panic("Cannot init plugins\n");
if (rte_eal_pci_probe())
rte_panic("Cannot probe PCI\n");
+ rte_eal_mcfg_complete();
+
return fctret;
}