On 7/11/2017 11:46 AM, Santosh Shukla wrote:
- Moving late bus scanning to up..just after eal_parsing.
- Auto detect iova mapping mode, based on the result of
rte_bus_scan_iommu_class.
Signed-off-by: Santosh Shukla <santosh.shu...@caviumnetworks.com>
Signed-off-by: Jerin Jacob <jerin.ja...@caviumnetworks.com>
---
lib/librte_eal/linuxapp/eal/eal.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/lib/librte_eal/linuxapp/eal/eal.c
b/lib/librte_eal/linuxapp/eal/eal.c
index 2546b55e4..7b4dd70de 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -799,6 +799,16 @@ rte_eal_init(int argc, char **argv)
return -1;
}
+ if (rte_bus_scan()) {
+ rte_eal_init_alert("Cannot scan the buses for devices\n");
+ rte_errno = ENODEV;
+ return -1;
+ }
+
The original place of the bus scan was with the following factors:
1. The bus scan requires the VFIO to be enabled atleast in dpaa2 case.
(VFIO code still need cleanup to be support non-pci cleanly). I tried
moving it before bus_scan, this helped in bus scanning.
2. During SCAN, the bus may allocate memory to devices or for it's own
usages. rte_malloc or mempool is required in cases to support
multi-process environment. (e.g. dpaa2 create dpbp or dpio device memory
using the rte_malloc call).
Since none of the other rte library (mempool, memzone, tailq) is
available at this point, it will create significant restriction on the
bus scan.
We will prefer if you can re-introduce the "iova_mode" and allow the
application choose, which mode it want to run.
This auto-detect logic may not work for many buses and it is going
to create serious restrictions on the bus_scan code.
+ /* autodetect the iova mapping mode (default is iova_pa) */
+ if (rte_bus_get_iommu_class() == RTE_IOVA_VA)
+ rte_eal_get_configuration()->iova_mode = RTE_IOVA_VA;
+
if (internal_config.no_hugetlbfs == 0 &&
internal_config.process_type != RTE_PROC_SECONDARY &&
internal_config.xen_dom0_support == 0 &&
@@ -896,12 +906,6 @@ rte_eal_init(int argc, char **argv)
return -1;
}
- if (rte_bus_scan()) {
- rte_eal_init_alert("Cannot scan the buses for devices\n");
- rte_errno = ENODEV;
- return -1;
- }
-
RTE_LCORE_FOREACH_SLAVE(i) {
/*