diff mbox

[v2] tests: fix qvirtqueue_kick

Message ID 1472330054-22607-1-git-send-email-lvivier@redhat.com
State New
Headers show

Commit Message

Laurent Vivier Aug. 27, 2016, 8:34 p.m. UTC
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(-)

Comments

Laurent Vivier Sept. 5, 2016, 11:17 a.m. UTC | #1
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);
>
Stefan Hajnoczi Sept. 5, 2016, 6:07 p.m. UTC | #2
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 mbox

Patch

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);