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:
parent
8594a2026b
commit
221b67bca0
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user