I have a slight problems with this patch.

The base_virtaddr doesn't necessarily correspond to an address that everything 
gets mapped to. It's a "hint" of sorts, that may or may not be taken into 
account by mmap. Therefore we can't simply assume that if we requested a 
base-virtaddr, everything will get mapped at exactly that address. We also 
can't assume that hugepages will be ordered one after the other and occupy 
neatly all the contiguous virtual memory between base_virtaddr and 
base_virtaddr + internal_config.memory - there may be holes, for whatever 
reasons.

Also, 

Thanks,
Anatoly

-----Original Message-----
From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of lxu
Sent: Wednesday, November 5, 2014 1:25 PM
To: dev at dpdk.org
Subject: [dpdk-dev] [PATCH] eal: map uio resources after hugepages when the 
base_virtaddr is configured.

---
 lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 9 ++++++++-
 1 file changed, 8 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..bc7ed3a 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c
@@ -289,6 +289,11 @@ pci_uio_map_resource(struct rte_pci_device *dev)
        struct rte_pci_addr *loc = &dev->addr;
        struct mapped_pci_resource *uio_res;
        struct pci_map *maps;
+       static void * requested_addr = NULL;
+       if (internal_config.base_virtaddr && NULL == requested_addr) {
+               requested_addr = (uint8_t *) internal_config.base_virtaddr 
+                       + internal_config.memory;
+       }

        dev->intr_handle.fd = -1;
        dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; @@ -371,10 +376,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

Reply via email to