diff options
author | Matias Elo <matias.elo@nokia.com> | 2022-12-05 14:42:05 +0200 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2022-12-13 15:27:09 +0200 |
commit | d62cba76af69e8f281b3f7014fc3cbff51506ff7 (patch) | |
tree | d7049450681f6c58f3ea734d3b405c54cb668ba8 /platform | |
parent | d47a70fbe591df6468f252f008d759566d03842e (diff) |
linux-dpdk: shm: implement odp_system_meminfo()
Implemented the new odp_system_meminfo() call inside SHM module to be able
to access details of all memory reservations.
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Reviewed-by: Tuomas Taipale <tuomas.taipale@nokia.com>
Diffstat (limited to 'platform')
-rw-r--r-- | platform/linux-dpdk/odp_shared_memory.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/platform/linux-dpdk/odp_shared_memory.c b/platform/linux-dpdk/odp_shared_memory.c index 55bfba628..470b78eb5 100644 --- a/platform/linux-dpdk/odp_shared_memory.c +++ b/platform/linux-dpdk/odp_shared_memory.c @@ -130,6 +130,15 @@ static shm_zone_t *shm_zone(const struct rte_memzone *mz) return (shm_zone_t *)(uintptr_t)((uint8_t *)mz->addr + mz->len - sizeof(shm_zone_t)); } +static shm_block_t *mz_to_shm_block(const struct rte_memzone *mz) +{ + for (int i = 0; i < SHM_MAX_NB_BLOCKS; i++) { + if (shm_tbl->block[i].mz == mz) + return &shm_tbl->block[i]; + } + return NULL; +} + static int find_free_block(void) { int idx; @@ -465,6 +474,72 @@ int odp_shm_segment_info(odp_shm_t shm, uint32_t index, uint32_t num, return 0; } +typedef struct { + odp_system_meminfo_t *info; + odp_system_memblock_t *memblock; + int32_t blocks; + int32_t max_num; + +} memzone_walker_data_t; + +static void walk_memzone(const struct rte_memzone *mz, void *arg) +{ + memzone_walker_data_t *data = arg; + shm_block_t *block = mz_to_shm_block(mz); + odp_system_memblock_t *memblock; + int32_t cur = data->blocks; + const char *name; + int name_len; + + data->info->total_mapped += mz->len; + data->blocks++; + + if (block != NULL) { + name = block->name; + data->info->total_used += block->size; + data->info->total_overhead += mz->len - block->size; + } else { /* DPDK internal reservations */ + name = mz->name; + data->info->total_used += mz->len; + } + + if (cur >= data->max_num) + return; + memblock = &data->memblock[cur]; + + name_len = strlen(name); + if (name_len >= ODP_SYSTEM_MEMBLOCK_NAME_LEN) + name_len = ODP_SYSTEM_MEMBLOCK_NAME_LEN - 1; + + memcpy(memblock->name, name, name_len); + memblock->name[name_len] = 0; + + memblock->addr = (uintptr_t)mz->addr; + memblock->used = mz->len; + memblock->overhead = block != NULL ? mz->len - block->size : 0; + memblock->page_size = mz->hugepage_sz; +} + +int32_t odp_system_meminfo(odp_system_meminfo_t *info, odp_system_memblock_t memblock[], + int32_t max_num) +{ + memzone_walker_data_t walker_data; + + memset(info, 0, sizeof(odp_system_meminfo_t)); + memset(&walker_data, 0, sizeof(memzone_walker_data_t)); + walker_data.max_num = max_num; + walker_data.info = info; + walker_data.memblock = memblock; + + odp_spinlock_lock(&shm_tbl->lock); + + rte_memzone_walk(walk_memzone, (void *)&walker_data); + + odp_spinlock_unlock(&shm_tbl->lock); + + return walker_data.blocks; +} + void odp_shm_print_all(void) { shm_block_t *block; |