mem: add contig walk function

This function is meant to walk over first segment of each
VA-contiguous group of memsegs.

For future users of this function, this is done so that
there is less dependency on internals of mem API and less
noise later change sets.

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:09 +01:00 committed by Thomas Monjalon
parent 20681b17ba
commit 552afc420a
3 changed files with 65 additions and 0 deletions

View File

@ -242,6 +242,43 @@ rte_memseg_walk(rte_memseg_walk_t func, void *arg)
return 0;
}
int __rte_experimental
rte_memseg_contig_walk(rte_memseg_contig_walk_t func, void *arg)
{
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
int i, j, ret;
for (i = 0; i < RTE_MAX_MEMSEG; i++) {
const struct rte_memseg *ms = &mcfg->memseg[i];
size_t total_len;
void *end_addr;
if (ms->addr == NULL)
continue;
end_addr = RTE_PTR_ADD(ms->addr, ms->len);
/* check how many more segments are contiguous to this one */
for (j = i + 1; j < RTE_MAX_MEMSEG; j++) {
const struct rte_memseg *next = &mcfg->memseg[j];
if (next->addr != end_addr)
break;
end_addr = RTE_PTR_ADD(next->addr, next->len);
i++;
}
total_len = RTE_PTR_DIFF(end_addr, ms->addr);
ret = func(ms, total_len, arg);
if (ret < 0)
return -1;
if (ret > 0)
return 1;
}
return 0;
}
/* init memory subsystem */
int
rte_eal_memory_init(void)

View File

@ -139,6 +139,18 @@ rte_iova_t rte_mem_virt2iova(const void *virt);
*/
typedef int (*rte_memseg_walk_t)(const struct rte_memseg *ms, void *arg);
/**
* Memseg contig walk function prototype. This will trigger a callback on every
* VA-contiguous are starting at memseg ``ms``, so total valid VA space at each
* callback call will be [``ms->addr``, ``ms->addr + len``).
*
* Returning 0 will continue walk
* Returning 1 will stop the walk
* Returning -1 will stop the walk and report error
*/
typedef int (*rte_memseg_contig_walk_t)(const struct rte_memseg *ms,
size_t len, void *arg);
/**
* Walk list of all memsegs.
*
@ -154,6 +166,21 @@ typedef int (*rte_memseg_walk_t)(const struct rte_memseg *ms, void *arg);
int __rte_experimental
rte_memseg_walk(rte_memseg_walk_t func, void *arg);
/**
* Walk each VA-contiguous area.
*
* @param func
* Iterator function
* @param arg
* Argument passed to iterator
* @return
* 0 if walked over the entire list
* 1 if stopped by the user
* -1 if user function reported error
*/
int __rte_experimental
rte_memseg_contig_walk(rte_memseg_contig_walk_t func, void *arg);
/**
* Get the layout of the available physical memory.
*

View File

@ -223,6 +223,7 @@ EXPERIMENTAL {
rte_eal_mbuf_user_pool_ops;
rte_log_register_type_and_pick_level;
rte_malloc_dump_heaps;
rte_memseg_contig_walk;
rte_memseg_walk;
rte_mp_action_register;
rte_mp_action_unregister;