qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] vhost-user: support cross-endianess negatiation


From: Marc-André Lureau
Subject: Re: [Qemu-devel] [PATCH] vhost-user: support cross-endianess negatiation
Date: Wed, 14 Jun 2017 17:17:37 +0000

H

On Wed, Jun 14, 2017 at 8:42 PM Felipe Franciosi <address@hidden> wrote:

> Currently, vhost-user does not implement any means for notifying the
> backend about guest endianess. This commit introduces a new message
> called VHOST_USER_SET_VRING_ENDIAN which is analogous to the ioctl()
> called VHOST_SET_VRING_ENDIAN used for kernel vhost backends. Such
> message is necessary for backends supporting legacy (pre-1.0) virtio
> devices running in big-endian guests.
>
> Signed-off-by: Felipe Franciosi <address@hidden>
> Signed-off-by: Mike Cui <address@hidden>
> ---
>  docs/specs/vhost-user.txt | 14 ++++++++++++++
>  hw/virtio/vhost-user.c    | 23 +++++++++++++++++++++--
>  2 files changed, 35 insertions(+), 2 deletions(-)
>
> diff --git a/docs/specs/vhost-user.txt b/docs/specs/vhost-user.txt
> index 481ab56..eafbed9 100644
> --- a/docs/specs/vhost-user.txt
> +++ b/docs/specs/vhost-user.txt
> @@ -326,6 +326,7 @@ Protocol features
>  #define VHOST_USER_PROTOCOL_F_REPLY_ACK      3
>  #define VHOST_USER_PROTOCOL_F_MTU            4
>  #define VHOST_USER_PROTOCOL_F_SLAVE_REQ      5
> +#define VHOST_USER_PROTOCOL_F_CROSS_ENDIAN   6
>
>  Master message types
>  --------------------
> @@ -580,6 +581,19 @@ Master message types
>        This request should be send only when VIRTIO_F_IOMMU_PLATFORM
> feature
>        has been successfully negotiated.
>
> + * VHOST_USER_SET_VRING_ENDIAN
> +
> +      Id: 22
> +      Equivalent ioctl: VHOST_SET_VRING_ENDIAN
> +      Master payload: vring state description
> +
> +      Set the endianess of a VQ for legacy devices. Big-endian is
> indicated
> +      with state.num set to true, and little-endian is indicated with
> state.num
> +      set to false.
> +      This request should be sent only when
> VHOST_USER_PROTOCOL_F_CROSS_ENDIAN
> +      has been negotiated.
>

And it can be sent at any time? multiple times? Do we expect the backend to
handle any endianess?


> +
> +
>  Slave message types
>  -------------------
>
> diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
> index 958ee09..006af1c 100644
> --- a/hw/virtio/vhost-user.c
> +++ b/hw/virtio/vhost-user.c
> @@ -33,6 +33,7 @@ enum VhostUserProtocolFeature {
>      VHOST_USER_PROTOCOL_F_REPLY_ACK = 3,
>      VHOST_USER_PROTOCOL_F_NET_MTU = 4,
>      VHOST_USER_PROTOCOL_F_SLAVE_REQ = 5,
> +    VHOST_USER_PROTOCOL_F_CROSS_ENDIAN = 6,
>
>      VHOST_USER_PROTOCOL_F_MAX
>  };
> @@ -63,6 +64,7 @@ typedef enum VhostUserRequest {
>      VHOST_USER_NET_SET_MTU = 20,
>      VHOST_USER_SET_SLAVE_REQ_FD = 21,
>      VHOST_USER_IOTLB_MSG = 22,
> +    VHOST_USER_SET_VRING_ENDIAN = 23,
>      VHOST_USER_MAX
>  } VhostUserRequest;
>
> @@ -367,8 +369,25 @@ static int vhost_user_set_vring_addr(struct vhost_dev
> *dev,
>  static int vhost_user_set_vring_endian(struct vhost_dev *dev,
>                                         struct vhost_vring_state *ring)
>  {
> -    error_report("vhost-user trying to send unhandled ioctl");
> -    return -1;
> +    bool cross_endian = virtio_has_feature(dev->protocol_features,
> +
>  VHOST_USER_PROTOCOL_F_CROSS_ENDIAN);
> +    VhostUserMsg msg = {
> +        .request = VHOST_USER_SET_VRING_ENDIAN,
> +        .flags = VHOST_USER_VERSION,
> +        .payload.state = *ring,
> +        .size = sizeof(msg.payload.state),
> +    };
> +
> +    if (!cross_endian) {
> +        error_report("vhost-user trying to send unhandled ioctl");
> +        return -1;
> +    }
> +
> +    if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
> +        return -1;
> +    }
> +
> +    return 0;
>  }
>
>  static int vhost_set_vring(struct vhost_dev *dev,
> --
> 1.9.5
>
>
> --
Marc-André Lureau


reply via email to

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