> > The uio_pci_generic driver clears the bus master bit when the device file is > closed. So, when the secondary process terminates after probing a device, > that device becomes unusable in the primary process. > > To avoid that, the device file is now opened only in the primary process. The > commit that introduced this regression, 847d78fb95 > ("bus/pci: fix FD in secondary process"), only mentioned enabling access to > config space from secondary process, which still works, as it doesn't rely on > the device file.
Yes, we can still access the config space from secondary process. > > Fixes: 847d78fb95 ("bus/pci: fix FD in secondary process") Maybe here also need a 'Cc: sta...@dpdk.org' ? With this, It looks good to me, thanks. Acked-by: Chaoyong He <chaoyong...@corigine.com> > > Signed-off-by: Konrad Sztyber <konrad.szty...@intel.com> > --- > drivers/bus/pci/linux/pci_uio.c | 25 +++++++++++++------------ > 1 file changed, 13 insertions(+), 12 deletions(-) > > diff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c > index 4c1d3327a9..432316afcc 100644 > --- a/drivers/bus/pci/linux/pci_uio.c > +++ b/drivers/bus/pci/linux/pci_uio.c > @@ -232,18 +232,6 @@ pci_uio_alloc_resource(struct rte_pci_device *dev, > loc->domain, loc->bus, loc->devid, loc->function); > return 1; > } > - snprintf(devname, sizeof(devname), "/dev/uio%u", uio_num); > - > - /* save fd */ > - fd = open(devname, O_RDWR); > - if (fd < 0) { > - PCI_LOG(ERR, "Cannot open %s: %s", devname, strerror(errno)); > - goto error; > - } > - > - if (rte_intr_fd_set(dev->intr_handle, fd)) > - goto error; > - > snprintf(cfgname, sizeof(cfgname), > "/sys/class/uio/uio%u/device/config", uio_num); > > @@ -273,6 +261,19 @@ pci_uio_alloc_resource(struct rte_pci_device *dev, > if (rte_eal_process_type() != RTE_PROC_PRIMARY) > return 0; > > + /* the uio_pci_generic driver clears the bus master enable bit when > the > device file is > + * closed, so open it only in the primary process */ > + snprintf(devname, sizeof(devname), "/dev/uio%u", uio_num); > + /* save fd */ > + fd = open(devname, O_RDWR); > + if (fd < 0) { > + PCI_LOG(ERR, "Cannot open %s: %s", devname, strerror(errno)); > + goto error; > + } > + > + if (rte_intr_fd_set(dev->intr_handle, fd)) > + goto error; > + > /* allocate the mapping details for secondary processes*/ > *uio_res = rte_zmalloc("UIO_RES", sizeof(**uio_res), 0); > if (*uio_res == NULL) { > -- > 2.45.0