virtio-serial: Handle scatter/gather input from the guest

Current guests don't send more than one iov but it can change later.
Ensure we handle that case.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
CC: Avi Kivity <avi@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Amit Shah 2010-04-27 18:04:08 +05:30 committed by Anthony Liguori
parent e61da14d60
commit e85ba9b2dc

View File

@ -351,7 +351,8 @@ static void handle_output(VirtIODevice *vdev, VirtQueue *vq)
while (virtqueue_pop(vq, &elem)) {
VirtIOSerialPort *port;
size_t ret;
uint8_t *buf;
size_t ret, buf_size;
port = find_port_by_vq(vser, vq);
if (!port) {
@ -374,9 +375,12 @@ static void handle_output(VirtIODevice *vdev, VirtQueue *vq)
goto next_buf;
}
/* The guest always sends only one sg */
ret = port->info->have_data(port, elem.out_sg[0].iov_base,
elem.out_sg[0].iov_len);
buf_size = iov_size(elem.out_sg, elem.out_num);
buf = qemu_malloc(buf_size);
ret = iov_to_buf(elem.out_sg, elem.out_num, buf, 0, buf_size);
ret = port->info->have_data(port, buf, ret);
qemu_free(buf);
next_buf:
virtqueue_push(vq, &elem, ret);