On Fri, Feb 26, 2016 at 3:23 AM, Yuanhan Liu <yuanhan.liu at linux.intel.com> wrote: > Mauricio, thanks for the testing and report. > > On Thu, Feb 25, 2016 at 02:30:18PM +0100, David Marchand wrote: >> >From the logs, I would say I broke uio_pci_generic since we are in >> "uio" case, but uio portio sysfs does not exist. >> virtio pmd fell back to ioports discovery before my change. > > Maybe we can do same?
I suppose, but see below. > > --- > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c > b/lib/librte_eal/linuxapp/eal/eal_pci.c > index 4346973..579731c 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci.c > +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c > @@ -685,12 +685,11 @@ int > rte_eal_pci_ioport_map(struct rte_pci_device *dev, int bar, > struct rte_pci_ioport *p) > { > - int ret; > + int ret = -1; > > switch (dev->kdrv) { > #ifdef VFIO_PRESENT > case RTE_KDRV_VFIO: > - ret = -1; > if (pci_vfio_is_enabled()) > ret = pci_vfio_ioport_map(dev, bar, p); > break; > @@ -700,14 +699,14 @@ rte_eal_pci_ioport_map(struct rte_pci_device *dev, int > bar, > ret = pci_uio_ioport_map(dev, bar, p); > break; > default: > + break; > + } > + > #if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) > - /* special case for x86 ... */ > + /* special case for x86 ... */ > + if (ret) > ret = pci_ioport_map(dev, bar, p); > -#else > - ret = -1; > #endif > - break; > - } What if we are supposed to do vfio here, but for some reason init failed ? Next thing, we will call ioport_read in vfio context, but init went through the ioports parsing => boom ? Another issue is that when device is bound to a kernel driver (let's say virtio-pci here), then init will succeed and pmd will kick in the device registers. This special case should really be narrowed down to "uio" and "none" driver cases. -- David Marchand