From: Zerun Fu <zerun...@corigine.com>

In the previous logic the 'fd' was only saved in the primary process,
but for some devices this value is also used in the secondary logic.

For example, the call of 'rte_pci_find_ext_capability()' will fail in
the secondary process.

Fix this problem by getting and saving the value of 'fd' also in the
secondary process logic.

Fixes: 9b957f378abf ("pci: merge uio functions for linux and bsd")
Cc: muk...@igel.co.jp
Cc: sta...@dpdk.org

Signed-off-by: Zerun Fu <zerun...@corigine.com>
Reviewed-by: Chaoyong He <chaoyong...@corigine.com>
Reviewed-by: Long Wu <long...@corigine.com>
Reviewed-by: Peng Zhang <peng.zh...@corigine.com>
---
 drivers/bus/pci/linux/pci_uio.c  | 5 ++++-
 drivers/bus/pci/pci_common_uio.c | 8 ++++----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c
index 97d740dfe5..6680e42efb 100644
--- a/drivers/bus/pci/linux/pci_uio.c
+++ b/drivers/bus/pci/linux/pci_uio.c
@@ -237,7 +237,7 @@ pci_uio_alloc_resource(struct rte_pci_device *dev,
        }
        snprintf(devname, sizeof(devname), "/dev/uio%u", uio_num);
 
-       /* save fd if in primary process */
+       /* save fd */
        fd = open(devname, O_RDWR);
        if (fd < 0) {
                RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
@@ -261,6 +261,9 @@ pci_uio_alloc_resource(struct rte_pci_device *dev,
        if (rte_intr_dev_fd_set(dev->intr_handle, uio_cfg_fd))
                goto error;
 
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
+
        if (dev->kdrv == RTE_PCI_KDRV_IGB_UIO) {
                if (rte_intr_type_set(dev->intr_handle, RTE_INTR_HANDLE_UIO))
                        goto error;
diff --git a/drivers/bus/pci/pci_common_uio.c b/drivers/bus/pci/pci_common_uio.c
index 432d68b12c..8688862738 100644
--- a/drivers/bus/pci/pci_common_uio.c
+++ b/drivers/bus/pci/pci_common_uio.c
@@ -106,15 +106,15 @@ pci_uio_map_resource(struct rte_pci_device *dev)
        if (rte_intr_dev_fd_set(dev->intr_handle, -1))
                return -1;
 
-       /* secondary processes - use already recorded details */
-       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-               return pci_uio_map_secondary(dev);
-
        /* allocate uio resource */
        ret = pci_uio_alloc_resource(dev, &uio_res);
        if (ret)
                return ret;
 
+       /* secondary processes - use already recorded details */
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return pci_uio_map_secondary(dev);
+
        /* Map all BARs */
        for (i = 0; i != PCI_MAX_RESOURCE; i++) {
                /* skip empty BAR */
-- 
2.39.1

Reply via email to