From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 372E8C482 for ; Mon, 29 Jun 2015 16:04:07 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 29 Jun 2015 07:03:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,698,1427785200"; d="scan'208";a="752514930" Received: from irsmsx101.ger.corp.intel.com ([163.33.3.153]) by fmsmga002.fm.intel.com with ESMTP; 29 Jun 2015 07:03:56 -0700 Received: from irsmsx108.ger.corp.intel.com ([169.254.11.201]) by IRSMSX101.ger.corp.intel.com ([169.254.1.201]) with mapi id 14.03.0224.002; Mon, 29 Jun 2015 15:03:55 +0100 From: "Iremonger, Bernard" To: Tetsuya Mukawa , "dev@dpdk.org" Thread-Topic: [PATCH v3 7/8] eal: Consolidate pci uio functions of linuxapp and bsdapp Thread-Index: AQHQshdoKhr4ZCtHd0eOGxT4uViGxp3Dg7lw Date: Mon, 29 Jun 2015 14:03:55 +0000 Message-ID: <8CEF83825BEC744B83065625E567D7C204A42DCA@IRSMSX108.ger.corp.intel.com> References: <1432016513-8456-5-git-send-email-mukawa@igel.co.jp> <1435546610-4533-1-git-send-email-mukawa@igel.co.jp> <1435546610-4533-8-git-send-email-mukawa@igel.co.jp> In-Reply-To: <1435546610-4533-8-git-send-email-mukawa@igel.co.jp> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.182] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v3 7/8] 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: Mon, 29 Jun 2015 14:04:08 -0000 > -----Original Message----- > From: Tetsuya Mukawa [mailto:mukawa@igel.co.jp] > Sent: Monday, June 29, 2015 3:57 AM > To: dev@dpdk.org > Cc: Iremonger, Bernard; david.marchand@6wind.com; Tetsuya.Mukawa > Subject: [PATCH v3 7/8] eal: Consolidate pci uio functions of linuxapp an= d > bsdapp >=20 > From: "Tetsuya.Mukawa" >=20 > 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() >=20 > Signed-off-by: Tetsuya Mukawa Hi Tetsuya, The copyrights of all files in this patch set should be updated to 2015. Regards, Bernard. > --- > lib/librte_eal/bsdapp/eal/Makefile | 1 + > lib/librte_eal/bsdapp/eal/eal_pci.c | 110 +-------- > .../bsdapp/eal/include/exec-env/rte_interrupts.h | 1 + > lib/librte_eal/common/eal_common_pci_uio.c | 270 > +++++++++++++++++++++ > lib/librte_eal/common/eal_private.h | 36 +++ > lib/librte_eal/linuxapp/eal/Makefile | 1 + > lib/librte_eal/linuxapp/eal/eal_pci_init.h | 11 +- > lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 196 +-------------- > 8 files changed, 317 insertions(+), 309 deletions(-) create mode 100644 > lib/librte_eal/common/eal_common_pci_uio.c >=20 > diff --git a/lib/librte_eal/bsdapp/eal/Makefile > b/lib/librte_eal/bsdapp/eal/Makefile > index c73ffb6..40ec648 100644 > --- a/lib/librte_eal/bsdapp/eal/Makefile > +++ b/lib/librte_eal/bsdapp/eal/Makefile > @@ -68,6 +68,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) +=3D > eal_common_memzone.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) +=3D eal_common_log.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) +=3D eal_common_launch.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) +=3D eal_common_pci.c > +SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) +=3D eal_common_pci_uio.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) +=3D eal_common_memory.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) +=3D eal_common_tailqs.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) +=3D 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 92a9fcf..0103e2b 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_pci.c > +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c > @@ -82,10 +82,6 @@ > * network card, only providing access to PCI BAR to applications, and > * enabling bus master. > */ > -static struct rte_tailq_elem rte_uio_tailq =3D { > - .name =3D "UIO_RESOURCE_LIST", > -}; > -EAL_REGISTER_TAILQ(rte_uio_tailq) >=20 > /* unbind kernel driver for this device */ int @@ -96,54 +92,7 @@ > pci_unbind_kernel_driver(struct rte_pci_device *dev __rte_unused) > return -ENOTSUP; > } >=20 > -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 =3D > - 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 =3D 0; i !=3D uio_res->nb_maps; i++) { > - /* > - * open devname, to mmap it > - */ > - fd =3D 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 =3D 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 !=3D 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_uio_resource(struct rte_pci_device *dev, > struct mapped_pci_resource **uio_res) { @@ -194,7 +143,7 > @@ close_fd: > return -1; > } >=20 > -static int > +int > pci_uio_map_uio_resource_by_index(struct rte_pci_device *dev, int > res_idx, > struct mapped_pci_resource *uio_res, int map_idx) { @@ - > 252,61 +201,6 @@ fail: > return -1; > } >=20 > -/* 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, ret; > - uint64_t phaddr; > - struct mapped_pci_resource *uio_res =3D NULL; > - struct mapped_pci_res_list *uio_res_list =3D > - RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); > - > - dev->intr_handle.fd =3D -1; > - dev->intr_handle.type =3D RTE_INTR_HANDLE_UNKNOWN; > - > - /* secondary processes - use already recorded details */ > - if (rte_eal_process_type() !=3D RTE_PROC_PRIMARY) > - return pci_uio_map_secondary(dev); > - > - /* allocate uio resource */ > - ret =3D pci_uio_alloc_uio_resource(dev, &uio_res); > - if ((ret !=3D 0) || (uio_res =3D=3D NULL)) > - return ret; > - > - /* Map all BARs */ > - for (i =3D 0, map_idx =3D 0; i !=3D PCI_MAX_RESOURCE; i++) { > - /* skip empty BAR */ > - if ((phaddr =3D dev->mem_resource[i].phys_addr) =3D=3D 0) > - continue; > - > - ret =3D pci_uio_map_uio_resource_by_index(dev, i, > - uio_res, map_idx); > - if (ret !=3D 0) > - goto free_uio_res; > - > - map_idx++; > - } > - > - uio_res->nb_maps =3D map_idx; > - > - TAILQ_INSERT_TAIL(uio_res_list, uio_res, next); > - > - return 0; > - > -free_uio_res: > - for (i =3D 0; i < map_idx; i++) > - rte_free(uio_res->maps[i].path); > - rte_free(uio_res); > - > - /* close fd opened by pci_uio_alloc_uio_resource() */ > - close(dev->intr_handle.fd); > - dev->intr_handle.fd =3D -1; > - dev->intr_handle.type =3D RTE_INTR_HANDLE_UNKNOWN; > - > - return -1; > -} > - > /* Scan one pci sysfs entry, and fill the devices list from it. */ stat= ic 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..d4c388f 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 > @@ -48,6 +48,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 */ }; >=20 > 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..374478e > --- /dev/null > +++ b/lib/librte_eal/common/eal_common_pci_uio.c > @@ -0,0 +1,270 @@ > +/*- > + * BSD LICENSE > + * > + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. > + * 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 copyrig= ht > + * 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. > + */ > +/*- > + * BSD LICENSE > + * > + * Copyright(c) 2015 IGEL Co.,Ltd. All rights reserved. > + * 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 copyrig= ht > + * notice, this list of conditions and the following disclaimer in > + * the documentation and/or other materials provided with the > + * distribution. > + * * Neither the name of IGEL Co.,Ltd. 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 =3D { > + .name =3D "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 =3D > + 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 =3D 0; i !=3D uio_res->nb_maps; i++) { > + /* > + * open devname, to mmap it > + */ > + fd =3D 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 =3D 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 !=3D 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, ret; > + uint64_t phaddr; > + struct mapped_pci_resource *uio_res =3D NULL; > + struct mapped_pci_res_list *uio_res_list =3D > + RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); > + > + dev->intr_handle.fd =3D -1; > + dev->intr_handle.uio_cfg_fd =3D -1; > + dev->intr_handle.type =3D RTE_INTR_HANDLE_UNKNOWN; > + > + /* secondary processes - use already recorded details */ > + if (rte_eal_process_type() !=3D RTE_PROC_PRIMARY) > + return pci_uio_map_secondary(dev); > + > + /* allocate uio resource */ > + ret =3D pci_uio_alloc_uio_resource(dev, &uio_res); > + if ((ret !=3D 0) || (uio_res =3D=3D NULL)) > + return ret; > + > + /* Map all BARs */ > + for (i =3D 0, map_idx =3D 0; i !=3D PCI_MAX_RESOURCE; i++) { > + /* skip empty BAR */ > + phaddr =3D dev->mem_resource[i].phys_addr; > + if (phaddr =3D=3D 0) > + continue; > + > + ret =3D pci_uio_map_uio_resource_by_index(dev, i, > + uio_res, map_idx); > + if (ret !=3D 0) > + goto free_uio_res; > + > + map_idx++; > + } > + > + uio_res->nb_maps =3D map_idx; > + > + TAILQ_INSERT_TAIL(uio_res_list, uio_res, next); > + > + return 0; > + > +free_uio_res: > + for (i =3D 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); > + } > + rte_free(uio_res); > + > + /* close fd opened by pci_uio_alloc_uio_resource() */ > + if (dev->intr_handle.uio_cfg_fd >=3D 0) { > + close(dev->intr_handle.uio_cfg_fd); > + dev->intr_handle.uio_cfg_fd =3D -1; > + } > + > + close(dev->intr_handle.fd); > + dev->intr_handle.fd =3D -1; > + dev->intr_handle.type =3D 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 =3D=3D NULL) > + return; > + > + for (i =3D 0; i !=3D 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 =3D > + RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > + > + if (dev =3D=3D 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 =3D > + RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > + > + if (dev =3D=3D NULL) > + return; > + > + /* find an entry for the device */ > + uio_res =3D pci_uio_find_resource(dev); > + if (uio_res =3D=3D NULL) > + return; > + > + /* secondary processes - just free maps */ > + if (rte_eal_process_type() !=3D 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 >=3D 0) { > + close(dev->intr_handle.uio_cfg_fd); > + dev->intr_handle.uio_cfg_fd =3D -1; > + } > + > + dev->intr_handle.fd =3D -1; > + dev->intr_handle.type =3D 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 badb55c..8c4145a 100644 > --- a/lib/librte_eal/common/eal_private.h > +++ b/lib/librte_eal/common/eal_private.h > @@ -35,6 +35,7 @@ > #define _EAL_PRIVATE_H_ >=20 > #include > +#include >=20 > /** > * Initialize the memzone subsystem (private to eal). > @@ -181,6 +182,41 @@ int pci_uio_map_resource(struct rte_pci_device > *dev); void pci_uio_unmap_resource(struct rte_pci_device *dev); >=20 > /** > + * 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_uio_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_uio_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..42a16fe 100644 > --- a/lib/librte_eal/linuxapp/eal/Makefile > +++ b/lib/librte_eal/linuxapp/eal/Makefile > @@ -80,6 +80,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) +=3D > eal_common_memzone.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) +=3D eal_common_log.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) +=3D eal_common_launch.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) +=3D eal_common_pci.c > +SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) +=3D eal_common_pci_uio.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) +=3D eal_common_memory.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) +=3D eal_common_tailqs.c > SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) +=3D 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..90409b3 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci_init.h > +++ b/lib/librte_eal/linuxapp/eal/eal_pci_init.h > @@ -42,13 +42,10 @@ > extern void *pci_map_addr; > void *pci_find_max_end_va(void); >=20 > -/* 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_uio_resource(struct rte_pci_device *dev, > + struct mapped_pci_resource **uio_res); int > +pci_uio_map_uio_resource_by_index(struct rte_pci_device *dev, int > res_idx, > + struct mapped_pci_resource *uio_res, int map_idx); >=20 > #ifdef VFIO_PRESENT >=20 > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > index 7da4543..3d475c7 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > @@ -51,11 +51,6 @@ >=20 > void *pci_map_addr =3D NULL; >=20 > -static struct rte_tailq_elem rte_uio_tailq =3D { > - .name =3D "UIO_RESOURCE_LIST", > -}; > -EAL_REGISTER_TAILQ(rte_uio_tailq) > - > #define OFF_MAX ((uint64_t)(off_t)-1) >=20 > static int > @@ -88,53 +83,6 @@ pci_uio_set_bus_master(int dev_fd) } >=20 > 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 =3D > - 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 =3D 0; i !=3D uio_res->nb_maps; i++) { > - /* > - * open devname, to mmap it > - */ > - fd =3D 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 =3D 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 !=3D 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 +202,7 @@ pci_get_uio_dev(struct rte_pci_device *dev, char > *dstbuf, > return uio_num; > } >=20 > -static int > +int > pci_uio_alloc_uio_resource(struct rte_pci_device *dev, > struct mapped_pci_resource **uio_res) { @@ -333,7 +281,7 > @@ close_fd: > return -1; > } >=20 > -static int > +int > pci_uio_map_uio_resource_by_index(struct rte_pci_device *dev, int > res_idx, > struct mapped_pci_resource *uio_res, int map_idx) { @@ - > 399,143 +347,3 @@ fail: > 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, ret; > - uint64_t phaddr; > - struct mapped_pci_resource *uio_res =3D NULL; > - struct mapped_pci_res_list *uio_res_list =3D > - RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); > - > - dev->intr_handle.fd =3D -1; > - dev->intr_handle.uio_cfg_fd =3D -1; > - dev->intr_handle.type =3D RTE_INTR_HANDLE_UNKNOWN; > - > - /* secondary processes - use already recorded details */ > - if (rte_eal_process_type() !=3D RTE_PROC_PRIMARY) > - return pci_uio_map_secondary(dev); > - > - /* allocate uio resource */ > - ret =3D pci_uio_alloc_uio_resource(dev, &uio_res); > - if ((ret !=3D 0) || (uio_res =3D=3D NULL)) > - return ret; > - > - /* Map all BARs */ > - for (i =3D 0, map_idx =3D 0; i !=3D PCI_MAX_RESOURCE; i++) { > - /* skip empty BAR */ > - phaddr =3D dev->mem_resource[i].phys_addr; > - if (phaddr =3D=3D 0) > - continue; > - > - ret =3D pci_uio_map_uio_resource_by_index(dev, i, > - uio_res, map_idx); > - if (ret !=3D 0) > - goto free_uio_res; > - > - map_idx++; > - } > - > - uio_res->nb_maps =3D map_idx; > - > - TAILQ_INSERT_TAIL(uio_res_list, uio_res, next); > - > - return 0; > - > -free_uio_res: > - for (i =3D 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); > - } > - rte_free(uio_res); > - > - /* close fd opened by pci_uio_alloc_uio_resource() */ > - if (dev->intr_handle.uio_cfg_fd >=3D 0) { > - close(dev->intr_handle.uio_cfg_fd); > - dev->intr_handle.uio_cfg_fd =3D -1; > - } > - > - close(dev->intr_handle.fd); > - dev->intr_handle.fd =3D -1; > - dev->intr_handle.type =3D 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 =3D=3D NULL) > - return; > - > - for (i =3D 0; i !=3D 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 =3D > - RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > - > - if (dev =3D=3D 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 =3D > - RTE_TAILQ_CAST(rte_uio_tailq.head, > mapped_pci_res_list); > - > - if (dev =3D=3D NULL) > - return; > - > - /* find an entry for the device */ > - uio_res =3D pci_uio_find_resource(dev); > - if (uio_res =3D=3D NULL) > - return; > - > - /* secondary processes - just free maps */ > - if (rte_eal_process_type() !=3D 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 =3D -1; > - > - /* close cfg_fd if in primary process */ > - close(dev->intr_handle.uio_cfg_fd); > - dev->intr_handle.uio_cfg_fd =3D -1; > - > - dev->intr_handle.type =3D RTE_INTR_HANDLE_UNKNOWN; > -} > -#endif /* RTE_LIBRTE_EAL_HOTPLUG */ > -- > 2.1.4