KNI operates in IOVA_VA scheme when
-- LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0) and
+- LINUX_VERSION_CODE > KERNEL_VERSION(4, 9, 0) and
- EAL option `iova-mode=va` is passed or bus IOVA scheme in the DPDK is selected
as RTE_IOVA_VA.
* 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.6.0 and above.
+ versions above 4.9.0.
* 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
#define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
#endif
-#if KERNEL_VERSION(4, 6, 0) <= LINUX_VERSION_CODE
-
+/*
+ * 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
+ * get_user_pages_remote() kernel API
+ */
+#if KERNEL_VERSION(4, 9, 0) < LINUX_VERSION_CODE
#define HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-
-#if KERNEL_VERSION(4, 9, 0) > LINUX_VERSION_CODE
-#define GET_USER_PAGES_REMOTE_API_V1
-#elif KERNEL_VERSION(4, 9, 0) == LINUX_VERSION_CODE
-#define GET_USER_PAGES_REMOTE_API_V2
-#else
-#define GET_USER_PAGES_REMOTE_API_V3
-#endif
-
#endif
offset = iova & (PAGE_SIZE - 1);
/* Read one page struct info */
-#ifdef GET_USER_PAGES_REMOTE_API_V3
ret = get_user_pages_remote(tsk, tsk->mm, iova, 1,
FOLL_TOUCH, &page, NULL, NULL);
-#endif
-#ifdef GET_USER_PAGES_REMOTE_API_V2
- ret = get_user_pages_remote(tsk, tsk->mm, iova, 1,
- FOLL_TOUCH, &page, NULL);
-#endif
-#ifdef GET_USER_PAGES_REMOTE_API_V1
- ret = get_user_pages_remote(tsk, tsk->mm, iova, 1
- 0, 0, &page, NULL);
-#endif
if (ret < 0)
return 0;
*/
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, 6, 0)
+#if defined(RTE_LIBRTE_KNI) && LINUX_VERSION_CODE > KERNEL_VERSION(4, 9, 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");
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, 6, 0)
+#if defined(RTE_LIBRTE_KNI) && LINUX_VERSION_CODE <= KERNEL_VERSION(4, 9, 0)
/* Workaround for KNI which requires physical address to work
- * in kernels < 4.6
+ * in kernels <= 4.9
*/
if (iova_mode == RTE_IOVA_VA &&
rte_eal_check_module("rte_kni") == 1) {
int
rte_kni_init(unsigned int max_kni_ifaces __rte_unused)
{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 9, 0)
if (rte_eal_iova_mode() != RTE_IOVA_PA) {
RTE_LOG(ERR, KNI, "KNI requires IOVA as PA\n");
return -1;