On Mon, Jul 6, 2015 at 8:24 AM, Tetsuya Mukawa <mukawa at igel.co.jp> wrote:
> From: "Tetsuya.Mukawa" <mukawa at igel.co.jp> > > The patch consolidates below functions, and implement these > in eal_common_pci_uio.c. > - pci_uio_map_secondary() > - pci_uio_map_resource() > - pci_uio_unmap() > - pci_uio_find_resource() > - pci_uio_unmap_resource() > > Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp> > --- > lib/librte_eal/bsdapp/eal/Makefile | 2 + > lib/librte_eal/bsdapp/eal/eal_pci.c | 110 +--------- > .../bsdapp/eal/include/exec-env/rte_interrupts.h | 2 + > lib/librte_eal/common/eal_common_pci_uio.c | 240 > +++++++++++++++++++++ > lib/librte_eal/common/eal_private.h | 56 +++++ > lib/librte_eal/linuxapp/eal/Makefile | 2 + > lib/librte_eal/linuxapp/eal/eal_pci_init.h | 12 +- > lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 196 +---------------- > 8 files changed, 311 insertions(+), 309 deletions(-) > create mode 100644 lib/librte_eal/common/eal_common_pci_uio.c > > diff --git a/lib/librte_eal/bsdapp/eal/Makefile > b/lib/librte_eal/bsdapp/eal/Makefile > index c73ffb6..0d72330 100644 > --- a/lib/librte_eal/bsdapp/eal/Makefile > +++ b/lib/librte_eal/bsdapp/eal/Makefile > @@ -1,6 +1,7 @@ > # BSD LICENSE > # > # Copyright(c) 2010-2015 Intel Corporation. All rights reserved. > +# Copyright(c) 2015 IGEL Co., Ltd. > # All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > @@ -68,6 +69,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += > eal_common_memzone.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_log.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_launch.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_pci.c > +SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_pci_uio.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_memory.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_tailqs.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_errno.c > diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c > b/lib/librte_eal/bsdapp/eal/eal_pci.c > index 5bb93cd..f85fc1e 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_pci.c > +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c > @@ -83,10 +83,6 @@ > * network card, only providing access to PCI BAR to applications, and > * enabling bus master. > */ > -static struct rte_tailq_elem rte_uio_tailq = { > - .name = "UIO_RESOURCE_LIST", > -}; > -EAL_REGISTER_TAILQ(rte_uio_tailq) > > /* unbind kernel driver for this device */ > static int > @@ -97,53 +93,7 @@ pci_unbind_kernel_driver(struct rte_pci_device *dev > __rte_unused) > return -ENOTSUP; > } > > -static int > -pci_uio_map_secondary(struct rte_pci_device *dev) > -{ > - int i, fd; > - struct mapped_pci_resource *uio_res; > - struct mapped_pci_res_list *uio_res_list = > - RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > - > - TAILQ_FOREACH(uio_res, uio_res_list, next) { > - > - /* skip this element if it doesn't match our PCI address */ > - if (rte_eal_compare_pci_addr(&uio_res->pci_addr, > &dev->addr)) > - continue; > - > - for (i = 0; i != uio_res->nb_maps; i++) { > - /* > - * open devname, to mmap it > - */ > - fd = open(uio_res->maps[i].path, O_RDWR); > - if (fd < 0) { > - RTE_LOG(ERR, EAL, "Cannot open %s: %s\n", > - uio_res->maps[i].path, > strerror(errno)); > - return -1; > - } > - > - void *mapaddr = > pci_map_resource(uio_res->maps[i].addr, > - fd, (off_t)uio_res->maps[i].offset, > - (size_t)uio_res->maps[i].size, 0); > - if (mapaddr != uio_res->maps[i].addr) { > - RTE_LOG(ERR, EAL, > - "Cannot mmap device resource file > %s to address: %p\n", > - uio_res->maps[i].path, > - uio_res->maps[i].addr); > - close(fd); > - return -1; > - } > - /* fd is not needed in slave process, close it */ > - close(fd); > - } > - return 0; > - } > - > - RTE_LOG(ERR, EAL, "Cannot find resource for device\n"); > - return 1; > -} > - > -static int > +int > pci_uio_alloc_resource(struct rte_pci_device *dev, > struct mapped_pci_resource **uio_res) > { > @@ -195,7 +145,7 @@ error: > return -1; > } > > -static int > +int > pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, > struct mapped_pci_resource *uio_res, int map_idx) > { > @@ -253,62 +203,6 @@ error: > return -1; > } > > -/* map the PCI resource of a PCI device in virtual memory */ > -static int > -pci_uio_map_resource(struct rte_pci_device *dev) > -{ > - int i, map_idx = 0, ret; > - uint64_t phaddr; > - struct mapped_pci_resource *uio_res = NULL; > - struct mapped_pci_res_list *uio_res_list = > - RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); > - > - dev->intr_handle.fd = -1; > - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > - > - /* secondary processes - use already recorded details */ > - if (rte_eal_process_type() != RTE_PROC_PRIMARY) > - return pci_uio_map_secondary(dev); > - > - /* allocate uio resource */ > - ret = pci_uio_alloc_resource(dev, &uio_res); > - if ((ret != 0) || (uio_res == NULL)) > - return ret; > - > - /* Map all BARs */ > - for (i = 0; i != PCI_MAX_RESOURCE; i++) { > - /* skip empty BAR */ > - if ((phaddr = dev->mem_resource[i].phys_addr) == 0) > - continue; > - > - ret = pci_uio_map_resource_by_index(dev, i, > - uio_res, map_idx); > - if (ret != 0) > - goto error; > - > - map_idx++; > - } > - > - uio_res->nb_maps = map_idx; > - > - TAILQ_INSERT_TAIL(uio_res_list, uio_res, next); > - > - return 0; > -error: > - for (i = 0; i < map_idx; i++) > - rte_free(uio_res->maps[i].path); > - > - /* 'uio_res' has valid value here */ > - rte_free(uio_res); > - > - /* 'fd' has valid value here */ > - close(dev->intr_handle.fd); > - dev->intr_handle.fd = -1; > - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > - > - return -1; > -} > - > /* Scan one pci sysfs entry, and fill the devices list from it. */ > static int > pci_scan_one(int dev_pci_fd, struct pci_conf *conf) > diff --git a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h > b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h > index 87a9cf6..410dd21 100644 > --- a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h > +++ b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h > @@ -2,6 +2,7 @@ > * BSD LICENSE > * > * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. > + * Copyright(c) 2015 IGEL Co., Ltd. > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -48,6 +49,7 @@ enum rte_intr_handle_type { > /** Handle for interrupts. */ > struct rte_intr_handle { > int fd; /**< file descriptor */ > + int uio_cfg_fd; /**< UIO config file descriptor */ > enum rte_intr_handle_type type; /**< handle type */ > }; > > diff --git a/lib/librte_eal/common/eal_common_pci_uio.c > b/lib/librte_eal/common/eal_common_pci_uio.c > new file mode 100644 > index 0000000..249a70b > --- /dev/null > +++ b/lib/librte_eal/common/eal_common_pci_uio.c > @@ -0,0 +1,240 @@ > +/*- > + * BSD LICENSE > + * > + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. > + * Copyright(c) 2015 IGEL Co., Ltd. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in > + * the documentation and/or other materials provided with the > + * distribution. > + * * Neither the name of Intel Corporation nor the names of its > + * contributors may be used to endorse or promote products derived > + * from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR > + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT > + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include <fcntl.h> > +#include <string.h> > +#include <unistd.h> > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <sys/mman.h> > + > +#include <rte_eal.h> > +#include <rte_tailq.h> > +#include <rte_log.h> > +#include <rte_malloc.h> > + > +#include "eal_private.h" > + > +static struct rte_tailq_elem rte_uio_tailq = { > + .name = "UIO_RESOURCE_LIST", > +}; > +EAL_REGISTER_TAILQ(rte_uio_tailq) > + > +static int > +pci_uio_map_secondary(struct rte_pci_device *dev) > +{ > + int fd, i; > + struct mapped_pci_resource *uio_res; > + struct mapped_pci_res_list *uio_res_list = > + RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > + > + TAILQ_FOREACH(uio_res, uio_res_list, next) { > + > + /* skip this element if it doesn't match our PCI address */ > + if (rte_eal_compare_pci_addr(&uio_res->pci_addr, > &dev->addr)) > + continue; > + > + for (i = 0; i != uio_res->nb_maps; i++) { > + /* > + * open devname, to mmap it > + */ > + fd = open(uio_res->maps[i].path, O_RDWR); > + if (fd < 0) { > + RTE_LOG(ERR, EAL, "Cannot open %s: %s\n", > + uio_res->maps[i].path, > strerror(errno)); > + return -1; > + } > + > + void *mapaddr = > pci_map_resource(uio_res->maps[i].addr, > + fd, (off_t)uio_res->maps[i].offset, > + (size_t)uio_res->maps[i].size, 0); > + if (mapaddr != uio_res->maps[i].addr) { > + RTE_LOG(ERR, EAL, > + "Cannot mmap device resource file > %s to address: %p\n", > + uio_res->maps[i].path, > + uio_res->maps[i].addr); > + close(fd); > + return -1; > + } > + /* fd is not needed in slave process, close it */ > + close(fd); > + } > + return 0; > + } > + > + RTE_LOG(ERR, EAL, "Cannot find resource for device\n"); > + return 1; > +} > + > +/* map the PCI resource of a PCI device in virtual memory */ > +int > +pci_uio_map_resource(struct rte_pci_device *dev) > +{ > + int i, map_idx = 0, ret; > + uint64_t phaddr; > + struct mapped_pci_resource *uio_res = NULL; > + struct mapped_pci_res_list *uio_res_list = > + RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); > + > + dev->intr_handle.fd = -1; > + dev->intr_handle.uio_cfg_fd = -1; > + dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > + > + /* secondary processes - use already recorded details */ > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + return pci_uio_map_secondary(dev); > + > + /* allocate uio resource */ > + ret = pci_uio_alloc_resource(dev, &uio_res); > + if ((ret != 0) || (uio_res == NULL)) > + return ret; > + > + /* Map all BARs */ > + for (i = 0; i != PCI_MAX_RESOURCE; i++) { > + /* skip empty BAR */ > + phaddr = dev->mem_resource[i].phys_addr; > + if (phaddr == 0) > + continue; > + > + ret = pci_uio_map_resource_by_index(dev, i, > + uio_res, map_idx); > + if (ret != 0) > + goto error; > + > + map_idx++; > + } > + > + uio_res->nb_maps = map_idx; > + > + TAILQ_INSERT_TAIL(uio_res_list, uio_res, next); > + > + return 0; > +error: > + for (i = 0; i < map_idx; i++) { > + pci_unmap_resource(uio_res->maps[i].addr, > + (size_t)uio_res->maps[i].size); > + rte_free(uio_res->maps[i].path); > + } > + > + /* 'uio_res' has valid value here */ > + rte_free(uio_res); > + > + /* 'uio_cfg_fd' may have invalid value */ > + if (dev->intr_handle.uio_cfg_fd >= 0) { > + close(dev->intr_handle.uio_cfg_fd); > + dev->intr_handle.uio_cfg_fd = -1; > + } > + > + /* 'fd' has valid value here */ > + close(dev->intr_handle.fd); > + dev->intr_handle.fd = -1; > + dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > + > + return -1; > +} > + > +#ifdef RTE_LIBRTE_EAL_HOTPLUG > +static void > +pci_uio_unmap(struct mapped_pci_resource *uio_res) > +{ > + int i; > + > + if (uio_res == NULL) > + return; > + > + for (i = 0; i != uio_res->nb_maps; i++) { > + pci_unmap_resource(uio_res->maps[i].addr, > + (size_t)uio_res->maps[i].size); > + rte_free(uio_res->maps[i].path); > + } > +} > + > +static struct mapped_pci_resource * > +pci_uio_find_resource(struct rte_pci_device *dev) > +{ > + struct mapped_pci_resource *uio_res; > + struct mapped_pci_res_list *uio_res_list = > + RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > + > + if (dev == NULL) > + return NULL; > + > + TAILQ_FOREACH(uio_res, uio_res_list, next) { > + > + /* skip this element if it doesn't match our PCI address */ > + if (!rte_eal_compare_pci_addr(&uio_res->pci_addr, > &dev->addr)) > + return uio_res; > + } > + return NULL; > +} > + > +/* unmap the PCI resource of a PCI device in virtual memory */ > +void > +pci_uio_unmap_resource(struct rte_pci_device *dev) > +{ > + struct mapped_pci_resource *uio_res; > + struct mapped_pci_res_list *uio_res_list = > + RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > + > + if (dev == NULL) > + return; > + > + /* find an entry for the device */ > + uio_res = pci_uio_find_resource(dev); > + if (uio_res == NULL) > + return; > + > + /* secondary processes - just free maps */ > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + return pci_uio_unmap(uio_res); > + > + TAILQ_REMOVE(uio_res_list, uio_res, next); > + > + /* unmap all resources */ > + pci_uio_unmap(uio_res); > + > + /* free uio resource */ > + rte_free(uio_res); > + > + /* close fd if in primary process */ > + close(dev->intr_handle.fd); > + if (dev->intr_handle.uio_cfg_fd >= 0) { > + close(dev->intr_handle.uio_cfg_fd); > + dev->intr_handle.uio_cfg_fd = -1; > + } > + > + dev->intr_handle.fd = -1; > + dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > +} > +#endif /* RTE_LIBRTE_EAL_HOTPLUG */ > diff --git a/lib/librte_eal/common/eal_private.h > b/lib/librte_eal/common/eal_private.h > index 4acf5a0..4125589 100644 > --- a/lib/librte_eal/common/eal_private.h > +++ b/lib/librte_eal/common/eal_private.h > @@ -2,6 +2,7 @@ > * BSD LICENSE > * > * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. > + * Copyright(c) 2015 IGEL Co., Ltd. > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -35,6 +36,7 @@ > #define _EAL_PRIVATE_H_ > > #include <stdio.h> > +#include <rte_pci.h> > > /** > * Initialize the memzone subsystem (private to eal). > @@ -154,6 +156,25 @@ struct rte_pci_driver; > struct rte_pci_device; > > /** > + * Map the PCI resource of a PCI device in virtual memory > + * > + * This function is private to EAL. > + * > + * @return > + * 0 on success, negative on error > + */ > +int pci_uio_map_resource(struct rte_pci_device *dev); > + > +#ifdef RTE_LIBRTE_EAL_HOTPLUG > +/** > + * Unmap the PCI resource of a PCI device > + * > + * This function is private to EAL. > + */ > +void pci_uio_unmap_resource(struct rte_pci_device *dev); > +#endif /* RTE_LIBRTE_EAL_HOTPLUG */ > + > +/** > * Mmap memory for single PCI device > * > * This function is private to EAL. > @@ -180,6 +201,41 @@ int rte_eal_pci_close_one_driver(struct > rte_pci_driver *dr, > struct rte_pci_device *dev); > > /** > + * Allocate uio resource for PCI device > + * > + * This function is private to EAL. > + * > + * @param dev > + * PCI device to allocate uio resource > + * @param uio_res > + * Pointer to uio resource. > + * If the function returns 0, the pointer will be filled. > + * @return > + * 0 on success, negative on error > + */ > +int pci_uio_alloc_resource(struct rte_pci_device *dev, > + struct mapped_pci_resource **uio_res); > + > +/** > + * Map device memory to uio resource > + * > + * This function is private to EAL. > + * > + * @param dev > + * PCI device that has memory information. > + * @param res_idx > + * Memory resource index of the PCI device. > + * @param uio_res > + * uio resource that will keep mapping information. > + * @param map_idx > + * Mapping information index of the uio resource. > + * @return > + * 0 on success, negative on error > + */ > +int pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, > + struct mapped_pci_resource *uio_res, int map_idx); > + > +/** > * Init tail queues for non-EAL library structures. This is to allow > * the rings, mempools, etc. lists to be shared among multiple processes > * > diff --git a/lib/librte_eal/linuxapp/eal/Makefile > b/lib/librte_eal/linuxapp/eal/Makefile > index e99d7a3..92900d6 100644 > --- a/lib/librte_eal/linuxapp/eal/Makefile > +++ b/lib/librte_eal/linuxapp/eal/Makefile > @@ -1,6 +1,7 @@ > # BSD LICENSE > # > # Copyright(c) 2010-2015 Intel Corporation. All rights reserved. > +# Copyright(c) 2015 IGEL Co., Ltd. > # All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > @@ -80,6 +81,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += > eal_common_memzone.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_log.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_launch.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_pci.c > +SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_pci_uio.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_memory.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_tailqs.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_errno.c > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_init.h > b/lib/librte_eal/linuxapp/eal/eal_pci_init.h > index d426b27..51783f0 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci_init.h > +++ b/lib/librte_eal/linuxapp/eal/eal_pci_init.h > @@ -2,6 +2,7 @@ > * BSD LICENSE > * > * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. > + * Copyright(c) 2015 IGEL Co., Ltd. > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -42,13 +43,10 @@ > extern void *pci_map_addr; > void *pci_find_max_end_va(void); > > -/* map IGB_UIO resource prototype */ > -int pci_uio_map_resource(struct rte_pci_device *dev); > - > -#ifdef RTE_LIBRTE_EAL_HOTPLUG > -/* unmap IGB_UIO resource prototype */ > -void pci_uio_unmap_resource(struct rte_pci_device *dev); > -#endif /* RTE_LIBRTE_EAL_HOTPLUG */ > +int pci_uio_alloc_resource(struct rte_pci_device *dev, > + struct mapped_pci_resource **uio_res); > +int pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, > + struct mapped_pci_resource *uio_res, int map_idx); > > #ifdef VFIO_PRESENT > > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > index cafabba..3dfc17b 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > @@ -52,11 +52,6 @@ > > void *pci_map_addr = NULL; > > -static struct rte_tailq_elem rte_uio_tailq = { > - .name = "UIO_RESOURCE_LIST", > -}; > -EAL_REGISTER_TAILQ(rte_uio_tailq) > - > #define OFF_MAX ((uint64_t)(off_t)-1) > > static int > @@ -89,52 +84,6 @@ pci_uio_set_bus_master(int dev_fd) > } > > static int > -pci_uio_map_secondary(struct rte_pci_device *dev) > -{ > - int fd, i; > - struct mapped_pci_resource *uio_res; > - struct mapped_pci_res_list *uio_res_list = > - RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > - > - TAILQ_FOREACH(uio_res, uio_res_list, next) { > - > - /* skip this element if it doesn't match our PCI address */ > - if (rte_eal_compare_pci_addr(&uio_res->pci_addr, > &dev->addr)) > - continue; > - > - for (i = 0; i != uio_res->nb_maps; i++) { > - /* > - * open devname, to mmap it > - */ > - fd = open(uio_res->maps[i].path, O_RDWR); > - if (fd < 0) { > - RTE_LOG(ERR, EAL, "Cannot open %s: %s\n", > - uio_res->maps[i].path, > strerror(errno)); > - return -1; > - } > - > - void *mapaddr = > pci_map_resource(uio_res->maps[i].addr, > - fd, (off_t)uio_res->maps[i].offset, > - (size_t)uio_res->maps[i].size, 0); > - if (mapaddr != uio_res->maps[i].addr) { > - RTE_LOG(ERR, EAL, > - "Cannot mmap device resource file > %s to address: %p\n", > - uio_res->maps[i].path, > - uio_res->maps[i].addr); > - close(fd); > - return -1; > - } > - /* fd is not needed in slave process, close it */ > - close(fd); > - } > - return 0; > - } > - > - RTE_LOG(ERR, EAL, "Cannot find resource for device\n"); > - return 1; > -} > - > -static int > pci_mknod_uio_dev(const char *sysfs_uio_path, unsigned uio_num) > { > FILE *f; > @@ -254,7 +203,7 @@ pci_get_uio_dev(struct rte_pci_device *dev, char > *dstbuf, > return uio_num; > } > > -static int > +int > pci_uio_alloc_resource(struct rte_pci_device *dev, > struct mapped_pci_resource **uio_res) > { > @@ -333,7 +282,7 @@ error: > return -1; > } > > -static int > +int > pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, > struct mapped_pci_resource *uio_res, int map_idx) > { > @@ -399,144 +348,3 @@ error: > rte_free(maps[map_idx].path); > return -1; > } > - > -/* map the PCI resource of a PCI device in virtual memory */ > -int > -pci_uio_map_resource(struct rte_pci_device *dev) > -{ > - int i, map_idx = 0, ret; > - uint64_t phaddr; > - struct mapped_pci_resource *uio_res = NULL; > - struct mapped_pci_res_list *uio_res_list = > - RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); > - > - dev->intr_handle.fd = -1; > - dev->intr_handle.uio_cfg_fd = -1; > - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > - > - /* secondary processes - use already recorded details */ > - if (rte_eal_process_type() != RTE_PROC_PRIMARY) > - return pci_uio_map_secondary(dev); > - > - /* allocate uio resource */ > - ret = pci_uio_alloc_resource(dev, &uio_res); > - if ((ret != 0) || (uio_res == NULL)) > - return ret; > - > - /* Map all BARs */ > - for (i = 0; i != PCI_MAX_RESOURCE; i++) { > - /* skip empty BAR */ > - phaddr = dev->mem_resource[i].phys_addr; > - if (phaddr == 0) > - continue; > - > - ret = pci_uio_map_resource_by_index(dev, i, > - uio_res, map_idx); > - if (ret != 0) > - goto error; > - > - map_idx++; > - } > - > - uio_res->nb_maps = map_idx; > - > - TAILQ_INSERT_TAIL(uio_res_list, uio_res, next); > - > - return 0; > - > -error: > - for (i = 0; i < map_idx; i++) { > - pci_unmap_resource(uio_res->maps[i].addr, > - (size_t)uio_res->maps[i].size); > - rte_free(uio_res->maps[i].path); > - } > - > - /* 'uio_res' has valid value here */ > - rte_free(uio_res); > - > - /* 'uio_cfg_fd' has valid value here */ > - close(dev->intr_handle.uio_cfg_fd); > - dev->intr_handle.uio_cfg_fd = -1; > - > - /* 'fd' has valid value here */ > - close(dev->intr_handle.fd); > - dev->intr_handle.fd = -1; > - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > - > - return -1; > -} > - > -#ifdef RTE_LIBRTE_EAL_HOTPLUG > -static void > -pci_uio_unmap(struct mapped_pci_resource *uio_res) > -{ > - int i; > - > - if (uio_res == NULL) > - return; > - > - for (i = 0; i != uio_res->nb_maps; i++) { > - pci_unmap_resource(uio_res->maps[i].addr, > - (size_t)uio_res->maps[i].size); > - rte_free(uio_res->maps[i].path); > - } > -} > - > -static struct mapped_pci_resource * > -pci_uio_find_resource(struct rte_pci_device *dev) > -{ > - struct mapped_pci_resource *uio_res; > - struct mapped_pci_res_list *uio_res_list = > - RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > - > - if (dev == NULL) > - return NULL; > - > - TAILQ_FOREACH(uio_res, uio_res_list, next) { > - > - /* skip this element if it doesn't match our PCI address */ > - if (!rte_eal_compare_pci_addr(&uio_res->pci_addr, > &dev->addr)) > - return uio_res; > - } > - return NULL; > -} > - > -/* unmap the PCI resource of a PCI device in virtual memory */ > -void > -pci_uio_unmap_resource(struct rte_pci_device *dev) > -{ > - struct mapped_pci_resource *uio_res; > - struct mapped_pci_res_list *uio_res_list = > - RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > - > - if (dev == NULL) > - return; > - > - /* find an entry for the device */ > - uio_res = pci_uio_find_resource(dev); > - if (uio_res == NULL) > - return; > - > - /* secondary processes - just free maps */ > - if (rte_eal_process_type() != RTE_PROC_PRIMARY) > - return pci_uio_unmap(uio_res); > - > - TAILQ_REMOVE(uio_res_list, uio_res, next); > - > - /* unmap all resources */ > - pci_uio_unmap(uio_res); > - > - /* free uio resource */ > - rte_free(uio_res); > - > - /* close fd if in primary process */ > - close(dev->intr_handle.fd); > - dev->intr_handle.fd = -1; > - > - /* close cfg_fd if in primary process */ > - close(dev->intr_handle.uio_cfg_fd); > - dev->intr_handle.uio_cfg_fd = -1; > - > - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > -} > -#endif /* RTE_LIBRTE_EAL_HOTPLUG */ > -- > 2.1.4 > Acked-by: David Marchand <david.marchand at 6wind.com> -- David Marchand