@@ -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)