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> > > This patch adds a new function called pci_uio_alloc_resource(). > The function hides how to prepare uio resource in linuxapp and bsdapp. > With the function, pci_uio_map_resource() will be more abstracted. > > Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp> > --- > lib/librte_eal/bsdapp/eal/eal_pci.c | 84 +++++++++++++++++--------- > lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 98 > +++++++++++++++++++++---------- > 2 files changed, 123 insertions(+), 59 deletions(-) > > diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c > b/lib/librte_eal/bsdapp/eal/eal_pci.c > index 92d9886..ce0ca07 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_pci.c > +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c > @@ -189,28 +189,17 @@ pci_uio_map_secondary(struct rte_pci_device *dev) > return 1; > } > > -/* map the PCI resource of a PCI device in virtual memory */ > static int > -pci_uio_map_resource(struct rte_pci_device *dev) > +pci_uio_alloc_resource(struct rte_pci_device *dev, > + struct mapped_pci_resource **uio_res) > { > - int i, map_idx = 0; > char devname[PATH_MAX]; /* contains the /dev/uioX */ > - void *mapaddr; > - uint64_t phaddr; > - uint64_t offset; > - uint64_t pagesz; > - struct rte_pci_addr *loc = &dev->addr; > - 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); > - struct pci_map *maps; > + struct rte_pci_addr *loc; > > - dev->intr_handle.fd = -1; > - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > + if ((dev == NULL) || (uio_res == NULL)) > + return -1; > > This is an "internal" function, dev cannot be null, neither uio_res. > - /* secondary processes - use already recorded details */ > - if (rte_eal_process_type() != RTE_PROC_PRIMARY) > - return pci_uio_map_secondary(dev); > + loc = &dev->addr; > > snprintf(devname, sizeof(devname), "/dev/uio at pci:%u:%u:%u", > dev->addr.bus, dev->addr.devid, > dev->addr.function); > @@ -231,18 +220,57 @@ pci_uio_map_resource(struct rte_pci_device *dev) > dev->intr_handle.type = RTE_INTR_HANDLE_UIO; > > /* allocate the mapping details for secondary processes*/ > - if ((uio_res = rte_zmalloc("UIO_RES", sizeof (*uio_res), 0)) == > NULL) { > + *uio_res = rte_zmalloc("UIO_RES", sizeof(**uio_res), 0); > + if (*uio_res == NULL) { > RTE_LOG(ERR, EAL, > "%s(): cannot store uio mmap details\n", __func__); > goto error; > } > > - snprintf(uio_res->path, sizeof(uio_res->path), "%s", devname); > - memcpy(&uio_res->pci_addr, &dev->addr, sizeof(uio_res->pci_addr)); > + snprintf((*uio_res)->path, sizeof((*uio_res)->path), "%s", > devname); > + memcpy(&(*uio_res)->pci_addr, &dev->addr, > sizeof((*uio_res)->pci_addr)); > > + return 0; > + > +error: > + if (dev->intr_handle.fd) { > + close(dev->intr_handle.fd); > + dev->intr_handle.fd = -1; > + dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > + } > + 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; > + char *devname; > + void *mapaddr; > + uint64_t phaddr; > + uint64_t offset; > + uint64_t pagesz; > + 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); > + struct pci_map *maps; > + > + 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; > > If ret != 0, uio_res cannot be NULL. > /* Map all BARs */ > pagesz = sysconf(_SC_PAGESIZE); > + devname = uio_res->path; > > maps = uio_res->maps; > for (i = 0; i != PCI_MAX_RESOURCE; i++) { > @@ -298,13 +326,15 @@ pci_uio_map_resource(struct rte_pci_device *dev) > error: > for (i = 0; i < map_idx; i++) > rte_free(maps[i].path); > - if (uio_res) > - rte_free(uio_res); > - if (dev->intr_handle.fd >= 0) { > - close(dev->intr_handle.fd); > - dev->intr_handle.fd = -1; > - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > - } > + > + /* 'uio_res' has valid value here */ > Not sure what this comment means, do you mean != NULL ? It does not matter. > + 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; > } > In the end, if you add this "alloc" function, why not introduce a "free" function that does this cleanup ? Same comments apply to linux modifications. -- David Marchand