From de480bbf138bf61b14dafb806f6e66808871f3e3 Mon Sep 17 00:00:00 2001 From: Ferruh Yigit Date: Thu, 28 Nov 2019 12:15:26 +0000 Subject: [PATCH] kni: fix build with Linux 4.9.x The 'get_user_pages_remote()' API is updated in kernel 4.10.0 [1], but the check added as > 4.9.0, this logic is broken for kernels 4.9.x, because they justify > 4.9.0 check but have the old API. Fixing the check as >= 4.10.0 [1] commit 5b56d49fc31d ("mm: add locked parameter to get_user_pages_remote()") Fixes: d965af9e8ae1 ("kni: increase kernel version requirement for VA") Reported-by: Andrew Rybchenko Suggested-by: David Marchand Signed-off-by: Ferruh Yigit Tested-by: Andrew Rybchenko Reviewed-by: David Marchand --- doc/guides/prog_guide/kernel_nic_interface.rst | 2 +- doc/guides/rel_notes/release_19_11.rst | 2 +- kernel/linux/kni/compat.h | 4 ++-- lib/librte_eal/linux/eal/eal.c | 6 +++--- lib/librte_kni/rte_kni.c | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/guides/prog_guide/kernel_nic_interface.rst b/doc/guides/prog_guide/kernel_nic_interface.rst index 77856086df..32d09ccf82 100644 --- a/doc/guides/prog_guide/kernel_nic_interface.rst +++ b/doc/guides/prog_guide/kernel_nic_interface.rst @@ -305,7 +305,7 @@ IOVA = VA: Support KNI operates in IOVA_VA scheme when -- LINUX_VERSION_CODE > KERNEL_VERSION(4, 9, 0) and +- LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) and - EAL option `iova-mode=va` is passed or bus IOVA scheme in the DPDK is selected as RTE_IOVA_VA. diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst index 89f81f00bb..0f07f54694 100644 --- a/doc/guides/rel_notes/release_19_11.rst +++ b/doc/guides/rel_notes/release_19_11.rst @@ -335,7 +335,7 @@ New Features * Added IOVA = VA support for KNI. KNI can operate in IOVA = VA mode when ``iova-mode=va`` EAL option is passed to the application or when bus IOVA scheme is selected as RTE_IOVA_VA. This mode only works on Linux Kernel - versions >= 4.9.0. + versions 4.10.0 and above. * Due to IOVA to KVA address translations, based on the KNI use case there can be a performance impact. For mitigation, forcing IOVA to PA via EAL diff --git a/kernel/linux/kni/compat.h b/kernel/linux/kni/compat.h index 83ecac2d8c..7109474ec5 100644 --- a/kernel/linux/kni/compat.h +++ b/kernel/linux/kni/compat.h @@ -124,9 +124,9 @@ /* * iova to kva mapping support can be provided since 4.6.0, but required - * kernel version increased to > 4.9.0 because of the updates in + * kernel version increased to >= 4.10.0 because of the updates in * get_user_pages_remote() kernel API */ -#if KERNEL_VERSION(4, 9, 0) < LINUX_VERSION_CODE +#if KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE #define HAVE_IOVA_TO_KVA_MAPPING_SUPPORT #endif diff --git a/lib/librte_eal/linux/eal/eal.c b/lib/librte_eal/linux/eal/eal.c index 5879e33e56..c4233ec3c8 100644 --- a/lib/librte_eal/linux/eal/eal.c +++ b/lib/librte_eal/linux/eal/eal.c @@ -1073,7 +1073,7 @@ rte_eal_init(int argc, char **argv) */ iova_mode = RTE_IOVA_VA; RTE_LOG(DEBUG, EAL, "Physical addresses are unavailable, selecting IOVA as VA mode.\n"); -#if defined(RTE_LIBRTE_KNI) && LINUX_VERSION_CODE > KERNEL_VERSION(4, 9, 0) +#if defined(RTE_LIBRTE_KNI) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) } else if (rte_eal_check_module("rte_kni") == 1) { iova_mode = RTE_IOVA_PA; RTE_LOG(DEBUG, EAL, "KNI is loaded, selecting IOVA as PA mode for better KNI perfomance.\n"); @@ -1090,9 +1090,9 @@ rte_eal_init(int argc, char **argv) RTE_LOG(DEBUG, EAL, "IOMMU is not available, selecting IOVA as PA mode.\n"); } } -#if defined(RTE_LIBRTE_KNI) && LINUX_VERSION_CODE <= KERNEL_VERSION(4, 9, 0) +#if defined(RTE_LIBRTE_KNI) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0) /* Workaround for KNI which requires physical address to work - * in kernels <= 4.9 + * in kernels < 4.10 */ if (iova_mode == RTE_IOVA_VA && rte_eal_check_module("rte_kni") == 1) { diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index b564482fe4..e388751e33 100644 --- a/lib/librte_kni/rte_kni.c +++ b/lib/librte_kni/rte_kni.c @@ -98,7 +98,7 @@ static volatile int kni_fd = -1; int rte_kni_init(unsigned int max_kni_ifaces __rte_unused) { -#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 9, 0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0) if (rte_eal_iova_mode() != RTE_IOVA_PA) { RTE_LOG(ERR, KNI, "KNI requires IOVA as PA\n"); return -1; -- 2.20.1