Ping? On Wednesday 24 May 2017 09:41 PM, Santosh Shukla wrote:
> Some NPU hardware like OCTEONTX follows push model to get > the packet from the pktio device. Where packet allocation > and freeing done by the HW. Since HW can operate only on > IOVA with help of SMMU/IOMMU, When packet receives from the > Ethernet device, It is the IOVA address(which is PA in existing scheme). > > Mapping IOVA as PA is expensive on those HW, where every > packet needs to be converted to VA from PA/IOVA. > > This patch proposes the scheme where the user can set IOVA > as VA by using an eal command line argument. That helps to > avoid costly lookup for VA in SW by leveraging the SMMU > translation feature. > > Signed-off-by: Santosh Shukla <santosh.shu...@caviumnetworks.com> > --- > lib/librte_eal/bsdapp/eal/eal_memory.c | 6 ++++++ > lib/librte_eal/bsdapp/eal/rte_eal_version.map | 7 +++++++ > lib/librte_eal/common/eal_common_options.c | 6 ++++++ > lib/librte_eal/common/eal_internal_cfg.h | 1 + > lib/librte_eal/common/eal_options.h | 2 ++ > lib/librte_eal/common/include/rte_memory.h | 3 +++ > lib/librte_eal/linuxapp/eal/eal_memory.c | 12 ++++++++++++ > lib/librte_eal/linuxapp/eal/rte_eal_version.map | 7 +++++++ > 8 files changed, 44 insertions(+) > > diff --git a/lib/librte_eal/bsdapp/eal/eal_memory.c > b/lib/librte_eal/bsdapp/eal/eal_memory.c > index 3614da8db..6c8c2c96e 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_memory.c > +++ b/lib/librte_eal/bsdapp/eal/eal_memory.c > @@ -47,6 +47,12 @@ > > #define EAL_PAGE_SIZE (sysconf(_SC_PAGESIZE)) > > +int __rte_unused > +rte_mem_is_iova_as_va(void) > +{ > + return internal_config.iova_va; > +} > + > /* > * Get physical address of any mapped virtual address in the current process. > */ > diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map > b/lib/librte_eal/bsdapp/eal/rte_eal_version.map > index 2e48a7366..6e020ca7f 100644 > --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map > +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map > @@ -193,3 +193,10 @@ DPDK_17.05 { > vfio_get_group_no; > > } DPDK_17.02; > + > +DPDK_17.08 { > + global: > + > + rte_mem_is_iova_as_va; > + > +} DPDK_17.05; > diff --git a/lib/librte_eal/common/eal_common_options.c > b/lib/librte_eal/common/eal_common_options.c > index f470195f3..164123ef0 100644 > --- a/lib/librte_eal/common/eal_common_options.c > +++ b/lib/librte_eal/common/eal_common_options.c > @@ -95,6 +95,7 @@ eal_long_options[] = { > {OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM }, > {OPT_VMWARE_TSC_MAP, 0, NULL, OPT_VMWARE_TSC_MAP_NUM }, > {OPT_XEN_DOM0, 0, NULL, OPT_XEN_DOM0_NUM }, > + {OPT_IOVA_AS_VA, 0, NULL, OPT_IOVA_AS_VA_NUM }, > {0, 0, NULL, 0 } > }; > > @@ -876,6 +877,10 @@ eal_parse_common_option(int opt, const char *optarg, > conf->no_pci = 1; > break; > > + case OPT_IOVA_AS_VA_NUM: > + conf->iova_va = 1; > + break; > + > case OPT_NO_HPET_NUM: > conf->no_hpet = 1; > break; > @@ -1083,5 +1088,6 @@ eal_common_usage(void) > " --"OPT_NO_PCI" Disable PCI\n" > " --"OPT_NO_HPET" Disable HPET\n" > " --"OPT_NO_SHCONF" No shared config (mmap'd files)\n" > + " --"OPT_IOVA_AS_VA" Use va addr as iova\n" > "\n", RTE_MAX_LCORE); > } > diff --git a/lib/librte_eal/common/eal_internal_cfg.h > b/lib/librte_eal/common/eal_internal_cfg.h > index 7b7e8c887..6293ed0aa 100644 > --- a/lib/librte_eal/common/eal_internal_cfg.h > +++ b/lib/librte_eal/common/eal_internal_cfg.h > @@ -84,6 +84,7 @@ struct internal_config { > const char *hugepage_dir; /**< specific hugetlbfs directory to > use */ > > unsigned num_hugepage_sizes; /**< how many sizes on this system */ > + volatile unsigned iova_va; /**< use va addr as iova */ > struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES]; > }; > extern struct internal_config internal_config; /**< Global EAL > configuration. */ > diff --git a/lib/librte_eal/common/eal_options.h > b/lib/librte_eal/common/eal_options.h > index a881c62e2..50f98edea 100644 > --- a/lib/librte_eal/common/eal_options.h > +++ b/lib/librte_eal/common/eal_options.h > @@ -83,6 +83,8 @@ enum { > OPT_VMWARE_TSC_MAP_NUM, > #define OPT_XEN_DOM0 "xen-dom0" > OPT_XEN_DOM0_NUM, > +#define OPT_IOVA_AS_VA "iova-va" > + OPT_IOVA_AS_VA_NUM, > OPT_LONG_MAX_NUM > }; > > diff --git a/lib/librte_eal/common/include/rte_memory.h > b/lib/librte_eal/common/include/rte_memory.h > index 4aa5d1f77..c6c57e138 100644 > --- a/lib/librte_eal/common/include/rte_memory.h > +++ b/lib/librte_eal/common/include/rte_memory.h > @@ -258,6 +258,9 @@ rte_mem_phy2mch(int32_t memseg_id __rte_unused, const > phys_addr_t phy_addr) > } > #endif > > +int > +rte_mem_is_iova_as_va(void); > + > #ifdef __cplusplus > } > #endif > diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c > b/lib/librte_eal/linuxapp/eal/eal_memory.c > index ebe068334..d7a373ba2 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_memory.c > +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c > @@ -109,6 +109,12 @@ int rte_xen_dom0_supported(void) > } > #endif > > +int > +rte_mem_is_iova_as_va(void) > +{ > + return internal_config.iova_va; > +} > + > /** > * @file > * Huge page mapping under linux > @@ -169,6 +175,9 @@ rte_mem_virt2phy(const void *virtaddr) > int page_size; > off_t offset; > > + if (rte_mem_is_iova_as_va()) > + return (uintptr_t)virtaddr; > + > /* when using dom0, /proc/self/pagemap always returns 0, check in > * dpdk memory by browsing the memsegs */ > if (rte_xen_dom0_supported()) { > @@ -480,6 +489,9 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl, > } > else { > hugepg_tbl[i].final_va = virtaddr; > + > + if (rte_mem_is_iova_as_va()) > + hugepg_tbl[i].physaddr = (uintptr_t)virtaddr; > } > > if (orig) { > diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map > b/lib/librte_eal/linuxapp/eal/rte_eal_version.map > index 670bab3a5..b0ba2233f 100644 > --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map > +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map > @@ -198,3 +198,10 @@ DPDK_17.05 { > vfio_get_group_no; > > } DPDK_17.02; > + > +DPDK_17.08 { > + global: > + > + rte_mem_is_iova_as_va; > + > +} DPDK_17.05;