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 <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>
This commit is contained in:
Ferruh Yigit 2019-11-28 12:15:26 +00:00 committed by David Marchand
parent 564f295d19
commit de480bbf13
5 changed files with 8 additions and 8 deletions

View 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.

View 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

View File

@ -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

View 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) {

View 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;