> On Aug 29, 2024, at 16:57, Konrad Sztyber <konrad.szty...@intel.com> wrote: > > External email: Use caution opening links or attachments > > > 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, 847d78fb9530 > ("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. > > Fixes: 847d78fb9530 ("bus/pci: fix FD in secondary process") > Cc: sta...@dpdk.org > > Signed-off-by: Konrad Sztyber <konrad.szty...@intel.com> > --- > drivers/bus/pci/linux/pci_uio.c | 27 +++++++++++++++------------ > 1 file changed, 15 insertions(+), 12 deletions(-) > > diff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c > index 4c1d3327a9..5c4ba8098c 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,21 @@ 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 >
Reviewed-by: Chenbo Xia <chen...@nvidia.com>