[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