On Thu, 10 Sept 2026 at 14:54, Anatoly Burakov <[email protected]> wrote: > > Currently, setup gets device info as part of setup, while the separate get > device info API also calls setup if the fd is zero. Untangle these two APIs > and make each do one thing, and adjust all existing callers. > > Signed-off-by: Anatoly Burakov <[email protected]> > --- > drivers/bus/cdx/cdx_vfio.c | 12 ++++++++-- > drivers/bus/pci/linux/pci_vfio.c | 18 ++++++++++---- > drivers/bus/platform/platform.c | 9 ++++++- > drivers/crypto/bcmfs/bcmfs_vfio.c | 8 ++++++- > lib/eal/freebsd/eal.c | 12 ++++++++-- > lib/eal/include/dev_vfio.h | 23 +++++++----------- > lib/eal/linux/eal_vfio.c | 40 +++++++++---------------------- > 7 files changed, 68 insertions(+), 54 deletions(-) > > diff --git a/drivers/bus/cdx/cdx_vfio.c b/drivers/bus/cdx/cdx_vfio.c > index 02a34d6f18..531e4ccc8d 100644 > --- a/drivers/bus/cdx/cdx_vfio.c > +++ b/drivers/bus/cdx/cdx_vfio.c > @@ -401,10 +401,14 @@ cdx_vfio_map_resource_primary(struct rte_cdx_device > *dev) > return -1; > > ret = dev_vfio_setup_device(RTE_CDX_BUS_DEVICES_PATH, dev_name, > - &vfio_dev_fd, &device_info); > + &vfio_dev_fd); > if (ret) > return ret; > > + ret = dev_vfio_get_device_info(vfio_dev_fd, &device_info); > + if (ret) > + goto err_vfio_dev_fd; > + > /* allocate vfio_res and get region info */ > vfio_res = rte_zmalloc("VFIO_RES", sizeof(*vfio_res), 0); > if (vfio_res == NULL) { > @@ -510,10 +514,14 @@ cdx_vfio_map_resource_secondary(struct rte_cdx_device > *dev) > } > > ret = dev_vfio_setup_device(RTE_CDX_BUS_DEVICES_PATH, dev_name, > - &vfio_dev_fd, &device_info); > + &vfio_dev_fd); > if (ret) > return ret; > > + ret = dev_vfio_get_device_info(vfio_dev_fd, &device_info); > + if (ret) > + goto err_vfio_dev_fd; > + > /* map MMIO regions */ > maps = vfio_res->maps; > > diff --git a/drivers/bus/pci/linux/pci_vfio.c > b/drivers/bus/pci/linux/pci_vfio.c > index 3e87e759f5..0363a4a6c5 100644 > --- a/drivers/bus/pci/linux/pci_vfio.c > +++ b/drivers/bus/pci/linux/pci_vfio.c > @@ -753,10 +753,14 @@ pci_vfio_map_resource_primary(struct rte_pci_device > *dev) > loc->domain, loc->bus, loc->devid, loc->function); > > ret = dev_vfio_setup_device(rte_pci_get_sysfs_path(), pci_addr, > - &vfio_dev_fd, &device_info); > + &vfio_dev_fd); > if (ret) > return ret; > > + ret = dev_vfio_get_device_info(vfio_dev_fd, &device_info); > + if (ret) > + goto err_vfio_dev_fd; > + > if (rte_intr_dev_fd_set(dev->intr_handle, vfio_dev_fd)) > goto err_vfio_dev_fd; > > @@ -962,10 +966,14 @@ pci_vfio_map_resource_secondary(struct rte_pci_device > *dev) > } > > ret = dev_vfio_setup_device(rte_pci_get_sysfs_path(), pci_addr, > - &vfio_dev_fd, &device_info); > + &vfio_dev_fd); > if (ret) > return ret; > > + ret = dev_vfio_get_device_info(vfio_dev_fd, &device_info); > + if (ret) > + goto err_vfio_dev_fd; > + > ret = pci_vfio_fill_regions(dev, vfio_dev_fd, &device_info); > if (ret) > goto err_vfio_dev_fd; > @@ -1195,12 +1203,14 @@ pci_vfio_ioport_map(struct rte_pci_device *dev, int > bar, > if (vfio_dev_fd < 0) { > return -1; > } else if (vfio_dev_fd == 0) {
Not the fault of this patch, but comparing a FD against 0 is a bad sign... > - if > (dev_vfio_get_device_info(rte_pci_get_sysfs_path(), pci_addr, > - &vfio_dev_fd, &device_info) != 0) > + if (dev_vfio_setup_device(rte_pci_get_sysfs_path(), > pci_addr, > + &vfio_dev_fd) != 0) > return -1; > /* save vfio_dev_fd so it can be used during release > */ > if (rte_intr_dev_fd_set(dev->intr_handle, > vfio_dev_fd) != 0) > return -1; > + if (dev_vfio_get_device_info(vfio_dev_fd, > &device_info) != 0) > + return -1; > > if (pci_vfio_fill_regions(dev, vfio_dev_fd, > &device_info) != 0) > return -1; And we have various leaks in case VFIO fails... I'll make a note to fix this later as this is already present, unless you can have a look. -- David Marchand

