[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] virtio-9p: fix any_layout
From: |
Jason Wang |
Subject: |
Re: [Qemu-devel] [PATCH] virtio-9p: fix any_layout |
Date: |
Fri, 24 Jul 2015 10:14:02 +0800 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 |
On 07/24/2015 01:59 AM, Michael S. Tsirkin wrote:
> virtio pci allows any device to have a modern interface,
> this in turn requires ANY_LAYOUT support.
> Fix up ANY_LAYOUT for virtio-9p.
>
> Reported-by: Jason Wang <address@hidden>
> Signed-off-by: Michael S. Tsirkin <address@hidden>
> ---
>
> Lightly tested.
Looks correct.
Reviewed-by: Jason Wang <address@hidden>
>
> hw/9pfs/virtio-9p.c | 22 ++++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
> index 6ef8af3..7a3171f 100644
> --- a/hw/9pfs/virtio-9p.c
> +++ b/hw/9pfs/virtio-9p.c
> @@ -3261,16 +3261,26 @@ void handle_9p_output(VirtIODevice *vdev, VirtQueue
> *vq)
>
> while ((pdu = alloc_pdu(s)) &&
> (len = virtqueue_pop(vq, &pdu->elem)) != 0) {
> - uint8_t *ptr;
> + struct {
> + uint32_t size_le;
> + uint8_t id;
> + uint16_t tag_le;
> + } QEMU_PACKED out;
> + int len;
> +
> pdu->s = s;
> BUG_ON(pdu->elem.out_num == 0 || pdu->elem.in_num == 0);
> - BUG_ON(pdu->elem.out_sg[0].iov_len < 7);
> + QEMU_BUILD_BUG_ON(sizeof out != 7);
> +
> + len = iov_to_buf(pdu->elem.out_sg, pdu->elem.out_num, 0,
> + &out, sizeof out);
> + BUG_ON(len != sizeof out);
> +
> + pdu->size = le32_to_cpu(out.size_le);
>
> - ptr = pdu->elem.out_sg[0].iov_base;
> + pdu->id = out.id;
> + pdu->tag = le16_to_cpu(out.tag_le);
>
> - pdu->size = le32_to_cpu(*(uint32_t *)ptr);
> - pdu->id = ptr[4];
> - pdu->tag = le16_to_cpu(*(uint16_t *)(ptr + 5));
> qemu_co_queue_init(&pdu->complete);
> submit_pdu(s, pdu);
> }