bus/pci: use memseg walk instead of iteration

Reduce dependency on internal details of EAL memory subsystem, and
simplify code.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Tested-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
This commit is contained in:
Anatoly Burakov 2018-04-11 13:30:02 +01:00 committed by Thomas Monjalon
parent 49a28baed2
commit 7411d03249
3 changed files with 20 additions and 12 deletions

View File

@ -49,6 +49,9 @@ CFLAGS += -I$(RTE_SDK)/drivers/bus/pci/$(SYSTEM)
CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common
CFLAGS += -I$(RTE_SDK)/lib/librte_eal/$(SYSTEM)app/eal
# memseg walk is not part of stable API yet
CFLAGS += -DALLOW_EXPERIMENTAL_API
LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
LDLIBS += -lrte_ethdev -lrte_pci

View File

@ -116,22 +116,24 @@ rte_pci_unmap_device(struct rte_pci_device *dev)
}
}
static int
find_max_end_va(const struct rte_memseg *ms, void *arg)
{
void *end_va = RTE_PTR_ADD(ms->addr, ms->len);
void **max_va = arg;
if (*max_va < end_va)
*max_va = end_va;
return 0;
}
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;
void *va = NULL;
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);
rte_memseg_walk(find_max_end_va, &va);
return va;
}
/* parse one line of the "resource" sysfs file (note that the 'line'

View File

@ -14,3 +14,6 @@ else
sources += files('bsd/pci.c')
includes += include_directories('bsd')
endif
# memseg walk is not part of stable API yet
allow_experimental_apis = true