X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Flinuxapp%2Fkni%2Fkni_vhost.c;h=6f2a9612aa09efc12ef6d1c680940316e1fe5ff6;hb=693f715da45c48ec1ec0fe4ba2f3b5ffd11ba53e;hp=c05c8680ca3af98eef46fe1f42f714353584f3af;hpb=ee19d51ae56dcb685d9a04d9e859873d35565232;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/kni/kni_vhost.c b/lib/librte_eal/linuxapp/kni/kni_vhost.c index c05c8680ca..6f2a9612aa 100644 --- a/lib/librte_eal/linuxapp/kni/kni_vhost.c +++ b/lib/librte_eal/linuxapp/kni/kni_vhost.c @@ -33,6 +33,7 @@ #include #include +#include "compat.h" #include "kni_dev.h" #include "kni_fifo.h" @@ -75,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; @@ -83,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 @@ -107,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; @@ -142,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; @@ -176,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 */ @@ -215,10 +233,19 @@ kni_sock_poll(struct file *file, struct socket *sock, poll_table * wait) return POLLERR; kni = q->kni; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) KNI_DBG("start kni_poll on group %d, wq 0x%16llx\n", kni->group_id, (uint64_t)sock->wq); +#else + KNI_DBG("start kni_poll on group %d, wait at 0x%16llx\n", + kni->group_id, (uint64_t)&sock->wait); +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) poll_wait(file, &sock->wq->wait, wait); +#else + poll_wait(file, &sock->wait, wait); +#endif if (kni_fifo_count(kni->rx_q) > 0) mask |= POLLIN | POLLRDNORM; @@ -326,10 +353,15 @@ except: } static int +#ifdef HAVE_KIOCB_MSG_PARAM kni_sock_sndmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t total_len) +#else +kni_sock_sndmsg(struct socket *sock, + struct msghdr *m, size_t total_len) +#endif /* HAVE_KIOCB_MSG_PARAM */ { - struct kni_vhost_queue *q = + struct kni_vhost_queue *q = container_of(sock->sk, struct kni_vhost_queue, sk); int vnet_hdr_len = 0; unsigned long len = total_len; @@ -338,7 +370,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)) { @@ -352,12 +388,17 @@ 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 +#ifdef HAVE_KIOCB_MSG_PARAM kni_sock_rcvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t len, int flags) +#else +kni_sock_rcvmsg(struct socket *sock, + struct msghdr *m, size_t len, int flags) +#endif /* HAVE_KIOCB_MSG_PARAM */ { int vnet_hdr_len = 0; int pkt_len = 0; @@ -381,19 +422,24 @@ 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 /* no need to copy hdr when no pkt received */ +#ifdef HAVE_IOV_ITER_MSGHDR + if (unlikely(copy_to_iter((void *)&vnet_hdr, vnet_hdr_len, + &m->msg_iter))) +#else if (unlikely(memcpy_toiovecend(m->msg_iov, (void *)&vnet_hdr, 0, vnet_hdr_len))) +#endif /* HAVE_IOV_ITER_MSGHDR */ return -EFAULT; -#endif +#endif /* RTE_KNI_VHOST_VNET_HDR_EN */ KNI_DBG_RX("kni_rcvmsg expect_len %ld, flags 0x%08x, pkt_len %d\n", (unsigned long)len, q->flags, pkt_len); - return (pkt_len + vnet_hdr_len); + return pkt_len + vnet_hdr_len; } /* dummy tap like ioctl */ @@ -635,14 +681,12 @@ kni_vhost_backend_init(struct kni_dev *kni) } /* cache init */ - q->cache = (struct sk_buff*) - kzalloc(RTE_KNI_VHOST_MAX_CACHE_SIZE * sizeof(struct sk_buff), - GFP_KERNEL); + q->cache = kzalloc(RTE_KNI_VHOST_MAX_CACHE_SIZE * sizeof(struct sk_buff), + GFP_KERNEL); if (!q->cache) goto free_fd; - fifo = (struct rte_kni_fifo*) - kzalloc(RTE_KNI_VHOST_MAX_CACHE_SIZE * sizeof(void *) + fifo = kzalloc(RTE_KNI_VHOST_MAX_CACHE_SIZE * sizeof(void *) + sizeof(struct rte_kni_fifo), GFP_KERNEL); if (!fifo) goto free_cache; @@ -681,10 +725,17 @@ kni_vhost_backend_init(struct kni_dev *kni) kni->vq_status = BE_START; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) KNI_DBG("backend init sockfd=%d, sock->wq=0x%16llx," "sk->sk_wq=0x%16llx", q->sockfd, (uint64_t)q->sock->wq, (uint64_t)q->sk.sk_wq); +#else + KNI_DBG("backend init sockfd=%d, sock->wait at 0x%16llx," + "sk->sk_sleep=0x%16llx", + q->sockfd, (uint64_t)&q->sock->wait, + (uint64_t)q->sk.sk_sleep); +#endif return 0; @@ -791,4 +842,3 @@ kni_vhost_init(struct kni_dev *kni) return 0; } -