[dpdk-dev,v4,36/70] eal: add iova2virt function
Checks
Commit Message
This is reverse lookup of PA to VA. Using this will make
other code less dependent on internals of mem API.
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
lib/librte_eal/common/eal_common_memory.c | 30 ++++++++++++++++++++++++++++++
lib/librte_eal/common/include/rte_memory.h | 12 ++++++++++++
lib/librte_eal/rte_eal_version.map | 1 +
3 files changed, 43 insertions(+)
@@ -131,6 +131,36 @@ rte_eal_get_physmem_layout(void)
return rte_eal_get_configuration()->mem_config->memseg;
}
+struct virtiova {
+ rte_iova_t iova;
+ void *virt;
+};
+static int
+find_virt(const struct rte_memseg *ms, void *arg)
+{
+ struct virtiova *vi = arg;
+ if (vi->iova >= ms->iova && vi->iova < (ms->iova + ms->len)) {
+ size_t offset = vi->iova - ms->iova;
+ vi->virt = RTE_PTR_ADD(ms->addr, offset);
+ /* stop the walk */
+ return 1;
+ }
+ return 0;
+}
+
+__rte_experimental void *
+rte_mem_iova2virt(rte_iova_t iova)
+{
+ struct virtiova vi;
+
+ memset(&vi, 0, sizeof(vi));
+
+ vi.iova = iova;
+ rte_memseg_walk(find_virt, &vi);
+
+ return vi.virt;
+}
+
static int
physmem_size(const struct rte_memseg *ms, void *arg)
{
@@ -131,6 +131,18 @@ phys_addr_t rte_mem_virt2phy(const void *virt);
rte_iova_t rte_mem_virt2iova(const void *virt);
/**
+ * Get virtual memory address corresponding to iova address.
+ *
+ * @param iova
+ * The iova address.
+ * @return
+ * Virtual address corresponding to iova address (or NULL if address does not
+ * exist within DPDK memory map).
+ */
+__rte_experimental void *
+rte_mem_iova2virt(rte_iova_t iova);
+
+/**
* Memseg walk function prototype.
*
* Returning 0 will continue walk
@@ -223,6 +223,7 @@ EXPERIMENTAL {
rte_eal_mbuf_user_pool_ops;
rte_log_register_type_and_pick_level;
rte_malloc_dump_heaps;
+ rte_mem_iova2virt;
rte_memseg_contig_walk;
rte_memseg_walk;
rte_mp_action_register;