> -----Original Message----- > From: Tetsuya Mukawa [mailto:mukawa at igel.co.jp] > Sent: Monday, June 29, 2015 3:57 AM > To: dev at dpdk.org > Cc: Iremonger, Bernard; david.marchand at 6wind.com; Tetsuya.Mukawa > Subject: [PATCH v3 1/8] eal: Add pci_uio_alloc_uio_resource() > > From: "Tetsuya.Mukawa" <mukawa at igel.co.jp> > > This patch adds a new function called pci_uio_alloc_uio_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> Hi Tetsuya,
There are two comments inline below. > --- > lib/librte_eal/bsdapp/eal/eal_pci.c | 70 +++++++++++++++++++--------- > lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 77 ++++++++++++++++++++++--- > ------ > 2 files changed, 104 insertions(+), 43 deletions(-) > > diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c > b/lib/librte_eal/bsdapp/eal/eal_pci.c > index 06c564f..2d9f3a5 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_uio_resource(struct rte_pci_device *dev, > + struct mapped_pci_resource **uio_res) The name of this function is a bit longwinded, pci_uio_alloc_resource() might be better. > { > - int i, map_idx; > 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; > - 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; > > - /* 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,56 @@ 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 close_fd; > } > > - 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; > + > +close_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, 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_uio_resource(dev, &uio_res); > + if ((ret != 0) || (uio_res == NULL)) > + return ret; > > /* Map all BARs */ > pagesz = sysconf(_SC_PAGESIZE); > + devname = uio_res->path; > > maps = uio_res->maps; > for (i = 0, map_idx = 0; i != PCI_MAX_RESOURCE; i++) { @@ -300,7 > +327,8 @@ free_uio_res: > for (i = 0; i < map_idx; i++) > rte_free(maps[i].path); > rte_free(uio_res); > -close_fd: > + > + /* close fd opened by pci_uio_alloc_uio_resource() */ > close(dev->intr_handle.fd); > dev->intr_handle.fd = -1; > dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; diff --git > a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > index 19620fe..9e0b617 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > @@ -254,30 +254,20 @@ pci_get_uio_dev(struct rte_pci_device *dev, char > *dstbuf, > return uio_num; > } > > -/* map the PCI resource of a PCI device in virtual memory */ -int - > pci_uio_map_resource(struct rte_pci_device *dev) > +static int > +pci_uio_alloc_uio_resource(struct rte_pci_device *dev, > + struct mapped_pci_resource **uio_res) The name of this function is a bit longwinded, pci_uio_alloc_resource() might be better. Regards, Bernard. > { > - int i, map_idx; > char dirname[PATH_MAX]; > char cfgname[PATH_MAX]; > char devname[PATH_MAX]; /* contains the /dev/uioX */ > - void *mapaddr; > int uio_num; > - uint64_t phaddr; > - struct rte_pci_addr *loc = &dev->addr; > - 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); > - struct pci_map *maps; > + struct rte_pci_addr *loc; > > - dev->intr_handle.fd = -1; > - dev->intr_handle.uio_cfg_fd = -1; > - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > + if ((dev == NULL) || (uio_res == NULL)) > + return -1; > > - /* secondary processes - use already recorded details */ > - if (rte_eal_process_type() != RTE_PROC_PRIMARY) > - return pci_uio_map_secondary(dev); > + loc = &dev->addr; > > /* find uio resource */ > uio_num = pci_get_uio_dev(dev, dirname, sizeof(dirname)); @@ - > 318,15 +308,57 @@ pci_uio_map_resource(struct rte_pci_device *dev) > } > > /* allocate the mapping details for secondary processes*/ > - uio_res = rte_zmalloc("UIO_RES", sizeof(*uio_res), 0); > - if (uio_res == 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 close_fd; > } > > - 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; > + > +close_fd: > + if (dev->intr_handle.uio_cfg_fd >= 0) { > + close(dev->intr_handle.uio_cfg_fd); > + dev->intr_handle.uio_cfg_fd = -1; > + } > + > + 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 */ int > +pci_uio_map_resource(struct rte_pci_device *dev) { > + int i, map_idx, ret; > + char devname[PATH_MAX]; /* contains the /dev/uioX */ > + void *mapaddr; > + uint64_t phaddr; > + 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; > + > + 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_uio_resource(dev, &uio_res); > + if ((ret != 0) || (uio_res == NULL)) > + return ret; > > /* Map all BARs */ > maps = uio_res->maps; > @@ -401,7 +433,8 @@ free_uio_res: > rte_free(maps[i].path); > } > rte_free(uio_res); > -close_fd: > + > + /* close fd opened by pci_uio_alloc_uio_resource() */ > if (dev->intr_handle.uio_cfg_fd >= 0) { > close(dev->intr_handle.uio_cfg_fd); > dev->intr_handle.uio_cfg_fd = -1; > -- > 2.1.4