From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id B72011B348 for ; Thu, 2 Nov 2017 10:04:50 +0100 (CET) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 02 Nov 2017 02:04:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.44,333,1505804400"; d="scan'208";a="916618453" Received: from fyigit-mobl1.ger.corp.intel.com (HELO [10.254.27.219]) ([10.254.27.219]) by FMSMGA003.fm.intel.com with ESMTP; 02 Nov 2017 02:04:48 -0700 To: santosh , Thomas Monjalon , Sergio Gonzalez Monroy Cc: dev@dpdk.org, Jianfeng Tan , Jerin Jacob References: <20171102000600.85309-1-ferruh.yigit@intel.com> <3a029ac2-2b6b-b0c2-a577-967b6feba0c9@caviumnetworks.com> From: Ferruh Yigit Message-ID: <14551030-beec-0064-7665-5eb642b8f6eb@intel.com> Date: Thu, 2 Nov 2017 02:04:48 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: <3a029ac2-2b6b-b0c2-a577-967b6feba0c9@caviumnetworks.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Subject: Re: [dpdk-dev] [PATCH] eal: force IOVA PA mode if KNI module inserted X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Nov 2017 09:04:51 -0000 On 11/1/2017 8:58 PM, santosh wrote: > 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 >> --- >> Cc: Jianfeng Tan >> Cc: Jerin Jacob >> Cc: Santosh Shukla >> Cc: Thomas Monjalon >> >> 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: I was thinking same at first, but later was not sure about add this check into bus related file, kni module check is so unrelated with pci.c . Also this is not part of a regular process of detecting iova mode, which putting into rte_pci_get_iommu_class() will look like it is. Instead this is a workaround and we are overwriting the result of regular method for this special case, so I think putting this into linux eal.c level after detection is good for stressing the workaround. So lets not spoil the logic in rte_pci_get_iommu_class() with kni module checks. > > 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. >