Message ID | 1415285223-7662-1-git-send-email-liang.xu@cinfotech.cn (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
Include at least signoff. > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of lxu > Sent: Thursday, November 06, 2014 2:47 PM > To: dev@dpdk.org > Subject: [dpdk-dev] [PATCH v3] eal: map uio resources after hugepages > when the base_virtaddr is configured. > > --- > lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 29 > ++++++++++++++++++++++++++++- > 1 file changed, 28 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > index 7e62266..3a218d0 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c > @@ -273,6 +273,24 @@ pci_get_uio_dev(struct rte_pci_device *dev, char > *dstbuf, > return uio_num; > } > > +static inline const struct rte_memseg * > +get_physmem_last(void) > +{ > + const struct rte_memseg * seg = rte_eal_get_physmem_layout(); > + const struct rte_memseg * last = seg; > + unsigned i = 0; > + > + for (i=0; i<RTE_MAX_MEMSEG; i++, seg++) { > + if (seg->addr == NULL) > + break; > + > + if(seg->addr > last->addr) > + last = seg; > + > + } > + return last; > +} > + > /* map the PCI resource of a PCI device in virtual memory */ > int > pci_uio_map_resource(struct rte_pci_device *dev) > @@ -290,6 +308,13 @@ pci_uio_map_resource(struct rte_pci_device *dev) > struct mapped_pci_resource *uio_res; > struct pci_map *maps; > > + /* map uio resource into user required virtual address */ > + static void * requested_addr; > + if (internal_config.base_virtaddr && NULL == requested_addr) { > + const struct rte_memseg * last = get_physmem_last(); > + requested_addr = RTE_PTR_ADD(last->addr, last->len); > + } > + > dev->intr_handle.fd = -1; > dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; > > @@ -371,10 +396,12 @@ pci_uio_map_resource(struct rte_pci_device *dev) > if (maps[j].addr != NULL) > fail = 1; > else { > - mapaddr = pci_map_resource(NULL, fd, > (off_t)offset, > + mapaddr = > pci_map_resource(requested_addr, fd, (off_t)offset, > (size_t)maps[j].size); > if (mapaddr == NULL) > fail = 1; > + else if (NULL != requested_addr) > + requested_addr = (uint8_t > *)mapaddr + maps[j].size; > } > > if (fail) { > -- > 1.9.1
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c index 7e62266..3a218d0 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c @@ -273,6 +273,24 @@ pci_get_uio_dev(struct rte_pci_device *dev, char *dstbuf, return uio_num; } +static inline const struct rte_memseg * +get_physmem_last(void) +{ + const struct rte_memseg * seg = rte_eal_get_physmem_layout(); + const struct rte_memseg * last = seg; + unsigned i = 0; + + for (i=0; i<RTE_MAX_MEMSEG; i++, seg++) { + if (seg->addr == NULL) + break; + + if(seg->addr > last->addr) + last = seg; + + } + return last; +} + /* map the PCI resource of a PCI device in virtual memory */ int pci_uio_map_resource(struct rte_pci_device *dev) @@ -290,6 +308,13 @@ pci_uio_map_resource(struct rte_pci_device *dev) struct mapped_pci_resource *uio_res; struct pci_map *maps; + /* map uio resource into user required virtual address */ + static void * requested_addr; + if (internal_config.base_virtaddr && NULL == requested_addr) { + const struct rte_memseg * last = get_physmem_last(); + requested_addr = RTE_PTR_ADD(last->addr, last->len); + } + dev->intr_handle.fd = -1; dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; @@ -371,10 +396,12 @@ pci_uio_map_resource(struct rte_pci_device *dev) if (maps[j].addr != NULL) fail = 1; else { - mapaddr = pci_map_resource(NULL, fd, (off_t)offset, + mapaddr = pci_map_resource(requested_addr, fd, (off_t)offset, (size_t)maps[j].size); if (mapaddr == NULL) fail = 1; + else if (NULL != requested_addr) + requested_addr = (uint8_t *)mapaddr + maps[j].size; } if (fail) {