eal: 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:04 +01:00 committed by Thomas Monjalon
parent 8594a2026b
commit 221b67bca0
4 changed files with 82 additions and 67 deletions

View File

@ -429,23 +429,26 @@ out:
return ret;
}
static int
check_socket(const struct rte_memseg *ms, void *arg)
{
int *socket_id = arg;
if (ms->socket_id == *socket_id)
return 1;
return 0;
}
static void
eal_check_mem_on_local_socket(void)
{
const struct rte_memseg *ms;
int i, socket_id;
int socket_id;
socket_id = rte_lcore_to_socket_id(rte_config.master_lcore);
ms = rte_eal_get_physmem_layout();
for (i = 0; i < RTE_MAX_MEMSEG; i++)
if (ms[i].socket_id == socket_id &&
ms[i].len > 0)
return;
RTE_LOG(WARNING, EAL, "WARNING: Master core has no "
"memory on local socket!\n");
if (rte_memseg_walk(check_socket, &socket_id) == 0)
RTE_LOG(WARNING, EAL, "WARNING: Master core has no memory on local socket!\n");
}
static int

View File

@ -131,54 +131,57 @@ rte_eal_get_physmem_layout(void)
return rte_eal_get_configuration()->mem_config->memseg;
}
static int
physmem_size(const struct rte_memseg *ms, void *arg)
{
uint64_t *total_len = arg;
*total_len += ms->len;
return 0;
}
/* get the total size of memory */
uint64_t
rte_eal_get_physmem_size(void)
{
const struct rte_mem_config *mcfg;
unsigned i = 0;
uint64_t total_len = 0;
/* get pointer to global configuration */
mcfg = rte_eal_get_configuration()->mem_config;
for (i = 0; i < RTE_MAX_MEMSEG; i++) {
if (mcfg->memseg[i].addr == NULL)
break;
total_len += mcfg->memseg[i].len;
}
rte_memseg_walk(physmem_size, &total_len);
return total_len;
}
static int
dump_memseg(const struct rte_memseg *ms, void *arg)
{
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
int i = ms - mcfg->memseg;
FILE *f = arg;
if (i < 0 || i >= RTE_MAX_MEMSEG)
return -1;
fprintf(f, "Segment %u: IOVA:0x%"PRIx64", len:%zu, "
"virt:%p, socket_id:%"PRId32", "
"hugepage_sz:%"PRIu64", nchannel:%"PRIx32", "
"nrank:%"PRIx32"\n", i,
mcfg->memseg[i].iova,
mcfg->memseg[i].len,
mcfg->memseg[i].addr,
mcfg->memseg[i].socket_id,
mcfg->memseg[i].hugepage_sz,
mcfg->memseg[i].nchannel,
mcfg->memseg[i].nrank);
return 0;
}
/* Dump the physical memory layout on console */
void
rte_dump_physmem_layout(FILE *f)
{
const struct rte_mem_config *mcfg;
unsigned i = 0;
/* get pointer to global configuration */
mcfg = rte_eal_get_configuration()->mem_config;
for (i = 0; i < RTE_MAX_MEMSEG; i++) {
if (mcfg->memseg[i].addr == NULL)
break;
fprintf(f, "Segment %u: IOVA:0x%"PRIx64", len:%zu, "
"virt:%p, socket_id:%"PRId32", "
"hugepage_sz:%"PRIu64", nchannel:%"PRIx32", "
"nrank:%"PRIx32"\n", i,
mcfg->memseg[i].iova,
mcfg->memseg[i].len,
mcfg->memseg[i].addr,
mcfg->memseg[i].socket_id,
mcfg->memseg[i].hugepage_sz,
mcfg->memseg[i].nchannel,
mcfg->memseg[i].nrank);
}
rte_memseg_walk(dump_memseg, f);
}
/* return the number of memory channels */

View File

@ -67,17 +67,32 @@ check_hugepage_sz(unsigned flags, uint64_t hugepage_sz)
* to prevent overflow. The rest of the zone is added to free list as a single
* large free block
*/
static void
malloc_heap_add_memseg(struct malloc_heap *heap, struct rte_memseg *ms)
static int
malloc_heap_add_memseg(const struct rte_memseg *ms, void *arg __rte_unused)
{
struct malloc_elem *start_elem = (struct malloc_elem *)ms->addr;
const size_t elem_size = ms->len - MALLOC_ELEM_OVERHEAD;
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
struct malloc_elem *start_elem;
struct rte_memseg *found_ms;
struct malloc_heap *heap;
size_t elem_size;
int ms_idx;
malloc_elem_init(start_elem, heap, ms, elem_size);
heap = &mcfg->malloc_heaps[ms->socket_id];
/* ms is const, so find it */
ms_idx = ms - mcfg->memseg;
found_ms = &mcfg->memseg[ms_idx];
start_elem = (struct malloc_elem *)found_ms->addr;
elem_size = ms->len - MALLOC_ELEM_OVERHEAD;
malloc_elem_init(start_elem, heap, found_ms, elem_size);
malloc_elem_insert(start_elem);
malloc_elem_free_list_insert(start_elem);
heap->total_size += elem_size;
return 0;
}
/*
@ -244,17 +259,11 @@ int
rte_eal_malloc_heap_init(void)
{
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
unsigned ms_cnt;
struct rte_memseg *ms;
if (mcfg == NULL)
return -1;
for (ms = &mcfg->memseg[0], ms_cnt = 0;
(ms_cnt < RTE_MAX_MEMSEG) && (ms->len > 0);
ms_cnt++, ms++) {
malloc_heap_add_memseg(&mcfg->malloc_heaps[ms->socket_id], ms);
}
rte_memseg_walk(malloc_heap_add_memseg, NULL);
return 0;
}

View File

@ -638,23 +638,23 @@ out:
return ret;
}
static int
check_mem(const struct rte_memseg *ms, void *arg)
{
int *socket = arg;
return ms->socket_id == *socket;
}
static void
eal_check_mem_on_local_socket(void)
{
const struct rte_memseg *ms;
int i, socket_id;
int socket_id;
socket_id = rte_lcore_to_socket_id(rte_config.master_lcore);
ms = rte_eal_get_physmem_layout();
for (i = 0; i < RTE_MAX_MEMSEG; i++)
if (ms[i].socket_id == socket_id &&
ms[i].len > 0)
return;
RTE_LOG(WARNING, EAL, "WARNING: Master core has no "
"memory on local socket!\n");
if (rte_memseg_walk(check_mem, &socket_id) == 0)
RTE_LOG(WARNING, EAL, "WARNING: Master core has no memory on local socket!\n");
}
static int