[dpdk-dev] vhost: support Generic Segmentation Offload
Checks
Commit Message
In virtio, Generic Segmentation Offload (GSO) is the feature for the
backend, which means the backend can receive packets with any GSO
type.
Virtio-net enables the GSO feature by default, and vhost-net supports it.
To make live migration from vhost-net to vhost-user possible, this patch
enables GSO for vhost-user.
Signed-off-by: Jiayu Hu <jiayu.hu@intel.com>
---
lib/librte_vhost/vhost.h | 1 +
1 file changed, 1 insertion(+)
Comments
Hi Jiayu,
On 11/28/2017 06:28 AM, Jiayu Hu wrote:
> In virtio, Generic Segmentation Offload (GSO) is the feature for the
> backend, which means the backend can receive packets with any GSO
> type.
>
> Virtio-net enables the GSO feature by default, and vhost-net supports it.
> To make live migration from vhost-net to vhost-user possible, this patch
> enables GSO for vhost-user.
Please note that the application relying on Vhost library may disable
some features, breaking the migration from vhost-net to vhost-user even
if all features are supported in the vhost-user lib.
For example, ovs-dpdk disables the following features:
err = rte_vhost_driver_disable_features(dev->vhost_id,
1ULL << VIRTIO_NET_F_HOST_TSO4
| 1ULL << VIRTIO_NET_F_HOST_TSO6
| 1ULL << VIRTIO_NET_F_CSUM);
> Signed-off-by: Jiayu Hu <jiayu.hu@intel.com>
> ---
> lib/librte_vhost/vhost.h | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
> index 1cc81c1..04f54cb 100644
> --- a/lib/librte_vhost/vhost.h
> +++ b/lib/librte_vhost/vhost.h
> @@ -204,6 +204,7 @@ struct vhost_msg {
> (1ULL << VIRTIO_F_VERSION_1) | \
> (1ULL << VHOST_F_LOG_ALL) | \
> (1ULL << VHOST_USER_F_PROTOCOL_FEATURES) | \
> + (1ULL << VIRTIO_NET_F_GSO) | \
This feature is also enabled by default in QEMU, and seems also to be
acked by default in the virtio-net kernel driver.
Does it have an impact on performance? Be it good or bad.
How to test it?
> (1ULL << VIRTIO_NET_F_HOST_TSO4) | \
> (1ULL << VIRTIO_NET_F_HOST_TSO6) | \
> (1ULL << VIRTIO_NET_F_CSUM) | \
>
Thanks,
Maxime
Hi Maxime,
> -----Original Message-----
> From: Maxime Coquelin [mailto:maxime.coquelin@redhat.com]
> Sent: Wednesday, December 6, 2017 4:34 PM
> To: Hu, Jiayu <jiayu.hu@intel.com>; dev@dpdk.org
> Cc: yliu@fridaylinux.org; Tan, Jianfeng <jianfeng.tan@intel.com>
> Subject: Re: [dpdk-dev] [PATCH] vhost: support Generic Segmentation
> Offload
>
> Hi Jiayu,
>
> On 11/28/2017 06:28 AM, Jiayu Hu wrote:
> > In virtio, Generic Segmentation Offload (GSO) is the feature for the
> > backend, which means the backend can receive packets with any GSO
> > type.
> >
> > Virtio-net enables the GSO feature by default, and vhost-net supports it.
> > To make live migration from vhost-net to vhost-user possible, this patch
> > enables GSO for vhost-user.
>
> Please note that the application relying on Vhost library may disable
> some features, breaking the migration from vhost-net to vhost-user even
> if all features are supported in the vhost-user lib.
>
> For example, ovs-dpdk disables the following features:
> err = rte_vhost_driver_disable_features(dev->vhost_id,
> 1ULL << VIRTIO_NET_F_HOST_TSO4
> | 1ULL << VIRTIO_NET_F_HOST_TSO6
> | 1ULL << VIRTIO_NET_F_CSUM);
>
>
> > Signed-off-by: Jiayu Hu <jiayu.hu@intel.com>
> > ---
> > lib/librte_vhost/vhost.h | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
> > index 1cc81c1..04f54cb 100644
> > --- a/lib/librte_vhost/vhost.h
> > +++ b/lib/librte_vhost/vhost.h
> > @@ -204,6 +204,7 @@ struct vhost_msg {
> > (1ULL << VIRTIO_F_VERSION_1) | \
> > (1ULL << VHOST_F_LOG_ALL) | \
> > (1ULL <<
> VHOST_USER_F_PROTOCOL_FEATURES) | \
> > + (1ULL << VIRTIO_NET_F_GSO) | \
>
> This feature is also enabled by default in QEMU, and seems also to be
> acked by default in the virtio-net kernel driver.
>
> Does it have an impact on performance? Be it good or bad.
>
> How to test it?
VIRTIO_NET_F_GSO is the combination of all backend GSO types, like
VIRTIO_NET_F_HOST_UFO and VIRTIO_NET_F_HOST_ECN. Supporting
VIRTIO_NET_F_GSO equals to supporting all backend GSO types.
In the virtio-net driver, VIRTIO_NET_F_GSO influences the offloading abilities of
virtio-net devices. When VIRTIO_NET_F_GSO is negotiated, the virtio-net device has
TSO(_ECN) and UFO turned on by default. It equals to enabling "host_ufo", "host_tso4/6"
and "host_ecn".
About the performance, when VIRTIO_NET_F_GSO is enabled, the device
can send large TCP/UDP packets (exceeding MTU) to the backend. Large packets
can reduce the per-packet overhead. Therefore, I think it's good for performance.
We can test this feature with the following configuration:
Environment:
- one server with two physical interfaces (p1 and p2).
- p1 and p2 are connected physically. p1 is assigned to DPDK and p2 is to kernel.
Steps:
- launch testpmd with p1 and one vhost-user port
- launching qemu with command "gso=on, csum=on". In the VM, you can see
TSO_ECN and UFO of the virtio-net port are enabled by default.
- Run "iperf -u -s ..." on p2
- run "iperf -u -c ... -l 7000B" in the VM. Therefore, iperf client will send large
UDP packets
- "show port xstats all" in testpmd. You can see the vhost-user port receives
large UDP packets from the frontend.
You can also use the above steps to test the vhost-user host_ufo feature.
Thanks,
Jiayu
>
> > (1ULL << VIRTIO_NET_F_HOST_TSO4) | \
> > (1ULL << VIRTIO_NET_F_HOST_TSO6) | \
> > (1ULL << VIRTIO_NET_F_CSUM) | \
> >
>
> Thanks,
> Maxime
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jiayu Hu
> Sent: Tuesday, November 28, 2017 1:29 PM
> To: dev@dpdk.org
> Cc: yliu@fridaylinux.org; Tan, Jianfeng <jianfeng.tan@intel.com>; Hu, Jiayu
> <jiayu.hu@intel.com>
> Subject: [dpdk-dev] [PATCH] vhost: support Generic Segmentation Offload
>
> In virtio, Generic Segmentation Offload (GSO) is the feature for the
> backend, which means the backend can receive packets with any GSO
> type.
>
> Virtio-net enables the GSO feature by default, and vhost-net supports it.
> To make live migration from vhost-net to vhost-user possible, this patch
> enables GSO for vhost-user.
>
> Signed-off-by: Jiayu Hu <jiayu.hu@intel.com>
Tested-by: Lei Yao<lei.a.yao@intel.com>
This patch has been tested on my server, after add csum=on, gso=on to qemu cmdline,
Following offload are active in vm:
udp-fragmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: on
tx-tcp6-segmentation: on
> ---
> lib/librte_vhost/vhost.h | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
> index 1cc81c1..04f54cb 100644
> --- a/lib/librte_vhost/vhost.h
> +++ b/lib/librte_vhost/vhost.h
> @@ -204,6 +204,7 @@ struct vhost_msg {
> (1ULL << VIRTIO_F_VERSION_1) | \
> (1ULL << VHOST_F_LOG_ALL) | \
> (1ULL <<
> VHOST_USER_F_PROTOCOL_FEATURES) | \
> + (1ULL << VIRTIO_NET_F_GSO) | \
> (1ULL << VIRTIO_NET_F_HOST_TSO4) | \
> (1ULL << VIRTIO_NET_F_HOST_TSO6) | \
> (1ULL << VIRTIO_NET_F_CSUM) | \
> --
> 2.7.4
On Mon, Dec 25, 2017 at 01:53:29AM +0000, Yao, Lei A wrote:
>
>
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jiayu Hu
> > Sent: Tuesday, November 28, 2017 1:29 PM
> > To: dev@dpdk.org
> > Cc: yliu@fridaylinux.org; Tan, Jianfeng <jianfeng.tan@intel.com>; Hu, Jiayu
> > <jiayu.hu@intel.com>
> > Subject: [dpdk-dev] [PATCH] vhost: support Generic Segmentation Offload
> >
> > In virtio, Generic Segmentation Offload (GSO) is the feature for the
> > backend, which means the backend can receive packets with any GSO
> > type.
> >
> > Virtio-net enables the GSO feature by default, and vhost-net supports it.
> > To make live migration from vhost-net to vhost-user possible, this patch
> > enables GSO for vhost-user.
> >
> > Signed-off-by: Jiayu Hu <jiayu.hu@intel.com>
> Tested-by: Lei Yao<lei.a.yao@intel.com>
Applied to dpdk-next-virtio.
Thanks.
--yliu
> This patch has been tested on my server, after add csum=on, gso=on to qemu cmdline,
> Following offload are active in vm:
> udp-fragmentation-offload: on
> tx-tcp-segmentation: on
> tx-tcp-ecn-segmentation: on
> tx-tcp6-segmentation: on
>
> > ---
> > lib/librte_vhost/vhost.h | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
> > index 1cc81c1..04f54cb 100644
> > --- a/lib/librte_vhost/vhost.h
> > +++ b/lib/librte_vhost/vhost.h
> > @@ -204,6 +204,7 @@ struct vhost_msg {
> > (1ULL << VIRTIO_F_VERSION_1) | \
> > (1ULL << VHOST_F_LOG_ALL) | \
> > (1ULL <<
> > VHOST_USER_F_PROTOCOL_FEATURES) | \
> > + (1ULL << VIRTIO_NET_F_GSO) | \
> > (1ULL << VIRTIO_NET_F_HOST_TSO4) | \
> > (1ULL << VIRTIO_NET_F_HOST_TSO6) | \
> > (1ULL << VIRTIO_NET_F_CSUM) | \
> > --
> > 2.7.4
@@ -204,6 +204,7 @@ struct vhost_msg {
(1ULL << VIRTIO_F_VERSION_1) | \
(1ULL << VHOST_F_LOG_ALL) | \
(1ULL << VHOST_USER_F_PROTOCOL_FEATURES) | \
+ (1ULL << VIRTIO_NET_F_GSO) | \
(1ULL << VIRTIO_NET_F_HOST_TSO4) | \
(1ULL << VIRTIO_NET_F_HOST_TSO6) | \
(1ULL << VIRTIO_NET_F_CSUM) | \