Ah, that makes sense. So you?re actually hitting the very issue I?m concerned 
about when mapping purely with base-virtaddr (a library is mapped into where 
you?re trying to map your UIO resources).

Well, as I said, you can try and walk the memsegs and work out the biggest 
end-address of hugepage memory. That?s the easiest way I can think of.

Thanks,
Anatoly

From: XU Liang [mailto:liang...@cinfotech.cn]
Sent: Wednesday, November 5, 2014 4:10 PM
To: Burakov, Anatoly; dev at dpdk.org
Subject: ??????[dpdk-dev] [PATCH] eal: map uio resources after hugepages when 
the base_virtaddr is configured.

I have a multiple processes application. When start a secondary process, we got 
error message "EAL: pci_map_resource(): cannot mmap(11, 0x7ffff7fba000, 
0x20000, 0x0): Bad file descriptor (0x7ffff7fb9000)".

The secondary process link difference shared libraries, so the address 
0x7ffff7fba000 is used.

------------------------------------------------------------------
????Burakov, Anatoly <anatoly.burakov at intel.com<mailto:anatoly.burakov at 
intel.com>>
?????2014?11?5?(???) 23:59
?????? <liang.xu at cinfotech.cn<mailto:liang.xu at cinfotech.cn>>?dev at 
dpdk.org<mailto:dev at dpdk.org> <dev at dpdk.org<mailto:dev at dpdk.org>>
????RE: ???[dpdk-dev] [PATCH] eal: map uio resources after hugepages when the 
base_virtaddr is configured.

Hi Liang

Yes it is a problem. Even if it was carefully selected by user, nothing stops 
the DPDK application from mapping something into where you?re trying to map 
your UIO devices. Plus, this changes the default behavior where a wrong 
base-virtaddr leads to a failure to initialize, rather than simply using a 
different address (remember that pci_map_resource fails if it cannot map the 
resource at the exact address you requested).

A very crude way of finding out where hugepages end would be to walk the 
hugepage memory (walk through memsegs and note the maximum start addr + length 
of that memseg).

Could you perhaps explain what is the problem that you?re trying to solve with 
this? I can?t think of a situation where the location of UIO maps would matter, 
to be honest.

Thanks,
Anatoly

From: XU Liang [mailto:liang...@cinfotech.cn]
Sent: Wednesday, November 5, 2014 3:49 PM
To: Burakov, Anatoly; dev at dpdk.org<mailto:dev at dpdk.org>
Subject: ???[dpdk-dev] [PATCH] eal: map uio resources after hugepages when the 
base_virtaddr is configured.

I think the base_virtadd will be carefully selected by user when they need it. 
So maybe it's not a real problem.  :>

The real reason is I can't find a easy way to get the end address of hugepages. 
Can you give me some suggestions ?
------------------------------------------------------------------
????Burakov, Anatoly <anatoly.burakov at intel.com<mailto:anatoly.burakov at 
intel.com>>
?????2014?11?5?(???) 23:10
?????? <liang.xu at cinfotech.cn<mailto:liang.xu at cinfotech.cn>>?dev at 
dpdk.org<mailto:dev at dpdk.org> <dev at dpdk.org<mailto:dev at dpdk.org>>
????RE: [dpdk-dev] [PATCH] eal: map uio resources after hugepages when the 
base_virtaddr is configured.

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<mailto: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