Of course you can take this job. Thanks you for your 
help.------------------------------------------------------------------From:?? 
<liang.xu at cinfotech.cn>Time:2014 Nov 10 (Mon) 18 : 01To:Burakov, Anatoly 
<anatoly.burakov at intel.com>, dev at dpdk.org <dev at 
dpdk.org>Cc:thomas.monjalon at 6wind.com <thomas.monjalon at 
6wind.com>Subject:Re: [PATCH] eal: map PCI memory resources after hugepages
It is a default value when the requested_addr isn't exist, not an overide. When 
the?pci_map_resource is called at the primary process, the?requested_addr is 
NULL. The default value will be provided by?default_map_addr.
When the?pci_map_resource is called at the secondery process, 
the?requested_addr is exist. Then everything isn't be 
changed.------------------------------------------------------------------From:Burakov,
 Anatoly <anatoly.burakov at intel.com>Time:2014 Nov 10 (Mon) 17 : 54To:?? 
<liang.xu at cinfotech.cn>, dev at dpdk.org <dev at dpdk.org>Cc:thomas.monjalon 
at 6wind.com <thomas.monjalon at 6wind.com>Subject:RE: [PATCH] eal: map PCI 
memory resources after hugepages
Hi Liang

I don't think that overriding the value passed to pci_map_resource as argument 
is the way to go. While it results in less code, it looks weird, in my opinion 
at least, as I believe tracking the correctness of address being requested 
should be the responsibility of the caller, i.e. either UIO or VFIO code. Which 
is why I keep insisting that you make requested_pci_addr global to linuxapp EAL 
PCI section and put it into include/eal_pci_init.h. Would you mind if I made a 
patch for this issue based on your code?

Thanks,
Anatoly

-----Original Message-----
From: Liang Xu [mailto:liang...@cinfotech.cn] 
Sent: Saturday, November 8, 2014 3:32 AM
To: dev at dpdk.org
Cc: Burakov, Anatoly; thomas.monjalon at 6wind.com
Subject: [PATCH] eal: map PCI memory resources after hugepages

A multiple process DPDK application must mmap hugepages and pci resources into 
same virtual addresses. By default the virtual addresses chosen by the primary 
process automatically when calling the mmap. But sometime the chosen virtual 
addresses isn't usable at secondary process. Such as the secondary process 
linked with more libraries than primary process. The library has been mapped 
into this virtual address. The command line parameter 'base-virtaddr' has been 
added for this situation. If it's configured, the hugepages will be mapped into 
this base address. But the virtual address of pci resources mapped still does 
not refer to the parameter. In that case "EAL: pci_map_resource(): cannot mmap" 
will be got.

This patch try to map pci resources after hugepages. So the error can be 
resolved by set base-virtaddr into free virtual address space.

Signed-off-by: Liang Xu <liang.xu at cinfotech.cn>
---
 lib/librte_eal/linuxapp/eal/eal_pci.c | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c 
b/lib/librte_eal/linuxapp/eal/eal_pci.c
index ddb0535..502eef2 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -97,14 +97,42 @@ error:
        return -1;
 }

+static void *
+pci_find_max_end_va(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 RTE_PTR_ADD(last->addr, last->len); }
+
 /* map a particular resource from a file */  void *  pci_map_resource(void 
*requested_addr, int fd, off_t offset, size_t size)  {
        void *mapaddr;

+       /* By default the PCI memory resource will be mapped after hugepages */
+       static void *default_map_addr;
+       if (NULL == requested_addr) {
+               if (NULL == default_map_addr)
+                       default_map_addr = pci_find_max_end_va();
+               mapaddr = default_map_addr;
+       } else {
+           mapaddr = requested_addr;
+       }
+
        /* Map the PCI memory resource of device */
-       mapaddr = mmap(requested_addr, size, PROT_READ | PROT_WRITE,
+       mapaddr = mmap(mapaddr, size, PROT_READ | PROT_WRITE,
                        MAP_SHARED, fd, offset);
        if (mapaddr == MAP_FAILED ||
                        (requested_addr != NULL && mapaddr != requested_addr)) 
{ @@ -114,6 +142,8 @@ pci_map_resource(void *requested_addr, int fd, off_t 
offset, size_t size)
                        strerror(errno), mapaddr);
                goto fail;
        }
+       if (NULL == requested_addr)
+               default_map_addr = RTE_PTR_ADD(mapaddr, size);

        RTE_LOG(DEBUG, EAL, "  PCI memory mapped at %p\n", mapaddr);

--
1.9.1

Reply via email to