Hi Maxime, > -----Original Message----- > From: Maxime Coquelin [mailto:maxime.coque...@redhat.com] > Sent: Wednesday, December 6, 2017 4:37 PM > To: Hu, Jiayu <jiayu...@intel.com>; dev@dpdk.org > Cc: y...@fridaylinux.org; Tan, Jianfeng <jianfeng....@intel.com> > Subject: Re: [dpdk-dev] [PATCH] vhost: support UDP Fragmentation Offload > > > > On 11/21/2017 07:56 AM, Jiayu Hu wrote: > > In virtio, UDP Fragmentation Offload (UFO) includes two parts: host UFO > > and guest UFO. Guest UFO means the frontend can receive large UDP > packets, > > and host UFO means the backend can receive large UDP packets. This patch > > supports host UFO and guest UFO for vhost-user. > > > > Signed-off-by: Jiayu Hu <jiayu...@intel.com> > > --- > > lib/librte_mbuf/rte_mbuf.h | 7 +++++++ > > lib/librte_vhost/vhost.h | 2 ++ > > lib/librte_vhost/virtio_net.c | 10 ++++++++++ > > 3 files changed, 19 insertions(+) > > > > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h > > index ce8a05d..3d8cfc9 100644 > > --- a/lib/librte_mbuf/rte_mbuf.h > > +++ b/lib/librte_mbuf/rte_mbuf.h > > @@ -209,6 +209,13 @@ extern "C" { > > /* add new TX flags here */ > > > > /** > > + * UDP Fragmentation Offload flag. This flag is used for enabling UDP > > + * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used > > + * to store the MSS of UDP fragments. > > + */ > > +#define PKT_TX_UDP_SEG (1ULL << 42) > > + > > +/** > > * Request security offload processing on the TX packet. > > */ > > #define PKT_TX_SEC_OFFLOAD (1ULL << 43) > > diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h > > index 1cc81c1..fc109ef 100644 > > --- a/lib/librte_vhost/vhost.h > > +++ b/lib/librte_vhost/vhost.h > > @@ -206,10 +206,12 @@ struct vhost_msg { > > (1ULL << > VHOST_USER_F_PROTOCOL_FEATURES) | \ > > (1ULL << VIRTIO_NET_F_HOST_TSO4) | \ > > (1ULL << VIRTIO_NET_F_HOST_TSO6) | \ > > + (1ULL << VIRTIO_NET_F_HOST_UFO) | \ > > (1ULL << VIRTIO_NET_F_CSUM) | \ > > (1ULL << VIRTIO_NET_F_GUEST_CSUM) | \ > > (1ULL << VIRTIO_NET_F_GUEST_TSO4) | \ > > (1ULL << VIRTIO_NET_F_GUEST_TSO6) | \ > > + (1ULL << VIRTIO_NET_F_GUEST_UFO) | \ > > I actually have the same question as for GSO. > Dos it impact performance as it seems enabled by default in QEMU?
When enable host/guest UFO, the frontend and the backend can communicate via large UDP packets, thus reducing the number of packets to be processed. It's similar with TSO for virtio. Therefore, I think host/guest UFO can bring performance gains. > How do you test it? We launch testpmd with two vhost-user ports, which connect to two VMs in one server. When launch qemu, we enable host and guest UFO with command "host_ufo=on, guest_ufo=on,csum=on". Then we run iperf in the two VMs to send large UDP packets. If you use "show port xstats all" in testpmd, you can see the vhost-user port can receive large UDP packets, which means host_ufo works. Additionally, if the forwarded large UDP packets can be received by the VM, it means guest_ufo also works. Thanks, Jiayu > > Thanks, > Maxime > > > (1ULL << VIRTIO_RING_F_INDIRECT_DESC) > | \ > > (1ULL << VIRTIO_NET_F_MTU) | \ > > (1ULL << VIRTIO_F_IOMMU_PLATFORM)) > > diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c > > index 6fee16e..3a3a0ad 100644 > > --- a/lib/librte_vhost/virtio_net.c > > +++ b/lib/librte_vhost/virtio_net.c > > @@ -188,6 +188,11 @@ virtio_enqueue_offload(struct rte_mbuf *m_buf, > struct virtio_net_hdr *net_hdr) > > net_hdr->gso_size = m_buf->tso_segsz; > > net_hdr->hdr_len = m_buf->l2_len + m_buf->l3_len > > + m_buf->l4_len; > > + } else if (m_buf->ol_flags & PKT_TX_UDP_SEG) { > > + net_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP; > > + net_hdr->gso_size = m_buf->tso_segsz; > > + net_hdr->hdr_len = m_buf->l2_len + m_buf->l3_len + > > + m_buf->l4_len; > > } else { > > ASSIGN_UNLESS_EQUAL(net_hdr->gso_type, 0); > > ASSIGN_UNLESS_EQUAL(net_hdr->gso_size, 0); > > @@ -834,6 +839,11 @@ vhost_dequeue_offload(struct virtio_net_hdr > *hdr, struct rte_mbuf *m) > > m->tso_segsz = hdr->gso_size; > > m->l4_len = (tcp_hdr->data_off & 0xf0) >> 2; > > break; > > + case VIRTIO_NET_HDR_GSO_UDP: > > + m->ol_flags |= PKT_TX_UDP_SEG; > > + m->tso_segsz = hdr->gso_size; > > + m->l4_len = sizeof(struct udp_hdr); > > + break; > > default: > > RTE_LOG(WARNING, VHOST_DATA, > > "unsupported gso type %u.\n", hdr- > >gso_type); > >