Hi Ferruh,
On Thursday 02 November 2017 05:36 AM, Ferruh Yigit wrote: > Fix kernel crash with KNI because KNI requires physical addresses. > > When IOVA VA mode used, memzones and mbufs physical address fields > contain virtual addresses. But KNI relies on these fields to enable > kernel access for buffers. Those fields having virtual address cause > crash in kernel. > > This is a workaround until KNI fixed properly to work with virtual > addresses. > > Fixes: 72d013644bd6 ("mem: honor IOVA mode in malloc virt2phy") > > Signed-off-by: Ferruh Yigit <ferruh.yi...@intel.com> > --- > Cc: Jianfeng Tan <jianfeng....@intel.com> > Cc: Jerin Jacob <jerin.ja...@caviumnetworks.com> > Cc: Santosh Shukla <santosh.shu...@caviumnetworks.com> > Cc: Thomas Monjalon <tho...@monjalon.net> > > This patch superseded following one: > http://dpdk.org/dev/patchwork/patch/31071/ > --- > lib/librte_eal/linuxapp/eal/eal.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/lib/librte_eal/linuxapp/eal/eal.c > b/lib/librte_eal/linuxapp/eal/eal.c > index 017c402ed..29912a4e5 100644 > --- a/lib/librte_eal/linuxapp/eal/eal.c > +++ b/lib/librte_eal/linuxapp/eal/eal.c > @@ -808,6 +808,15 @@ rte_eal_init(int argc, char **argv) > /* autodetect the iova mapping mode (default is iova_pa) */ > rte_eal_get_configuration()->iova_mode = rte_bus_get_iommu_class(); > > + /* Workaround for KNI which requires physical address to work */ > + if (rte_eal_get_configuration()->iova_mode == RTE_IOVA_VA && > + rte_eal_check_module("rte_kni") == 1) { > + rte_eal_get_configuration()->iova_mode = RTE_IOVA_PA; > + RTE_LOG(WARNING, EAL, > + "Some devices want iova as va but pa will be used > because.. " > + "KNI module inserted\n"); > + } > + > if (internal_config.no_hugetlbfs == 0 && > internal_config.process_type != RTE_PROC_SECONDARY && > eal_hugepage_info_init() < 0) { Rather checking for KNI module at linuxapp/eal, I was suggesting to move KNI detection code in bus layer like below: diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c index cdf8106..971586c 100644 --- a/drivers/bus/pci/linux/pci.c +++ b/drivers/bus/pci/linux/pci.c @@ -586,11 +586,13 @@ rte_pci_get_iommu_class(void) bool is_vfio_noiommu_enabled = true; bool has_iova_va; bool is_bound_uio; + bool has_kni; is_bound = pci_one_device_is_bound(); if (!is_bound) return RTE_IOVA_DC; + has_kni = rte_eal_check_module("rte_kni"); has_iova_va = pci_one_device_has_iova_va(); is_bound_uio = pci_one_device_bound_uio(); #ifdef VFIO_PRESENT @@ -598,7 +600,7 @@ rte_pci_get_iommu_class(void) true : false; #endif - if (has_iova_va && !is_bound_uio && !is_vfio_noiommu_enabled) + if (has_iova_va && !is_bound_uio && !has_kni && !is_vfio_noiommu_enabled) return RTE_IOVA_VA; if (has_iova_va) { @@ -607,6 +609,9 @@ rte_pci_get_iommu_class(void) RTE_LOG(WARNING, EAL, "vfio-noiommu mode configured\n"); if (is_bound_uio) RTE_LOG(WARNING, EAL, "few device bound to UIO\n"); + if (has_kni) + RTE_LOG(WARNING, EAL, "Some devices want iova as va but pa will be used because.." + "KNI module inserted\n"); } return RTE_IOVA_PA; It builds but I haven;t tested, can you please give it a try. Thanks.