From 723b2078aec8382b52d47bcb4bcc633b8e73aca9 Mon Sep 17 00:00:00 2001 From: Anuj Mittal Date: Thu, 8 Oct 2015 23:50:00 +0800 Subject: meta-isg: dpdk: fix v2.0.0 build with kernel 4.1 Backported fixes from upstream dpdk sources to ensure dpdk 2.0.0 compiles against kernel 4.1. Signed-off-by: Anuj Mittal Signed-off-by: Saul Wold --- ...fix-vhost-build-with-kernels-3.19-and-4.0.patch | 141 +++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 meta-isg/common/recipes-extended/dpdk/dpdk/dpdk-2.0.0-kni-fix-vhost-build-with-kernels-3.19-and-4.0.patch (limited to 'meta-isg/common/recipes-extended/dpdk/dpdk/dpdk-2.0.0-kni-fix-vhost-build-with-kernels-3.19-and-4.0.patch') diff --git a/meta-isg/common/recipes-extended/dpdk/dpdk/dpdk-2.0.0-kni-fix-vhost-build-with-kernels-3.19-and-4.0.patch b/meta-isg/common/recipes-extended/dpdk/dpdk/dpdk-2.0.0-kni-fix-vhost-build-with-kernels-3.19-and-4.0.patch new file mode 100644 index 00000000..a083fb1e --- /dev/null +++ b/meta-isg/common/recipes-extended/dpdk/dpdk/dpdk-2.0.0-kni-fix-vhost-build-with-kernels-3.19-and-4.0.patch @@ -0,0 +1,141 @@ +From d4903f024ede0e54cc5e025e2cb54309b1164d22 Mon Sep 17 00:00:00 2001 +From: Pablo de Lara +Date: Tue, 5 May 2015 15:08:00 +0100 +Subject: [PATCH 1/2] kni: fix vhost build with kernels 3.19 and 4.0 + +Upstream-Status: Backport [2.1.0] + +Due to commit c0371da6 in kernel 3.19, which removed msg_iov +and msg_iovlen from struct msghdr, DPDK would not build. +Also, functions memcpy_toiovecend and memcpy_fromiovecend +were removed in commits ba7438ae and 57dd8a07, being substituted by +copy_from_iter and copy_to_iter. + +This patch makes use of struct iov_iter, which has references +to msg_iov and msg_iovln, and makes use of copy_from_iter +and copy_to_iter. + +Reported-by: Thomas Monjalon +Signed-off-by: Pablo de Lara +(cherry picked from commit 45e63ba8db314f75b8c969f3f952dee87f209129) +Signed-off-by: Rahul Kumar Gupta +--- + lib/librte_eal/linuxapp/kni/compat.h | 4 ++++ + lib/librte_eal/linuxapp/kni/kni_vhost.c | 37 ++++++++++++++++++++++++++------- + 2 files changed, 33 insertions(+), 8 deletions(-) + +diff --git a/lib/librte_eal/linuxapp/kni/compat.h b/lib/librte_eal/linuxapp/kni/compat.h +index 1313523..1ad22ba 100644 +--- a/lib/librte_eal/linuxapp/kni/compat.h ++++ b/lib/librte_eal/linuxapp/kni/compat.h +@@ -19,3 +19,7 @@ + #define sk_sleep(s) (s)->sk_sleep + + #endif /* < 2.6.35 */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0) ++#define HAVE_IOV_ITER_MSGHDR ++#endif +diff --git a/lib/librte_eal/linuxapp/kni/kni_vhost.c b/lib/librte_eal/linuxapp/kni/kni_vhost.c +index 7141f83..83d3351 100644 +--- a/lib/librte_eal/linuxapp/kni/kni_vhost.c ++++ b/lib/librte_eal/linuxapp/kni/kni_vhost.c +@@ -76,7 +76,7 @@ static struct proto kni_raw_proto = { + }; + + static inline int +-kni_vhost_net_tx(struct kni_dev *kni, struct iovec *iov, ++kni_vhost_net_tx(struct kni_dev *kni, struct msghdr *m, + unsigned offset, unsigned len) + { + struct rte_kni_mbuf *pkt_kva = NULL; +@@ -84,7 +84,11 @@ kni_vhost_net_tx(struct kni_dev *kni, struct iovec *iov, + int ret; + + KNI_DBG_TX("tx offset=%d, len=%d, iovlen=%d\n", +- offset, len, (int)iov->iov_len); ++#ifdef HAVE_IOV_ITER_MSGHDR ++ offset, len, (int)m->msg_iter.iov->iov_len); ++#else ++ offset, len, (int)m->msg_iov->iov_len); ++#endif + + /** + * Check if it has at least one free entry in tx_q and +@@ -108,7 +112,12 @@ kni_vhost_net_tx(struct kni_dev *kni, struct iovec *iov, + data_kva = pkt_kva->buf_addr + pkt_kva->data_off + - kni->mbuf_va + kni->mbuf_kva; + +- memcpy_fromiovecend(data_kva, iov, offset, len); ++#ifdef HAVE_IOV_ITER_MSGHDR ++ copy_from_iter(data_kva, len, &m->msg_iter); ++#else ++ memcpy_fromiovecend(data_kva, m->msg_iov, offset, len); ++#endif ++ + if (unlikely(len < ETH_ZLEN)) { + memset(data_kva + len, 0, ETH_ZLEN - len); + len = ETH_ZLEN; +@@ -143,7 +152,7 @@ drop: + } + + static inline int +-kni_vhost_net_rx(struct kni_dev *kni, struct iovec *iov, ++kni_vhost_net_rx(struct kni_dev *kni, struct msghdr *m, + unsigned offset, unsigned len) + { + uint32_t pkt_len; +@@ -177,10 +186,18 @@ kni_vhost_net_rx(struct kni_dev *kni, struct iovec *iov, + goto drop; + + KNI_DBG_RX("rx offset=%d, len=%d, pkt_len=%d, iovlen=%d\n", +- offset, len, pkt_len, (int)iov->iov_len); ++#ifdef HAVE_IOV_ITER_MSGHDR ++ offset, len, pkt_len, (int)m->msg_iter.iov->iov_len); ++#else ++ offset, len, pkt_len, (int)m->msg_iov->iov_len); ++#endif + + data_kva = kva->buf_addr + kva->data_off - kni->mbuf_va + kni->mbuf_kva; +- if (unlikely(memcpy_toiovecend(iov, data_kva, offset, pkt_len))) ++#ifdef HAVE_IOV_ITER_MSGHDR ++ if (unlikely(copy_to_iter(data_kva, pkt_len, &m->msg_iter))) ++#else ++ if (unlikely(memcpy_toiovecend(m->msg_iov, data_kva, offset, pkt_len))) ++#endif + goto drop; + + /* Update statistics */ +@@ -348,7 +365,11 @@ kni_sock_sndmsg(struct kiocb *iocb, struct socket *sock, + return 0; + + KNI_DBG_TX("kni_sndmsg len %ld, flags 0x%08x, nb_iov %d\n", ++#ifdef HAVE_IOV_ITER_MSGHDR ++ len, q->flags, (int)m->msg_iter.iov->iov_len); ++#else + len, q->flags, (int)m->msg_iovlen); ++#endif + + #ifdef RTE_KNI_VHOST_VNET_HDR_EN + if (likely(q->flags & IFF_VNET_HDR)) { +@@ -362,7 +383,7 @@ kni_sock_sndmsg(struct kiocb *iocb, struct socket *sock, + if (unlikely(len < ETH_HLEN + q->vnet_hdr_sz)) + return -EINVAL; + +- return kni_vhost_net_tx(q->kni, m->msg_iov, vnet_hdr_len, len); ++ return kni_vhost_net_tx(q->kni, m, vnet_hdr_len, len); + } + + static int +@@ -391,7 +412,7 @@ kni_sock_rcvmsg(struct kiocb *iocb, struct socket *sock, + #endif + + if (unlikely(0 == (pkt_len = kni_vhost_net_rx(q->kni, +- m->msg_iov, vnet_hdr_len, len)))) ++ m, vnet_hdr_len, len)))) + return 0; + + #ifdef RTE_KNI_VHOST_VNET_HDR_EN +-- +1.9.1 + -- cgit v1.2.3-54-g00ecf