* [Qemu-devel] [PATCH] virtio-9p: fix any_layout
@ 2015-07-23 17:59 Michael S. Tsirkin
2015-07-24 2:14 ` Jason Wang
0 siblings, 1 reply; 2+ messages in thread
From: Michael S. Tsirkin @ 2015-07-23 17:59 UTC (permalink / raw)
To: qemu-devel; +Cc: Jason Wang, Aneesh Kumar K.V
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 <jasowang@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
Lightly tested.
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);
}
--
MST
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] virtio-9p: fix any_layout
2015-07-23 17:59 [Qemu-devel] [PATCH] virtio-9p: fix any_layout Michael S. Tsirkin
@ 2015-07-24 2:14 ` Jason Wang
0 siblings, 0 replies; 2+ messages in thread
From: Jason Wang @ 2015-07-24 2:14 UTC (permalink / raw)
To: Michael S. Tsirkin, qemu-devel; +Cc: Aneesh Kumar K.V
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 <jasowang@redhat.com>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
>
> Lightly tested.
Looks correct.
Reviewed-by: Jason Wang <jasowang@redhat.com>
>
> 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);
> }
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-07-24 2:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-23 17:59 [Qemu-devel] [PATCH] virtio-9p: fix any_layout Michael S. Tsirkin
2015-07-24 2:14 ` Jason Wang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).