[dpdk-dev,v4,40/70] eal: add virt2memseg function
Checks
Commit Message
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 <anatoly.burakov@intel.com>
---
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(+)
@@ -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)
{
@@ -143,6 +143,17 @@ __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.
*
* Returning 0 will continue walk
@@ -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;