kni: fix build with Linux 4.9.x
authorFerruh Yigit <ferruh.yigit@intel.com>
Thu, 28 Nov 2019 12:15:26 +0000 (12:15 +0000)
committerDavid Marchand <david.marchand@redhat.com>
Thu, 28 Nov 2019 13:48:24 +0000 (14:48 +0100)
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 <arybchenko@solarflare.com>
Suggested-by: David Marchand <david.marchand@redhat.com>
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Tested-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: David Marchand <david.marchand@redhat.com>
doc/guides/prog_guide/kernel_nic_interface.rst
doc/guides/rel_notes/release_19_11.rst
kernel/linux/kni/compat.h
lib/librte_eal/linux/eal/eal.c
lib/librte_kni/rte_kni.c

index 7785608..32d09cc 100644 (file)
@@ -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.
 
index 89f81f0..0f07f54 100644 (file)
@@ -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
index 83ecac2..7109474 100644 (file)
 
 /*
  * 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
index 5879e33..c4233ec 100644 (file)
@@ -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) {
index b564482..e388751 100644 (file)
@@ -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;