From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60470) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1ISN-000146-J2 for qemu-devel@nongnu.org; Sun, 29 Jun 2014 13:00:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X1ISH-0003WO-AE for qemu-devel@nongnu.org; Sun, 29 Jun 2014 12:59:59 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36702) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1ISH-0003WK-1J for qemu-devel@nongnu.org; Sun, 29 Jun 2014 12:59:53 -0400 Date: Sun, 29 Jun 2014 20:00:13 +0300 From: "Michael S. Tsirkin" Message-ID: <1404060115-27410-37-git-send-email-mst@redhat.com> References: <1404060115-27410-1-git-send-email-mst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1404060115-27410-1-git-send-email-mst@redhat.com> Subject: [Qemu-devel] [PULL 36/37] vhost-net: disable when cross-endian List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Anthony Liguori , Greg Kurz From: Greg Kurz As of today, vhost assumes guest and host have the same endianness. This is definitely not compatible with modern PPC64 and ARM that can change endianness at runtime. Let's disable vhost-net and print an error message when we detect such a case: qemu-system-ppc64: vhost-net does not support cross-endian qemu-system-ppc64: unable to start vhost net: 38: falling back on userspace virtio This way users can continue to run VMs without changing their setup and have a chance to know that performance will be impacted. Suggested-by: Michael S. Tsirkin Signed-off-by: Greg Kurz Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/net/vhost_net.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 7ac7c21..f87c798 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -275,6 +275,19 @@ static void vhost_net_stop_one(struct vhost_net *net, vhost_dev_disable_notifiers(&net->dev, dev); } +static bool vhost_net_device_endian_ok(VirtIODevice *vdev) +{ +#ifdef TARGET_IS_BIENDIAN +#ifdef HOST_WORDS_BIGENDIAN + return virtio_is_big_endian(vdev); +#else + return !virtio_is_big_endian(vdev); +#endif +#else + return true; +#endif +} + int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, int total_queues) { @@ -283,6 +296,12 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); int r, i = 0; + if (!vhost_net_device_endian_ok(dev)) { + error_report("vhost-net does not support cross-endian"); + r = -ENOSYS; + goto err; + } + if (!k->set_guest_notifiers) { error_report("binding does not support guest notifiers"); r = -ENOSYS; -- MST