diff mbox

[v9,22/22] vhost-net: disable when cross-endian

Message ID 20140624175126.17522.85549.stgit@bahia.local
State New
Headers show

Commit Message

Greg Kurz June 24, 2014, 5:55 p.m. UTC
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 impacted.

Suggested-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
---
 hw/net/vhost_net.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Comments

Michael S. Tsirkin June 29, 2014, 3:07 p.m. UTC | #1
On Tue, Jun 24, 2014 at 07:55:03PM +0200, Greg Kurz wrote:
> 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 impacted.

s/will/will be/

> 
> Suggested-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> ---
>  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;
diff mbox

Patch

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;