From f901e64d2102a515f06fd1bbe1a0543f6c073e0c Mon Sep 17 00:00:00 2001 From: Anatoly Burakov Date: Wed, 11 Apr 2018 13:30:15 +0100 Subject: [PATCH] mem: add virt2memseg function This can be used as a virt2iova function that only looks up memory that is owned by DPDK (as opposed to doing pagemap walks). Using this will result in less dependency on internals of mem API. Signed-off-by: Anatoly Burakov Tested-by: Santosh Shukla Tested-by: Hemant Agrawal Tested-by: Gowrishankar Muthukrishnan --- lib/librte_eal/common/eal_common_memory.c | 37 ++++++++++++++++++++++ lib/librte_eal/common/include/rte_memory.h | 11 +++++++ lib/librte_eal/rte_eal_version.map | 1 + 3 files changed, 49 insertions(+) diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index ea3c5a724e..fd78d2f453 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -161,6 +161,43 @@ rte_mem_iova2virt(rte_iova_t iova) return vi.virt; } +struct virtms { + const void *virt; + struct rte_memseg *ms; +}; +static int +find_memseg(const struct rte_memseg *ms, void *arg) +{ + struct virtms *vm = arg; + + if (arg >= ms->addr && arg < RTE_PTR_ADD(ms->addr, ms->len)) { + struct rte_memseg *memseg, *found_ms; + int idx; + + memseg = rte_eal_get_configuration()->mem_config->memseg; + idx = ms - memseg; + found_ms = &memseg[idx]; + + vm->ms = found_ms; + return 1; + } + return 0; +} + +__rte_experimental struct rte_memseg * +rte_mem_virt2memseg(const void *addr) +{ + struct virtms vm; + + memset(&vm, 0, sizeof(vm)); + + vm.virt = addr; + + rte_memseg_walk(find_memseg, &vm); + + return vm.ms; +} + static int physmem_size(const struct rte_memseg *ms, void *arg) { diff --git a/lib/librte_eal/common/include/rte_memory.h b/lib/librte_eal/common/include/rte_memory.h index 5c60b91a56..b3d7e61802 100644 --- a/lib/librte_eal/common/include/rte_memory.h +++ b/lib/librte_eal/common/include/rte_memory.h @@ -142,6 +142,17 @@ rte_iova_t rte_mem_virt2iova(const void *virt); __rte_experimental void * rte_mem_iova2virt(rte_iova_t iova); +/** + * Get memseg to which a particular virtual address belongs. + * + * @param virt + * The virtual address. + * @return + * Memseg pointer on success, or NULL on error. + */ +__rte_experimental struct rte_memseg * +rte_mem_virt2memseg(const void *virt); + /** * Memseg walk function prototype. * diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index dccfc35940..79433b7284 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -224,6 +224,7 @@ EXPERIMENTAL { rte_log_register_type_and_pick_level; rte_malloc_dump_heaps; rte_mem_iova2virt; + rte_mem_virt2memseg; rte_memseg_contig_walk; rte_memseg_walk; rte_mp_action_register; -- 2.20.1