Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751836AbbBVJqa (ORCPT ); Sun, 22 Feb 2015 04:46:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42111 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751297AbbBVJq0 (ORCPT ); Sun, 22 Feb 2015 04:46:26 -0500 Date: Sun, 22 Feb 2015 10:46:15 +0100 From: "Michael S. Tsirkin" To: Greg Kurz Cc: Cedric Le Goater , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org Subject: Re: [PATCH 3/3] vhost_net: fix virtio_net header endianness Message-ID: <20150222094615.GA17529@redhat.com> References: <20150220100724.18608.74654.stgit@bahia.local> <20150220101454.18608.64016.stgit@bahia.local> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150220101454.18608.64016.stgit@bahia.local> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2644 Lines: 75 On Fri, Feb 20, 2015 at 11:15:05AM +0100, Greg Kurz wrote: > Without this patch, packets are being silently dropped by the tap backend. > > Signed-off-by: Greg Kurz I think it's the wrong place to fix this. You want a tun/macvtap ioctl to enable legacy big endian stuff. Treat it same way as vhost, with a config option to enable. > --- > drivers/vhost/net.c | 32 ++++++++++++++++++++++++++------ > 1 file changed, 26 insertions(+), 6 deletions(-) > > diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c > index afa06d2..2923eee 100644 > --- a/drivers/vhost/net.c > +++ b/drivers/vhost/net.c > @@ -288,6 +288,16 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success) > rcu_read_unlock_bh(); > } > > +static void fix_virtio_net_hdr(struct vhost_virtqueue *vq) > +{ > + struct virtio_net_hdr *hdr = vq->iov[0].iov_base; > + > + hdr->hdr_len = vhost16_to_cpu(vq, hdr->hdr_len); > + hdr->gso_size = vhost16_to_cpu(vq, hdr->gso_size); > + hdr->csum_start = vhost16_to_cpu(vq, hdr->csum_start); > + hdr->csum_offset = vhost16_to_cpu(vq, hdr->csum_offset); > +} > + > /* Expects to be always run from workqueue - which acts as > * read-size critical section for our kind of RCU. */ > static void handle_tx(struct vhost_net *net) > @@ -352,6 +362,10 @@ static void handle_tx(struct vhost_net *net) > "out %d, int %d\n", out, in); > break; > } > + > + if (!hdr_size) > + fix_virtio_net_hdr(vq); > + > /* Skip header. TODO: support TSO. */ > len = iov_length(vq->iov, out); > iov_iter_init(&msg.msg_iter, WRITE, vq->iov, out, len); > @@ -609,12 +623,18 @@ static void handle_rx(struct vhost_net *net) > continue; > } > /* Supply virtio_net_hdr if VHOST_NET_F_VIRTIO_NET_HDR */ > - if (unlikely(vhost_hlen) && > - copy_to_iter(&hdr, sizeof(hdr), &fixup) != sizeof(hdr)) { > - vq_err(vq, "Unable to write vnet_hdr at addr %p\n", > - vq->iov->iov_base); > - break; > - } > + if (unlikely(vhost_hlen)) { > + size_t len = copy_to_iter(&hdr, sizeof(hdr), &fixup); > + > + if (len != sizeof(hdr)) { > + vq_err(vq, > + "Unable to write vnet_hdr at addr %p\n", > + vq->iov->iov_base); > + break; > + } > + } else > + fix_virtio_net_hdr(vq); > + > /* TODO: Should check and handle checksum. */ > > num_buffers = cpu_to_vhost16(vq, headcount); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/