From 5776dc619a5f865091cc1e2c748975d333849e35 Mon Sep 17 00:00:00 2001 From: Wenwu Ma Date: Mon, 7 Aug 2023 09:58:20 +0800 Subject: [PATCH] bus/pci: fix legacy device IO port map in secondary process When doing IO port mapping for legacy device in secondary process, the region information is missing, so, we need to refill it. Fixes: 4b741542ecde ("bus/pci: avoid depending on private kernel value") Cc: stable@dpdk.org Signed-off-by: Wenwu Ma Signed-off-by: 0-day Robot --- drivers/bus/pci/linux/pci_vfio.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c index e634de8322e..eea1c9851e5 100644 --- a/drivers/bus/pci/linux/pci_vfio.c +++ b/drivers/bus/pci/linux/pci_vfio.c @@ -1306,6 +1306,11 @@ int pci_vfio_ioport_map(struct rte_pci_device *dev, int bar, struct rte_pci_ioport *p) { + struct vfio_device_info device_info = { .argsz = sizeof(device_info) }; + char pci_addr[PATH_MAX] = {0}; + int vfio_dev_fd; + struct rte_pci_addr *loc = &dev->addr; + int ret; uint64_t size, offset; if (bar < VFIO_PCI_BAR0_REGION_INDEX || @@ -1314,6 +1319,22 @@ pci_vfio_ioport_map(struct rte_pci_device *dev, int bar, return -1; } + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + /* store PCI address string */ + snprintf(pci_addr, sizeof(pci_addr), PCI_PRI_FMT, + loc->domain, loc->bus, loc->devid, loc->function); + + ret = rte_vfio_setup_device(rte_pci_get_sysfs_path(), pci_addr, + &vfio_dev_fd, &device_info); + if (ret) + return -1; + + ret = pci_vfio_fill_regions(dev, vfio_dev_fd, &device_info); + if (ret) + return -1; + + } + if (pci_vfio_get_region(dev, bar, &size, &offset) != 0) { RTE_LOG(ERR, EAL, "Cannot get offset of region %d.\n", bar); return -1;