qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v9 22/22] vhost-net: disable when cross-endian


From: Michael S. Tsirkin
Subject: Re: [Qemu-devel] [PATCH v9 22/22] vhost-net: disable when cross-endian
Date: Sun, 29 Jun 2014 18:07:25 +0300

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 <address@hidden>
> Signed-off-by: Greg Kurz <address@hidden>
> ---
>  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;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]