Hi, Tetsuya So this patch make linux app back to original?
Thanks, Michael On 7/11/2015 2:30 PM, Tetsuya Mukawa wrote: > The patch fixes vfio initialization issue introduced by below patch. > - Commit 35b3313e322b ("pci: merge mapping functions for linux and bsd") > > Root cause is that VFIO_PRESENT is inaccessible in eal common level. > To fix it, remove pci_map/unmap_device from common code, then implement > in linux and bsd code. > > Reported-by: Michael Qiu <michael.qiu at intel.com> > Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp> > --- > lib/librte_eal/bsdapp/eal/eal_pci.c | 39 ++++++++++++++++++++++++ > lib/librte_eal/common/eal_common_pci.c | 55 > ---------------------------------- > lib/librte_eal/common/eal_private.h | 18 +++++++++++ > lib/librte_eal/linuxapp/eal/eal_pci.c | 50 +++++++++++++++++++++++++++++++ > 4 files changed, 107 insertions(+), 55 deletions(-) > > diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c > b/lib/librte_eal/bsdapp/eal/eal_pci.c > index 12f39d9..ed31222 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_pci.c > +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c > @@ -92,6 +92,45 @@ pci_unbind_kernel_driver(struct rte_pci_device *dev > __rte_unused) > return -ENOTSUP; > } > > +/* Map pci device */ > +int > +pci_map_device(struct rte_pci_device *dev) > +{ > + int ret = -1; > + > + /* try mapping the NIC resources */ > + switch (dev->kdrv) { > + case RTE_KDRV_NIC_UIO: > + /* map resources for devices that use uio */ > + ret = pci_uio_map_resource(dev); > + break; > + default: > + RTE_LOG(DEBUG, EAL, > + " Not managed by a supported kernel driver, > skipped\n"); > + ret = 1; > + break; > + } > + > + return ret; > +} > + > +/* Unmap pci device */ > +void > +pci_unmap_device(struct rte_pci_device *dev) > +{ > + /* try unmapping the NIC resources */ > + switch (dev->kdrv) { > + case RTE_KDRV_NIC_UIO: > + /* unmap resources for devices that use uio */ > + pci_uio_unmap_resource(dev); > + break; > + default: > + RTE_LOG(DEBUG, EAL, > + " Not managed by a supported kernel driver, > skipped\n"); > + break; > + } > +} > + > void > pci_uio_free_resource(struct rte_pci_device *dev, > struct mapped_pci_resource *uio_res) > diff --git a/lib/librte_eal/common/eal_common_pci.c > b/lib/librte_eal/common/eal_common_pci.c > index 3805aed..60e40e0 100644 > --- a/lib/librte_eal/common/eal_common_pci.c > +++ b/lib/librte_eal/common/eal_common_pci.c > @@ -137,61 +137,6 @@ pci_unmap_resource(void *requested_addr, size_t size) > requested_addr); > } > > -/* Map pci device */ > -static int > -pci_map_device(struct rte_pci_device *dev) > -{ > - int ret = -1; > - > - /* try mapping the NIC resources using VFIO if it exists */ > - switch (dev->kdrv) { > - case RTE_KDRV_VFIO: > -#ifdef VFIO_PRESENT > - if (pci_vfio_is_enabled()) > - ret = pci_vfio_map_resource(dev); > -#endif > - break; > - case RTE_KDRV_IGB_UIO: > - case RTE_KDRV_UIO_GENERIC: > - case RTE_KDRV_NIC_UIO: > - /* map resources for devices that use uio */ > - ret = pci_uio_map_resource(dev); > - break; > - default: > - RTE_LOG(DEBUG, EAL, " Not managed by a supported kernel > driver," > - " skipped\n"); > - ret = 1; > - break; > - } > - > - return ret; > -} > - > -/* Unmap pci device */ > -static void > -pci_unmap_device(struct rte_pci_device *dev) > -{ > - if (dev == NULL) > - return; > - > - /* try unmapping the NIC resources using VFIO if it exists */ > - switch (dev->kdrv) { > - case RTE_KDRV_VFIO: > - RTE_LOG(ERR, EAL, "Hotplug doesn't support vfio yet\n"); > - break; > - case RTE_KDRV_IGB_UIO: > - case RTE_KDRV_UIO_GENERIC: > - case RTE_KDRV_NIC_UIO: > - /* unmap resources for devices that use uio */ > - pci_uio_unmap_resource(dev); > - break; > - default: > - RTE_LOG(DEBUG, EAL, " Not managed by a supported kernel > driver," > - " skipped\n"); > - break; > - } > -} > - > /* > * If vendor/device ID match, call the devinit() function of the > * driver. > diff --git a/lib/librte_eal/common/eal_private.h > b/lib/librte_eal/common/eal_private.h > index e16bb68..73363f6 100644 > --- a/lib/librte_eal/common/eal_private.h > +++ b/lib/librte_eal/common/eal_private.h > @@ -165,6 +165,24 @@ struct rte_pci_device; > int pci_unbind_kernel_driver(struct rte_pci_device *dev); > > /** > + * Map this device > + * > + * This function is private to EAL. > + * > + * @return > + * 0 on success, negative on error and positive if no driver > + * is found for the device. > + */ > +int pci_map_device(struct rte_pci_device *dev); > + > +/** > + * Unmap this device > + * > + * This function is private to EAL. > + */ > +void pci_unmap_device(struct rte_pci_device *dev); > + > +/** > * Map the PCI resource of a PCI device in virtual memory > * > * This function is private to EAL. > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c > b/lib/librte_eal/linuxapp/eal/eal_pci.c > index 1d5a13b..9a28ede 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci.c > +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c > @@ -123,6 +123,56 @@ pci_get_kernel_driver_by_path(const char *filename, char > *dri_name) > return -1; > } > > +/* Map pci device */ > +int > +pci_map_device(struct rte_pci_device *dev) > +{ > + int ret = -1; > + > + /* try mapping the NIC resources using VFIO if it exists */ > + switch (dev->kdrv) { > + case RTE_KDRV_VFIO: > +#ifdef VFIO_PRESENT > + if (pci_vfio_is_enabled()) > + ret = pci_vfio_map_resource(dev); > +#endif > + break; > + case RTE_KDRV_IGB_UIO: > + case RTE_KDRV_UIO_GENERIC: > + /* map resources for devices that use uio */ > + ret = pci_uio_map_resource(dev); > + break; > + default: > + RTE_LOG(DEBUG, EAL, > + " Not managed by a supported kernel driver, > skipped\n"); > + ret = 1; > + break; > + } > + > + return ret; > +} > + > +/* Unmap pci device */ > +void > +pci_unmap_device(struct rte_pci_device *dev) > +{ > + /* try unmapping the NIC resources using VFIO if it exists */ > + switch (dev->kdrv) { > + case RTE_KDRV_VFIO: > + RTE_LOG(ERR, EAL, "Hotplug doesn't support vfio yet\n"); > + break; > + case RTE_KDRV_IGB_UIO: > + case RTE_KDRV_UIO_GENERIC: > + /* unmap resources for devices that use uio */ > + pci_uio_unmap_resource(dev); > + break; > + default: > + RTE_LOG(DEBUG, EAL, > + " Not managed by a supported kernel driver, > skipped\n"); > + break; > + } > +} > + > void * > pci_find_max_end_va(void) > {