Message ID | 1472330054-22607-1-git-send-email-lvivier@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
for 2.8, ping. Thanks, Laurent On 27/08/2016 22:34, Laurent Vivier wrote: > vq->avail.idx and vq->avail->ring[] are a 16bit values, > so read and write them with readw()/writew() instead of > readl()/writel(). > > To read/write a 16bit value with a 32bit accessor works fine > on little-endian CPU but not on big endian CPU. > > Signed-off-by: Laurent Vivier <lvivier@redhat.com> > --- > v2: vq->avail->ring[] is also a 16bit value > > tests/libqos/virtio.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c > index d8c2970..37ff860 100644 > --- a/tests/libqos/virtio.c > +++ b/tests/libqos/virtio.c > @@ -257,16 +257,16 @@ void qvirtqueue_kick(const QVirtioBus *bus, QVirtioDevice *d, QVirtQueue *vq, > uint32_t free_head) > { > /* vq->avail->idx */ > - uint16_t idx = readl(vq->avail + 2); > + uint16_t idx = readw(vq->avail + 2); > /* vq->used->flags */ > uint16_t flags; > /* vq->used->avail_event */ > uint16_t avail_event; > > /* vq->avail->ring[idx % vq->size] */ > - writel(vq->avail + 4 + (2 * (idx % vq->size)), free_head); > + writew(vq->avail + 4 + (2 * (idx % vq->size)), free_head); > /* vq->avail->idx */ > - writel(vq->avail + 2, idx + 1); > + writew(vq->avail + 2, idx + 1); > > /* Must read after idx is updated */ > flags = readw(vq->avail); >
On Sat, Aug 27, 2016 at 04:34:14PM -0400, Laurent Vivier wrote: > vq->avail.idx and vq->avail->ring[] are a 16bit values, > so read and write them with readw()/writew() instead of > readl()/writel(). > > To read/write a 16bit value with a 32bit accessor works fine > on little-endian CPU but not on big endian CPU. > > Signed-off-by: Laurent Vivier <lvivier@redhat.com> > --- > v2: vq->avail->ring[] is also a 16bit value > > tests/libqos/virtio.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) Thanks, applied to my block-next tree: https://github.com/stefanha/qemu/commits/block-next Stefan
diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c index d8c2970..37ff860 100644 --- a/tests/libqos/virtio.c +++ b/tests/libqos/virtio.c @@ -257,16 +257,16 @@ void qvirtqueue_kick(const QVirtioBus *bus, QVirtioDevice *d, QVirtQueue *vq, uint32_t free_head) { /* vq->avail->idx */ - uint16_t idx = readl(vq->avail + 2); + uint16_t idx = readw(vq->avail + 2); /* vq->used->flags */ uint16_t flags; /* vq->used->avail_event */ uint16_t avail_event; /* vq->avail->ring[idx % vq->size] */ - writel(vq->avail + 4 + (2 * (idx % vq->size)), free_head); + writew(vq->avail + 4 + (2 * (idx % vq->size)), free_head); /* vq->avail->idx */ - writel(vq->avail + 2, idx + 1); + writew(vq->avail + 2, idx + 1); /* Must read after idx is updated */ flags = readw(vq->avail);
vq->avail.idx and vq->avail->ring[] are a 16bit values, so read and write them with readw()/writew() instead of readl()/writel(). To read/write a 16bit value with a 32bit accessor works fine on little-endian CPU but not on big endian CPU. Signed-off-by: Laurent Vivier <lvivier@redhat.com> --- v2: vq->avail->ring[] is also a 16bit value tests/libqos/virtio.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)