* [dpdk-dev] [PATCH 1/8] driver/virtio:add virtual addr for virtio net header
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
@ 2015-10-21 4:46 ` Jijiang Liu
2015-10-26 7:07 ` Tan, Jianfeng
2015-10-21 4:46 ` [dpdk-dev] [PATCH 2/8] driver/virtio: record virtual address of " Jijiang Liu
` (7 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Jijiang Liu @ 2015-10-21 4:46 UTC (permalink / raw)
To: dev
The virtual addr for virtio net header need to be recorded.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
---
drivers/net/virtio/virtqueue.h | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 7789411..530f840 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -189,6 +189,7 @@ struct virtqueue {
uint16_t vq_used_cons_idx;
uint16_t vq_avail_idx;
phys_addr_t virtio_net_hdr_mem; /**< hdr for each xmit packet */
+ uint64_t virtio_net_hdr_addr; /**< virtual addr for virtio net header */
/* Statistics */
uint64_t packets;
--
1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 1/8] driver/virtio:add virtual addr for virtio net header
2015-10-21 4:46 ` [dpdk-dev] [PATCH 1/8] driver/virtio:add virtual addr for virtio net header Jijiang Liu
@ 2015-10-26 7:07 ` Tan, Jianfeng
0 siblings, 0 replies; 17+ messages in thread
From: Tan, Jianfeng @ 2015-10-26 7:07 UTC (permalink / raw)
To: Liu, Jijiang, dev
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jijiang Liu
> Sent: Wednesday, October 21, 2015 12:47 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH 1/8] driver/virtio:add virtual addr for virtio net
> header
>
> The virtual addr for virtio net header need to be recorded.
>
> Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
> ---
> drivers/net/virtio/virtqueue.h | 1 +
> 1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
> index 7789411..530f840 100644
> --- a/drivers/net/virtio/virtqueue.h
> +++ b/drivers/net/virtio/virtqueue.h
> @@ -189,6 +189,7 @@ struct virtqueue {
> uint16_t vq_used_cons_idx;
> uint16_t vq_avail_idx;
> phys_addr_t virtio_net_hdr_mem; /**< hdr for each xmit packet */
> + uint64_t virtio_net_hdr_addr; /**< virtual addr for virtio net header
> +*/
>
> /* Statistics */
> uint64_t packets;
> --
> 1.7.7.6
Acked-by: Jianfeng Tan <jianfeng.tan@intel.com>
Thanks,
Jianfeng
^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 2/8] driver/virtio: record virtual address of virtio net header
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
2015-10-21 4:46 ` [dpdk-dev] [PATCH 1/8] driver/virtio:add virtual addr for virtio net header Jijiang Liu
@ 2015-10-21 4:46 ` Jijiang Liu
2015-10-21 4:46 ` [dpdk-dev] [PATCH 3/8] driver/virtio:add vhost TX offload support capability in virtio-net Jijiang Liu
` (6 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Jijiang Liu @ 2015-10-21 4:46 UTC (permalink / raw)
To: dev
Record virtual address of virtio net header.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
---
drivers/net/virtio/virtio_ethdev.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 465d3cd..cb5dfee 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -376,6 +376,9 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
}
vq->virtio_net_hdr_mem =
vq->virtio_net_hdr_mz->phys_addr;
+ vq->virtio_net_hdr_addr =
+ (uint64_t)(uintptr_t)vq->virtio_net_hdr_mz->addr;
+
memset(vq->virtio_net_hdr_mz->addr, 0,
vq_size * hw->vtnet_hdr_size);
} else if (queue_type == VTNET_CQ) {
--
1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 3/8] driver/virtio:add vhost TX offload support capability in virtio-net
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
2015-10-21 4:46 ` [dpdk-dev] [PATCH 1/8] driver/virtio:add virtual addr for virtio net header Jijiang Liu
2015-10-21 4:46 ` [dpdk-dev] [PATCH 2/8] driver/virtio: record virtual address of " Jijiang Liu
@ 2015-10-21 4:46 ` Jijiang Liu
2015-10-29 12:44 ` David Marchand
2015-10-21 4:46 ` [dpdk-dev] [PATCH 4/8] driver/virtio:add vhost TX offload support capability Jijiang Liu
` (5 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Jijiang Liu @ 2015-10-21 4:46 UTC (permalink / raw)
To: dev
Add vhost TX checksum and TSO capabilities in virtio-net lib.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
---
drivers/net/virtio/virtio_ethdev.h | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h
index 9026d42..6ee95c6 100644
--- a/drivers/net/virtio/virtio_ethdev.h
+++ b/drivers/net/virtio/virtio_ethdev.h
@@ -64,7 +64,10 @@
1u << VIRTIO_NET_F_CTRL_VQ | \
1u << VIRTIO_NET_F_CTRL_RX | \
1u << VIRTIO_NET_F_CTRL_VLAN | \
- 1u << VIRTIO_NET_F_MRG_RXBUF)
+ 1u << VIRTIO_NET_F_MRG_RXBUF | \
+ 1u << VIRTIO_NET_F_HOST_TSO4 | \
+ 1u << VIRTIO_NET_F_HOST_TSO6 | \
+ 1u << VIRTIO_NET_F_CSUM)
/*
* CQ function prototype
--
1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 3/8] driver/virtio:add vhost TX offload support capability in virtio-net
2015-10-21 4:46 ` [dpdk-dev] [PATCH 3/8] driver/virtio:add vhost TX offload support capability in virtio-net Jijiang Liu
@ 2015-10-29 12:44 ` David Marchand
2015-10-30 8:15 ` Liu, Jijiang
0 siblings, 1 reply; 17+ messages in thread
From: David Marchand @ 2015-10-29 12:44 UTC (permalink / raw)
To: Jijiang Liu; +Cc: dev
Hello Jijiang,
On Wed, Oct 21, 2015 at 6:46 AM, Jijiang Liu <jijiang.liu@intel.com> wrote:
> Add vhost TX checksum and TSO capabilities in virtio-net lib.
>
> Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
> ---
> drivers/net/virtio/virtio_ethdev.h | 5 ++++-
> 1 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/virtio/virtio_ethdev.h
> b/drivers/net/virtio/virtio_ethdev.h
> index 9026d42..6ee95c6 100644
> --- a/drivers/net/virtio/virtio_ethdev.h
> +++ b/drivers/net/virtio/virtio_ethdev.h
> @@ -64,7 +64,10 @@
> 1u << VIRTIO_NET_F_CTRL_VQ | \
> 1u << VIRTIO_NET_F_CTRL_RX | \
> 1u << VIRTIO_NET_F_CTRL_VLAN | \
> - 1u << VIRTIO_NET_F_MRG_RXBUF)
> + 1u << VIRTIO_NET_F_MRG_RXBUF | \
> + 1u << VIRTIO_NET_F_HOST_TSO4 | \
> + 1u << VIRTIO_NET_F_HOST_TSO6 | \
> + 1u << VIRTIO_NET_F_CSUM)
>
>
You did not update tx offload capabilities field in dev_info.
--
David Marchand
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 3/8] driver/virtio:add vhost TX offload support capability in virtio-net
2015-10-29 12:44 ` David Marchand
@ 2015-10-30 8:15 ` Liu, Jijiang
0 siblings, 0 replies; 17+ messages in thread
From: Liu, Jijiang @ 2015-10-30 8:15 UTC (permalink / raw)
To: David Marchand; +Cc: dev
From: David Marchand [mailto:david.marchand@6wind.com]
Sent: Thursday, October 29, 2015 8:45 PM
To: Liu, Jijiang
Cc: dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH 3/8] driver/virtio:add vhost TX offload support capability in virtio-net
Hello Jijiang,
On Wed, Oct 21, 2015 at 6:46 AM, Jijiang Liu <jijiang.liu@intel.com<mailto:jijiang.liu@intel.com>> wrote:
Add vhost TX checksum and TSO capabilities in virtio-net lib.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com<mailto:jijiang.liu@intel.com>>
---
drivers/net/virtio/virtio_ethdev.h | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h
index 9026d42..6ee95c6 100644
--- a/drivers/net/virtio/virtio_ethdev.h
+++ b/drivers/net/virtio/virtio_ethdev.h
@@ -64,7 +64,10 @@
1u << VIRTIO_NET_F_CTRL_VQ | \
1u << VIRTIO_NET_F_CTRL_RX | \
1u << VIRTIO_NET_F_CTRL_VLAN | \
- 1u << VIRTIO_NET_F_MRG_RXBUF)
+ 1u << VIRTIO_NET_F_MRG_RXBUF | \
+ 1u << VIRTIO_NET_F_HOST_TSO4 | \
+ 1u << VIRTIO_NET_F_HOST_TSO6 | \
+ 1u << VIRTIO_NET_F_CSUM)
You did not update tx offload capabilities field in dev_info.
--
David Marchand
You meant that I should update the tx offload capabilities in the virtio_dev_info_get() function, correct?
^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 4/8] driver/virtio:add vhost TX offload support capability
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
` (2 preceding siblings ...)
2015-10-21 4:46 ` [dpdk-dev] [PATCH 3/8] driver/virtio:add vhost TX offload support capability in virtio-net Jijiang Liu
@ 2015-10-21 4:46 ` Jijiang Liu
2015-10-21 4:46 ` [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload Jijiang Liu
` (4 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Jijiang Liu @ 2015-10-21 4:46 UTC (permalink / raw)
To: dev
Add vhost TX checksum and TSO support capability in vhost lib.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
---
lib/librte_vhost/virtio-net.c | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/lib/librte_vhost/virtio-net.c b/lib/librte_vhost/virtio-net.c
index d0f1764..a5989a2 100644
--- a/lib/librte_vhost/virtio-net.c
+++ b/lib/librte_vhost/virtio-net.c
@@ -71,7 +71,11 @@ static struct virtio_net_config_ll *ll_root;
#define VHOST_SUPPORTED_FEATURES ((1ULL << VIRTIO_NET_F_MRG_RXBUF) | \
(1ULL << VIRTIO_NET_F_CTRL_VQ) | \
(1ULL << VIRTIO_NET_F_CTRL_RX) | \
- (1ULL << VHOST_F_LOG_ALL))
+ (1ULL << VHOST_F_LOG_ALL) | \
+ (1ULL << VIRTIO_NET_F_HOST_TSO4) | \
+ (1ULL << VIRTIO_NET_F_HOST_TSO6) | \
+ (1ULL << VIRTIO_NET_F_CSUM))
+
static uint64_t VHOST_FEATURES = VHOST_SUPPORTED_FEATURES;
--
1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
` (3 preceding siblings ...)
2015-10-21 4:46 ` [dpdk-dev] [PATCH 4/8] driver/virtio:add vhost TX offload support capability Jijiang Liu
@ 2015-10-21 4:46 ` Jijiang Liu
2015-10-29 14:15 ` David Marchand
2015-10-21 4:46 ` [dpdk-dev] [PATCH 6/8] lib/librte_vhost:dequeue " Jijiang Liu
` (3 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Jijiang Liu @ 2015-10-21 4:46 UTC (permalink / raw)
To: dev
Enqueue vhost TX checksum and TSO4/6 offload in virtio-net lib.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
---
drivers/net/virtio/virtio_rxtx.c | 61 ++++++++++++++++++++++++++++++++++++++
1 files changed, 61 insertions(+), 0 deletions(-)
diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c
index c5b53bb..b99f5b5 100644
--- a/drivers/net/virtio/virtio_rxtx.c
+++ b/drivers/net/virtio/virtio_rxtx.c
@@ -50,6 +50,10 @@
#include <rte_string_fns.h>
#include <rte_errno.h>
#include <rte_byteorder.h>
+#include <rte_tcp.h>
+#include <rte_ip.h>
+#include <rte_udp.h>
+#include <rte_sctp.h>
#include "virtio_logs.h"
#include "virtio_ethdev.h"
@@ -199,6 +203,58 @@ virtqueue_enqueue_recv_refill(struct virtqueue *vq, struct rte_mbuf *cookie)
}
static int
+virtqueue_enqueue_offload(struct virtqueue *txvq, struct rte_mbuf *m,
+ uint16_t idx, uint16_t hdr_sz)
+{
+ struct virtio_net_hdr *hdr = (struct virtio_net_hdr *)(uintptr_t)
+ (txvq->virtio_net_hdr_addr + idx * hdr_sz);
+
+ hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
+
+ /* if vhost TX checksum offload is required */
+ if (m->ol_flags & PKT_TX_IP_CKSUM) {
+ hdr->csum_start = m->l2_len;
+ hdr->csum_offset = offsetof(struct ipv4_hdr, hdr_checksum);
+ } else if (m->ol_flags & PKT_TX_L4_MASK) {
+ hdr->csum_start = m->l2_len + m->l3_len;
+ switch (m->ol_flags & PKT_TX_L4_MASK) {
+ case PKT_TX_TCP_CKSUM:
+ hdr->csum_offset = offsetof(struct tcp_hdr, cksum);
+ break;
+ case PKT_TX_UDP_CKSUM:
+ hdr->csum_offset = offsetof(struct udp_hdr,
+ dgram_cksum);
+ break;
+ case PKT_TX_SCTP_CKSUM:
+ hdr->csum_offset = offsetof(struct sctp_hdr, cksum);
+ break;
+ default:
+ break;
+ }
+ } else
+ hdr->flags = 0;
+
+ /* if vhost TSO offload is required */
+ if (m->tso_segsz != 0 && m->ol_flags & PKT_TX_TCP_SEG) {
+ if (m->ol_flags & PKT_TX_IPV4) {
+ if (!vtpci_with_feature(txvq->hw,
+ VIRTIO_NET_F_HOST_TSO4))
+ return -1;
+ hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
+ } else if (m->ol_flags & PKT_TX_IPV6) {
+ if (!vtpci_with_feature(txvq->hw,
+ VIRTIO_NET_F_HOST_TSO6))
+ return -1;
+ hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
+ }
+ hdr->gso_size = m->tso_segsz;
+ hdr->hdr_len = m->l2_len + m->l3_len + m->l4_len;
+ } else
+ hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
+ return 0;
+}
+
+static int
virtqueue_enqueue_xmit(struct virtqueue *txvq, struct rte_mbuf *cookie)
{
struct vq_desc_extra *dxp;
@@ -221,6 +277,11 @@ virtqueue_enqueue_xmit(struct virtqueue *txvq, struct rte_mbuf *cookie)
dxp->cookie = (void *)cookie;
dxp->ndescs = needed;
+ if (vtpci_with_feature(txvq->hw, VIRTIO_NET_F_CSUM)) {
+ if (virtqueue_enqueue_offload(txvq, cookie, idx, head_size) < 0)
+ return -EPERM;
+ }
+
start_dp = txvq->vq_ring.desc;
start_dp[idx].addr =
txvq->virtio_net_hdr_mem + idx * head_size;
--
1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload
2015-10-21 4:46 ` [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload Jijiang Liu
@ 2015-10-29 14:15 ` David Marchand
2015-10-30 11:45 ` Liu, Jijiang
0 siblings, 1 reply; 17+ messages in thread
From: David Marchand @ 2015-10-29 14:15 UTC (permalink / raw)
To: Liu, Jijiang; +Cc: dev
On Wed, Oct 21, 2015 at 6:46 AM, Jijiang Liu <jijiang.liu@intel.com> wrote:
> @@ -221,6 +277,11 @@ virtqueue_enqueue_xmit(struct virtqueue *txvq, struct
> rte_mbuf *cookie)
> dxp->cookie = (void *)cookie;
> dxp->ndescs = needed;
>
> + if (vtpci_with_feature(txvq->hw, VIRTIO_NET_F_CSUM)) {
> + if (virtqueue_enqueue_offload(txvq, cookie, idx,
> head_size) < 0)
> + return -EPERM;
> + }
> +
> start_dp = txvq->vq_ring.desc;
> start_dp[idx].addr =
> txvq->virtio_net_hdr_mem + idx * head_size;
>
If the driver correctly reports negotiated offload capabilities (see my
previous comment on patch 3), there is no need for the test on
VIRTIO_NET_F_CSUM, because application is not supposed to ask for offloads
on driver that do not support them.
Same logic would apply to virtqueue_enqueue_offload() function.
In the end, we could always call this function (or move the code here).
--
David Marchand
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload
2015-10-29 14:15 ` David Marchand
@ 2015-10-30 11:45 ` Liu, Jijiang
2015-10-30 12:14 ` David Marchand
0 siblings, 1 reply; 17+ messages in thread
From: Liu, Jijiang @ 2015-10-30 11:45 UTC (permalink / raw)
To: 'David Marchand'; +Cc: dev
Hi David,
From: David Marchand [mailto:david.marchand@6wind.com]
Sent: Thursday, October 29, 2015 10:16 PM
To: Liu, Jijiang
Cc: dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload
On Wed, Oct 21, 2015 at 6:46 AM, Jijiang Liu <jijiang.liu@intel.com<mailto:jijiang.liu@intel.com>> wrote:
@@ -221,6 +277,11 @@ virtqueue_enqueue_xmit(struct virtqueue *txvq, struct rte_mbuf *cookie)
dxp->cookie = (void *)cookie;
dxp->ndescs = needed;
+ if (vtpci_with_feature(txvq->hw, VIRTIO_NET_F_CSUM)) {
+ if (virtqueue_enqueue_offload(txvq, cookie, idx, head_size) < 0)
+ return -EPERM;
+ }
+
start_dp = txvq->vq_ring.desc;
start_dp[idx].addr =
txvq->virtio_net_hdr_mem + idx * head_size;
If the driver correctly reports negotiated offload capabilities (see my previous comment on patch 3), there is no need for the test on VIRTIO_NET_F_CSUM, because application is not supposed to ask for offloads on driver that do not support them.
> If the driver correctly reports negotiated offload capabilities, then application in guest will set the ol_flags in mbuf based on these offload capabilities.
If the VIRTIO_NET_F_CSUM is not enabled, and there is no need to call virtqueue_enqueue_offload() to check ol_flags in mbuf to see if the TX checksum and TSO is set ,and it will not effect on the performance of disabling TX checksum path as much as possible.
So I think there is need for the check.
> I agree with your comments on patch 3, I will add TX offload capabilities in the dev_info to tell application driver support these offloads.
Same logic would apply to virtqueue_enqueue_offload() function.
In the end, we could always call this function (or move the code here).
--
David Marchand
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload
2015-10-30 11:45 ` Liu, Jijiang
@ 2015-10-30 12:14 ` David Marchand
2015-10-30 12:21 ` Liu, Jijiang
0 siblings, 1 reply; 17+ messages in thread
From: David Marchand @ 2015-10-30 12:14 UTC (permalink / raw)
To: Liu, Jijiang; +Cc: dev
On Fri, Oct 30, 2015 at 12:45 PM, Liu, Jijiang <jijiang.liu@intel.com>
wrote:
>
> If the driver correctly reports negotiated offload capabilities (see my
> previous comment on patch 3), there is no need for the test on
> VIRTIO_NET_F_CSUM, because application is not supposed to ask for offloads
> on driver that do not support them.
>
>
>
>
>
> > If the driver correctly reports negotiated offload capabilities, then
> application in guest will set the ol_flags in mbuf based on these offload
> capabilities.
>
> If the VIRTIO_NET_F_CSUM is not enabled, and there is no need to call
> virtqueue_enqueue_offload() to check ol_flags in mbuf to see if the TX
> checksum and TSO is set ,and it will not effect on the performance of
> disabling TX checksum path as much as possible.
>
> So I think there is need for the check.
>
You are supposed to only handle mbuf with offloads if VIRTIO_NET_F_CSUM was
enabled in the first place through the capabilities.
So looking at ol_flags means that you implicitely check for
VIRTIO_NET_F_CSUM.
This is just an optimisation, so do as you like.
Anyway, I just want to confirm, is this patchset for 2.2 ?
--
David Marchand
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload
2015-10-30 12:14 ` David Marchand
@ 2015-10-30 12:21 ` Liu, Jijiang
0 siblings, 0 replies; 17+ messages in thread
From: Liu, Jijiang @ 2015-10-30 12:21 UTC (permalink / raw)
To: David Marchand; +Cc: dev
From: David Marchand [mailto:david.marchand@6wind.com]
Sent: Friday, October 30, 2015 8:15 PM
To: Liu, Jijiang
Cc: dev@dpdk.org; Thomas Monjalon
Subject: Re: [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload
On Fri, Oct 30, 2015 at 12:45 PM, Liu, Jijiang <jijiang.liu@intel.com<mailto:jijiang.liu@intel.com>> wrote:
If the driver correctly reports negotiated offload capabilities (see my previous comment on patch 3), there is no need for the test on VIRTIO_NET_F_CSUM, because application is not supposed to ask for offloads on driver that do not support them.
> If the driver correctly reports negotiated offload capabilities, then application in guest will set the ol_flags in mbuf based on these offload capabilities.
If the VIRTIO_NET_F_CSUM is not enabled, and there is no need to call virtqueue_enqueue_offload() to check ol_flags in mbuf to see if the TX checksum and TSO is set ,and it will not effect on the performance of disabling TX checksum path as much as possible.
So I think there is need for the check.
You are supposed to only handle mbuf with offloads if VIRTIO_NET_F_CSUM was enabled in the first place through the capabilities.
So looking at ol_flags means that you implicitely check for VIRTIO_NET_F_CSUM.
This is just an optimisation, so do as you like.
Anyway, I just want to confirm, is this patchset for 2.2 ?
>Yes, I will send new version for this patch set ASAP
--
David Marchand
^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 6/8] lib/librte_vhost:dequeue vhost TX offload
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
` (4 preceding siblings ...)
2015-10-21 4:46 ` [dpdk-dev] [PATCH 5/8] driver/virtio:enqueue vhost TX offload Jijiang Liu
@ 2015-10-21 4:46 ` Jijiang Liu
2015-10-21 4:46 ` [dpdk-dev] [PATCH 7/8] examples/vhost:support TX offload in vhost sample Jijiang Liu
` (2 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Jijiang Liu @ 2015-10-21 4:46 UTC (permalink / raw)
To: dev
Dequeue vhost TX offload in vhost lib.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
---
lib/librte_vhost/vhost_rxtx.c | 108 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 107 insertions(+), 1 deletions(-)
diff --git a/lib/librte_vhost/vhost_rxtx.c b/lib/librte_vhost/vhost_rxtx.c
index 7026bfa..a888ba9 100644
--- a/lib/librte_vhost/vhost_rxtx.c
+++ b/lib/librte_vhost/vhost_rxtx.c
@@ -36,7 +36,12 @@
#include <rte_mbuf.h>
#include <rte_memcpy.h>
+#include <rte_ether.h>
+#include <rte_ip.h>
#include <rte_virtio_net.h>
+#include <rte_tcp.h>
+#include <rte_udp.h>
+#include <rte_sctp.h>
#include "vhost-net.h"
@@ -548,6 +553,101 @@ rte_vhost_enqueue_burst(struct virtio_net *dev, uint16_t queue_id,
return virtio_dev_rx(dev, queue_id, pkts, count);
}
+static void
+parse_ethernet(struct rte_mbuf *m, uint16_t *l4_proto, void **l4_hdr)
+{
+ struct ipv4_hdr *ipv4_hdr;
+ struct ipv6_hdr *ipv6_hdr;
+ void *l3_hdr = NULL;
+ struct ether_hdr *eth_hdr;
+ uint16_t ethertype;
+
+ eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
+
+ m->l2_len = sizeof(struct ether_hdr);
+ ethertype = rte_be_to_cpu_16(eth_hdr->ether_type);
+
+ if (ethertype == ETHER_TYPE_VLAN) {
+ struct vlan_hdr *vlan_hdr = (struct vlan_hdr *)(eth_hdr + 1);
+
+ m->l2_len += sizeof(struct vlan_hdr);
+ ethertype = rte_be_to_cpu_16(vlan_hdr->eth_proto);
+ }
+
+ l3_hdr = (char *)eth_hdr + m->l2_len;
+
+ switch (ethertype) {
+ case ETHER_TYPE_IPv4:
+ ipv4_hdr = (struct ipv4_hdr *)l3_hdr;
+ *l4_proto = ipv4_hdr->next_proto_id;
+ m->l3_len = (ipv4_hdr->version_ihl & 0x0f) * 4;
+ *l4_hdr = (char *)l3_hdr + m->l3_len;
+ m->ol_flags |= PKT_TX_IPV4;
+ break;
+ case ETHER_TYPE_IPv6:
+ ipv6_hdr = (struct ipv6_hdr *)l3_hdr;
+ *l4_proto = ipv6_hdr->proto;
+ m->ol_flags |= PKT_TX_IPV6;
+ m->l3_len = sizeof(struct ipv6_hdr);
+ *l4_hdr = (char *)l3_hdr + m->l3_len;
+ break;
+ default:
+ m->l3_len = 0;
+ *l4_proto = 0;
+ break;
+ }
+}
+
+static inline void __attribute__((always_inline))
+vhost_dequeue_offload(struct virtio_net_hdr *hdr, struct rte_mbuf *m)
+{
+ uint16_t l4_proto = 0;
+ void *l4_hdr = NULL;
+ struct tcp_hdr *tcp_hdr = NULL;
+
+ parse_ethernet(m, &l4_proto, &l4_hdr);
+ if (hdr->flags == VIRTIO_NET_HDR_F_NEEDS_CSUM) {
+ if ((hdr->csum_start == m->l2_len) &&
+ (hdr->csum_offset == offsetof(struct ipv4_hdr,
+ hdr_checksum)))
+ m->ol_flags |= PKT_TX_IP_CKSUM;
+ else if (hdr->csum_start == (m->l2_len + m->l3_len)) {
+ switch (hdr->csum_offset) {
+ case (offsetof(struct tcp_hdr, cksum)):
+ if (l4_proto == IPPROTO_TCP)
+ m->ol_flags |= PKT_TX_TCP_CKSUM;
+ break;
+ case (offsetof(struct udp_hdr, dgram_cksum)):
+ if (l4_proto == IPPROTO_UDP)
+ m->ol_flags |= PKT_TX_UDP_CKSUM;
+ break;
+ case (offsetof(struct sctp_hdr, cksum)):
+ if (l4_proto == IPPROTO_SCTP)
+ m->ol_flags |= PKT_TX_SCTP_CKSUM;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
+ switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
+ case VIRTIO_NET_HDR_GSO_TCPV4:
+ case VIRTIO_NET_HDR_GSO_TCPV6:
+ tcp_hdr = (struct tcp_hdr *)l4_hdr;
+ m->ol_flags |= PKT_TX_TCP_SEG;
+ m->tso_segsz = hdr->gso_size;
+ m->l4_len = (tcp_hdr->data_off & 0xf0) >> 2;
+ break;
+ default:
+ RTE_LOG(WARNING, VHOST_DATA,
+ "unsupported gso type %u.\n", hdr->gso_type);
+ break;
+ }
+ }
+}
+
uint16_t
rte_vhost_dequeue_burst(struct virtio_net *dev, uint16_t queue_id,
struct rte_mempool *mbuf_pool, struct rte_mbuf **pkts, uint16_t count)
@@ -556,11 +656,13 @@ rte_vhost_dequeue_burst(struct virtio_net *dev, uint16_t queue_id,
struct vhost_virtqueue *vq;
struct vring_desc *desc;
uint64_t vb_addr = 0;
+ uint64_t vb_net_hdr_addr = 0;
uint32_t head[MAX_PKT_BURST];
uint32_t used_idx;
uint32_t i;
uint16_t free_entries, entry_success = 0;
uint16_t avail_idx;
+ struct virtio_net_hdr *hdr = NULL;
if (unlikely(queue_id != VIRTIO_TXQ)) {
LOG_DEBUG(VHOST_DATA, "mq isn't supported in this version.\n");
@@ -607,6 +709,9 @@ rte_vhost_dequeue_burst(struct virtio_net *dev, uint16_t queue_id,
desc = &vq->desc[head[entry_success]];
+ vb_net_hdr_addr = gpa_to_vva(dev, desc->addr);
+ hdr = (struct virtio_net_hdr *)((uintptr_t)vb_net_hdr_addr);
+
/* Discard first buffer as it is the virtio header */
if (desc->flags & VRING_DESC_F_NEXT) {
desc = &vq->desc[desc->next];
@@ -745,7 +850,8 @@ rte_vhost_dequeue_burst(struct virtio_net *dev, uint16_t queue_id,
break;
m->nb_segs = seg_num;
-
+ if ((hdr->flags != 0) || (hdr->gso_type != 0))
+ vhost_dequeue_offload(hdr, m);
pkts[entry_success] = m;
vq->last_used_idx++;
entry_success++;
--
1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 7/8] examples/vhost:support TX offload in vhost sample
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
` (5 preceding siblings ...)
2015-10-21 4:46 ` [dpdk-dev] [PATCH 6/8] lib/librte_vhost:dequeue " Jijiang Liu
@ 2015-10-21 4:46 ` Jijiang Liu
2015-10-21 4:46 ` [dpdk-dev] [PATCH 8/8] app/testpmd:modify MAC address of csum forwarding Jijiang Liu
2015-10-26 6:45 ` [dpdk-dev] [PATCH 0/8] add vhost TX offload support Liu, Jijiang
8 siblings, 0 replies; 17+ messages in thread
From: Jijiang Liu @ 2015-10-21 4:46 UTC (permalink / raw)
To: dev
Change the vhost sample to support and test TX offload.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
---
examples/vhost/main.c | 128 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 111 insertions(+), 17 deletions(-)
diff --git a/examples/vhost/main.c b/examples/vhost/main.c
index 9eac2d0..06e1e8b 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -50,6 +50,10 @@
#include <rte_string_fns.h>
#include <rte_malloc.h>
#include <rte_virtio_net.h>
+#include <rte_tcp.h>
+#include <rte_ip.h>
+#include <rte_udp.h>
+#include <rte_sctp.h>
#include "main.h"
@@ -140,6 +144,8 @@
#define MBUF_EXT_MEM(mb) (rte_mbuf_from_indirect(mb) != (mb))
+#define VIRTIO_TX_CKSUM_OFFLOAD_MASK (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK)
+
/* mask of enabled ports */
static uint32_t enabled_port_mask = 0;
@@ -197,6 +203,13 @@ typedef enum {
static uint32_t enable_stats = 0;
/* Enable retries on RX. */
static uint32_t enable_retry = 1;
+
+/* Disable TX checksum offload */
+static uint32_t enable_tx_csum;
+
+/* Disable TSO offload */
+static uint32_t enable_tso;
+
/* Specify timeout (in useconds) between retries on RX. */
static uint32_t burst_rx_delay_time = BURST_RX_WAIT_US;
/* Specify the number of retries on RX. */
@@ -292,20 +305,6 @@ struct vlan_ethhdr {
__be16 h_vlan_encapsulated_proto;
};
-/* IPv4 Header */
-struct ipv4_hdr {
- uint8_t version_ihl; /**< version and header length */
- uint8_t type_of_service; /**< type of service */
- uint16_t total_length; /**< length of packet */
- uint16_t packet_id; /**< packet ID */
- uint16_t fragment_offset; /**< fragmentation offset */
- uint8_t time_to_live; /**< time to live */
- uint8_t next_proto_id; /**< protocol ID */
- uint16_t hdr_checksum; /**< header checksum */
- uint32_t src_addr; /**< source address */
- uint32_t dst_addr; /**< destination address */
-} __attribute__((__packed__));
-
/* Header lengths. */
#define VLAN_HLEN 4
#define VLAN_ETH_HLEN 18
@@ -441,6 +440,14 @@ port_init(uint8_t port)
if (port >= rte_eth_dev_count()) return -1;
+ if (enable_tx_csum == 0)
+ rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_CSUM);
+
+ if (enable_tso == 0) {
+ rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO4);
+ rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO6);
+ }
+
rx_rings = (uint16_t)dev_info.max_rx_queues;
/* Configure ethernet device. */
retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf);
@@ -576,7 +583,9 @@ us_vhost_usage(const char *prgname)
" --rx-desc-num [0-N]: the number of descriptors on rx, "
"used only when zero copy is enabled.\n"
" --tx-desc-num [0-N]: the number of descriptors on tx, "
- "used only when zero copy is enabled.\n",
+ "used only when zero copy is enabled.\n"
+ " --tx-csum [0|1] disable/enable TX checksum offload.\n"
+ " --tso [0|1] disable/enable TCP segement offload.\n",
prgname);
}
@@ -602,6 +611,8 @@ us_vhost_parse_args(int argc, char **argv)
{"zero-copy", required_argument, NULL, 0},
{"rx-desc-num", required_argument, NULL, 0},
{"tx-desc-num", required_argument, NULL, 0},
+ {"tx-csum", required_argument, NULL, 0},
+ {"tso", required_argument, NULL, 0},
{NULL, 0, 0, 0},
};
@@ -656,6 +667,28 @@ us_vhost_parse_args(int argc, char **argv)
}
}
+ /* Enable/disable TX checksum offload. */
+ if (!strncmp(long_option[option_index].name, "tx-csum", MAX_LONG_OPT_SZ)) {
+ ret = parse_num_opt(optarg, 1);
+ if (ret == -1) {
+ RTE_LOG(INFO, VHOST_CONFIG, "Invalid argument for tx-csum [0|1]\n");
+ us_vhost_usage(prgname);
+ return -1;
+ } else
+ enable_tx_csum = ret;
+ }
+
+ /* Enable/disable TSO offload. */
+ if (!strncmp(long_option[option_index].name, "tso", MAX_LONG_OPT_SZ)) {
+ ret = parse_num_opt(optarg, 1);
+ if (ret == -1) {
+ RTE_LOG(INFO, VHOST_CONFIG, "Invalid argument for tso [0|1]\n");
+ us_vhost_usage(prgname);
+ return -1;
+ } else
+ enable_tso = ret;
+ }
+
/* Specify the retries delay time (in useconds) on RX. */
if (!strncmp(long_option[option_index].name, "rx-retry-delay", MAX_LONG_OPT_SZ)) {
ret = parse_num_opt(optarg, INT32_MAX);
@@ -1114,6 +1147,63 @@ find_local_dest(struct virtio_net *dev, struct rte_mbuf *m,
return 0;
}
+static uint16_t
+get_psd_sum(void *l3_hdr, uint64_t ol_flags)
+{
+ if (ol_flags & PKT_TX_IPV4)
+ return rte_ipv4_phdr_cksum(l3_hdr, ol_flags);
+ else /* assume ethertype == ETHER_TYPE_IPv6 */
+ return rte_ipv6_phdr_cksum(l3_hdr, ol_flags);
+}
+
+static void virtio_tx_offload(struct rte_mbuf *m)
+{
+ void *l3_hdr;
+ struct ipv4_hdr *ipv4_hdr = NULL;
+ struct tcp_hdr *tcp_hdr = NULL;
+ struct udp_hdr *udp_hdr = NULL;
+ struct sctp_hdr *sctp_hdr = NULL;
+ struct ether_hdr *eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
+
+ l3_hdr = (char *)eth_hdr + m->l2_len;
+
+ if (m->ol_flags & PKT_TX_IPV4) {
+ ipv4_hdr = (struct ipv4_hdr *)l3_hdr;
+ if (m->ol_flags & PKT_TX_IP_CKSUM)
+ ipv4_hdr->hdr_checksum = 0;
+ }
+
+ if (m->ol_flags & PKT_TX_L4_MASK) {
+ switch (m->ol_flags & PKT_TX_L4_MASK) {
+ case PKT_TX_TCP_CKSUM:
+ tcp_hdr = (struct tcp_hdr *)
+ ((char *)l3_hdr + m->l3_len);
+ tcp_hdr->cksum = get_psd_sum(l3_hdr, m->ol_flags);
+ break;
+ case PKT_TX_UDP_CKSUM:
+ udp_hdr = (struct udp_hdr *)
+ ((char *)l3_hdr + m->l3_len);
+ udp_hdr->dgram_cksum = get_psd_sum(l3_hdr, m->ol_flags);
+ break;
+ case PKT_TX_SCTP_CKSUM:
+ sctp_hdr = (struct sctp_hdr *)
+ ((char *)l3_hdr + m->l3_len);
+ sctp_hdr->cksum = 0;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (m->tso_segsz != 0) {
+ ipv4_hdr = (struct ipv4_hdr *)l3_hdr;
+ tcp_hdr = (struct tcp_hdr *)((char *)l3_hdr + m->l3_len);
+ m->ol_flags |= PKT_TX_IP_CKSUM;
+ ipv4_hdr->hdr_checksum = 0;
+ tcp_hdr->cksum = get_psd_sum(l3_hdr, m->ol_flags);
+ }
+}
+
/*
* This function routes the TX packet to the correct interface. This may be a local device
* or the physical port.
@@ -1156,7 +1246,7 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag)
(vh->vlan_tci != vlan_tag_be))
vh->vlan_tci = vlan_tag_be;
} else {
- m->ol_flags = PKT_TX_VLAN_PKT;
+ m->ol_flags |= PKT_TX_VLAN_PKT;
/*
* Find the right seg to adjust the data len when offset is
@@ -1180,6 +1270,10 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag)
m->vlan_tci = vlan_tag;
}
+ if ((m->ol_flags & VIRTIO_TX_CKSUM_OFFLOAD_MASK) ||
+ (m->ol_flags & PKT_TX_TCP_SEG))
+ virtio_tx_offload(m);
+
tx_q->m_table[len] = m;
len++;
if (enable_stats) {
@@ -1841,7 +1935,7 @@ virtio_tx_route_zcp(struct virtio_net *dev, struct rte_mbuf *m,
mbuf->buf_physaddr = m->buf_physaddr;
mbuf->buf_addr = m->buf_addr;
}
- mbuf->ol_flags = PKT_TX_VLAN_PKT;
+ mbuf->ol_flags |= PKT_TX_VLAN_PKT;
mbuf->vlan_tci = vlan_tag;
mbuf->l2_len = sizeof(struct ether_hdr);
mbuf->l3_len = sizeof(struct ipv4_hdr);
--
1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 8/8] app/testpmd:modify MAC address of csum forwarding
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
` (6 preceding siblings ...)
2015-10-21 4:46 ` [dpdk-dev] [PATCH 7/8] examples/vhost:support TX offload in vhost sample Jijiang Liu
@ 2015-10-21 4:46 ` Jijiang Liu
2015-10-26 6:45 ` [dpdk-dev] [PATCH 0/8] add vhost TX offload support Liu, Jijiang
8 siblings, 0 replies; 17+ messages in thread
From: Jijiang Liu @ 2015-10-21 4:46 UTC (permalink / raw)
To: dev
The change will affect on the csum fwd performance.
But I also think the change is necessary, or we cannot use csumonly fwd mode in a VM.
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
---
app/test-pmd/csumonly.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index e561dde..20d4274 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -622,6 +622,12 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
}
m->tso_segsz = info.tso_segsz;
m->ol_flags = ol_flags;
+
+ ether_addr_copy(&peer_eth_addrs[fs->peer_addr],
+ ð_hdr->d_addr);
+
+ ether_addr_copy(&ports[fs->tx_port].eth_addr,
+ ð_hdr->s_addr);
/* if verbose mode is enabled, dump debug info */
if (verbose_level > 0) {
--
1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 0/8] add vhost TX offload support
2015-10-21 4:46 [dpdk-dev] [PATCH 0/8] add vhost TX offload support Jijiang Liu
` (7 preceding siblings ...)
2015-10-21 4:46 ` [dpdk-dev] [PATCH 8/8] app/testpmd:modify MAC address of csum forwarding Jijiang Liu
@ 2015-10-26 6:45 ` Liu, Jijiang
8 siblings, 0 replies; 17+ messages in thread
From: Liu, Jijiang @ 2015-10-26 6:45 UTC (permalink / raw)
To: dev
We have tested the following case on Intel 10G NIC using the patch set.
Test case Flow:
Iperf app running on legacy virtio guest---->DPDK vhost-----> two physical ports loopback on a NIC ----> legacy vhost----->iperf app running on a legacy virtio guest.
After enabling the vhost TSO and checksum offload, there is about 60% throughput performance improvement.
And we will continue to test the performance after the patch set is applied.
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jijiang Liu
> Sent: Wednesday, October 21, 2015 12:47 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH 0/8] add vhost TX offload support
>
> In fact, this patch set is v2 of [1], but I consider that the vhost checksum
> offload capability is also supported in this version, and send a new patch set
> out.
>
> The patch set add the negotiation between us-vhost and virtio-net for vhost
> TX offload(checksum and TSO), and add the TX offload support in the libs and
> change vhost sample and csum application to test these changes.
>
>
> [1]http://dpdk.org/ml/archives/dev/2015-September/023686.html
>
>
> Jijiang Liu (8):
> add virtual address of virtio net header
> store virtual address of virtio hdr
> add vhost TX offload support capability in virtio-net
> add vhost TX offload support capability in vhost
> enqueue TX offload
> dequeue TX offload
> change vhost App to support TX offload
> fix csumonly fwd issue
>
> app/test-pmd/csumonly.c | 6 ++
> drivers/net/virtio/virtio_ethdev.c | 3 +
> drivers/net/virtio/virtio_ethdev.h | 5 +-
> drivers/net/virtio/virtio_rxtx.c | 61 +++++++++++++++++
> drivers/net/virtio/virtqueue.h | 1 +
> examples/vhost/main.c | 128
> +++++++++++++++++++++++++++++++-----
> lib/librte_vhost/vhost_rxtx.c | 108 ++++++++++++++++++++++++++++++-
> lib/librte_vhost/virtio-net.c | 6 ++-
> 8 files changed, 298 insertions(+), 20 deletions(-)
>
> --
> 1.7.7.6
^ permalink raw reply [flat|nested] 17+ messages in thread