aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2022-12-05 14:42:05 +0200
committerMatias Elo <matias.elo@nokia.com>2022-12-13 15:27:09 +0200
commitd62cba76af69e8f281b3f7014fc3cbff51506ff7 (patch)
treed7049450681f6c58f3ea734d3b405c54cb668ba8
parentd47a70fbe591df6468f252f008d759566d03842e (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>
-rw-r--r--platform/linux-dpdk/odp_shared_memory.c75
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;