Skip to content

Commit

Permalink
bus/pci: fix legacy device IO port map in secondary process
Browse files Browse the repository at this point in the history
When doing IO port mapping for legacy device
in secondary process, the region information
is missing, so, we need to refill it.

Fixes: 4b74154 ("bus/pci: avoid depending on private kernel value")
Cc: stable@dpdk.org

Signed-off-by: Wenwu Ma <wenwux.ma@intel.com>
Signed-off-by: 0-day Robot <robot@bytheb.org>
  • Loading branch information
wenwumax authored and ovsrobot committed Aug 7, 2023
1 parent 9836014 commit 5776dc6
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions drivers/bus/pci/linux/pci_vfio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ||
Expand All @@ -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;
Expand Down

0 comments on commit 5776dc6

Please sign in to comment.