From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi0-f53.google.com (mail-oi0-f53.google.com [209.85.218.53]) by dpdk.org (Postfix) with ESMTP id 0387FE72 for ; Tue, 7 Jul 2015 10:07:10 +0200 (CEST) Received: by oiab3 with SMTP id b3so17665831oia.1 for ; Tue, 07 Jul 2015 01:07:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=wUUH0at5JkgFJiXSYlYGQIzZwyAVhGL6CJPgUU2OMEI=; b=R6gZ2oHvqoFGOka1tUZrH8MaFHmi9B5qusKq9rnGnfdeqeHzwOAqXe9JrVjYny3s2G nb1kudBliu0zEz94KnGDj8Iv8Cm4YS0PD5euNnvR8Dzt2CfHgH525DEXMc0LDGZM1AKc PvtblCMyKrG9R7XedKCJF4vqmSJKpU6bbw+SSJ7ja9pVCWaX0ivM7xHYltZ1qFlKZ3Q/ 7l+hQpMKsazXY9l5ABSRHA23nKXrem4KWyACIA31cFQPE3tv7FvJ9UbptaB0MPivSgib 8GVKqEo3IWqeUJSryNJ1rI3jvlO7D8XdQM8WnpRmcsUNU7rL4x/ittNJTP+OBGElQ36D AOEA== X-Gm-Message-State: ALoCoQlj9bqRK8Y13PrVpjmaMf6/3bdhvoaeTEiavGUDmnsCDRSl4GDHwSjrYEzQU1oIGzXiepH0 MIME-Version: 1.0 X-Received: by 10.182.230.70 with SMTP id sw6mr2832344obc.48.1436256429369; Tue, 07 Jul 2015 01:07:09 -0700 (PDT) Received: by 10.76.84.233 with HTTP; Tue, 7 Jul 2015 01:07:09 -0700 (PDT) In-Reply-To: <1436163861-3025-11-git-send-email-mukawa@igel.co.jp> References: <1435652668-3380-12-git-send-email-mukawa@igel.co.jp> <1436163861-3025-1-git-send-email-mukawa@igel.co.jp> <1436163861-3025-11-git-send-email-mukawa@igel.co.jp> Date: Tue, 7 Jul 2015 10:07:09 +0200 Message-ID: From: David Marchand To: Tetsuya Mukawa Content-Type: text/plain; charset=UTF-8 X-Content-Filtered-By: Mailman/MimeDel 2.1.15 Cc: "dev@dpdk.org" Subject: Re: [dpdk-dev] [PATCH v8 10/12] eal: Consolidate pci uio functions of linuxapp and bsdapp X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 07 Jul 2015 08:07:10 -0000 On Mon, Jul 6, 2015 at 8:24 AM, Tetsuya Mukawa wrote: > From: "Tetsuya.Mukawa" > > 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 > --- > 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 > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > + > +#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 > +#include > > /** > * 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