H On Wed, Jun 14, 2017 at 8:42 PM Felipe Franciosi <fel...@nutanix.com> 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 <fel...@nutanix.com> > Signed-off-by: Mike Cui <c...@nutanix.com> > --- > 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