Code Review
/
kvmfornfv.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Merge "Adding breaktrace & disabling timer migration"
[kvmfornfv.git]
/
qemu
/
hw
/
char
/
virtio-serial-bus.c
diff --git
a/qemu/hw/char/virtio-serial-bus.c
b/qemu/hw/char/virtio-serial-bus.c
index
bc56f5d
..
6e5de6d
100644
(file)
--- a/
qemu/hw/char/virtio-serial-bus.c
+++ b/
qemu/hw/char/virtio-serial-bus.c
@@
-18,6
+18,8
@@
* GNU GPL, version 2 or (at your option) any later version.
*/
* GNU GPL, version 2 or (at your option) any later version.
*/
+#include "qemu/osdep.h"
+#include "qapi/error.h"
#include "qemu/iov.h"
#include "monitor/monitor.h"
#include "qemu/error-report.h"
#include "qemu/iov.h"
#include "monitor/monitor.h"
#include "qemu/error-report.h"
@@
-76,13
+78,13
@@
static VirtIOSerialPort *find_port_by_name(char *name)
static bool use_multiport(VirtIOSerial *vser)
{
VirtIODevice *vdev = VIRTIO_DEVICE(vser);
static bool use_multiport(VirtIOSerial *vser)
{
VirtIODevice *vdev = VIRTIO_DEVICE(vser);
- return virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT);
+ return virtio_
vdev_
has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT);
}
static size_t write_to_port(VirtIOSerialPort *port,
const uint8_t *buf, size_t size)
{
}
static size_t write_to_port(VirtIOSerialPort *port,
const uint8_t *buf, size_t size)
{
- VirtQueueElement elem;
+ VirtQueueElement
*
elem;
VirtQueue *vq;
size_t offset;
VirtQueue *vq;
size_t offset;
@@
-95,15
+97,17
@@
static size_t write_to_port(VirtIOSerialPort *port,
while (offset < size) {
size_t len;
while (offset < size) {
size_t len;
- if (!virtqueue_pop(vq, &elem)) {
+ elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
+ if (!elem) {
break;
}
break;
}
- len = iov_from_buf(elem
.in_sg, elem.
in_num, 0,
+ len = iov_from_buf(elem
->in_sg, elem->
in_num, 0,
buf + offset, size - offset);
offset += len;
buf + offset, size - offset);
offset += len;
- virtqueue_push(vq, &elem, len);
+ virtqueue_push(vq, elem, len);
+ g_free(elem);
}
virtio_notify(VIRTIO_DEVICE(port->vser), vq);
}
virtio_notify(VIRTIO_DEVICE(port->vser), vq);
@@
-112,13
+116,18
@@
static size_t write_to_port(VirtIOSerialPort *port,
static void discard_vq_data(VirtQueue *vq, VirtIODevice *vdev)
{
static void discard_vq_data(VirtQueue *vq, VirtIODevice *vdev)
{
- VirtQueueElement elem;
+ VirtQueueElement
*
elem;
if (!virtio_queue_ready(vq)) {
return;
}
if (!virtio_queue_ready(vq)) {
return;
}
- while (virtqueue_pop(vq, &elem)) {
- virtqueue_push(vq, &elem, 0);
+ for (;;) {
+ elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
+ if (!elem) {
+ break;
+ }
+ virtqueue_push(vq, elem, 0);
+ g_free(elem);
}
virtio_notify(vdev, vq);
}
}
virtio_notify(vdev, vq);
}
@@
-137,21
+146,22
@@
static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,
unsigned int i;
/* Pop an elem only if we haven't left off a previous one mid-way */
unsigned int i;
/* Pop an elem only if we haven't left off a previous one mid-way */
- if (!port->elem.out_num) {
- if (!virtqueue_pop(vq, &port->elem)) {
+ if (!port->elem) {
+ port->elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
+ if (!port->elem) {
break;
}
port->iov_idx = 0;
port->iov_offset = 0;
}
break;
}
port->iov_idx = 0;
port->iov_offset = 0;
}
- for (i = port->iov_idx; i < port->elem
.
out_num; i++) {
+ for (i = port->iov_idx; i < port->elem
->
out_num; i++) {
size_t buf_size;
ssize_t ret;
size_t buf_size;
ssize_t ret;
- buf_size = port->elem
.
out_sg[i].iov_len - port->iov_offset;
+ buf_size = port->elem
->
out_sg[i].iov_len - port->iov_offset;
ret = vsc->have_data(port,
ret = vsc->have_data(port,
- port->elem
.
out_sg[i].iov_base
+ port->elem
->
out_sg[i].iov_base
+ port->iov_offset,
buf_size);
if (port->throttled) {
+ port->iov_offset,
buf_size);
if (port->throttled) {
@@
-166,8
+176,9
@@
static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,
if (port->throttled) {
break;
}
if (port->throttled) {
break;
}
- virtqueue_push(vq, &port->elem, 0);
- port->elem.out_num = 0;
+ virtqueue_push(vq, port->elem, 0);
+ g_free(port->elem);
+ port->elem = NULL;
}
virtio_notify(vdev, vq);
}
}
virtio_notify(vdev, vq);
}
@@
-184,22
+195,26
@@
static void flush_queued_data(VirtIOSerialPort *port)
static size_t send_control_msg(VirtIOSerial *vser, void *buf, size_t len)
{
static size_t send_control_msg(VirtIOSerial *vser, void *buf, size_t len)
{
- VirtQueueElement elem;
+ VirtQueueElement
*
elem;
VirtQueue *vq;
vq = vser->c_ivq;
if (!virtio_queue_ready(vq)) {
return 0;
}
VirtQueue *vq;
vq = vser->c_ivq;
if (!virtio_queue_ready(vq)) {
return 0;
}
- if (!virtqueue_pop(vq, &elem)) {
+
+ elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
+ if (!elem) {
return 0;
}
/* TODO: detect a buffer that's too short, set NEEDS_RESET */
return 0;
}
/* TODO: detect a buffer that's too short, set NEEDS_RESET */
- iov_from_buf(elem
.in_sg, elem.
in_num, 0, buf, len);
+ iov_from_buf(elem
->in_sg, elem->
in_num, 0, buf, len);
- virtqueue_push(vq,
&
elem, len);
+ virtqueue_push(vq, elem, len);
virtio_notify(VIRTIO_DEVICE(vser), vq);
virtio_notify(VIRTIO_DEVICE(vser), vq);
+ g_free(elem);
+
return len;
}
return len;
}
@@
-413,7
+428,7
@@
static void control_in(VirtIODevice *vdev, VirtQueue *vq)
static void control_out(VirtIODevice *vdev, VirtQueue *vq)
{
static void control_out(VirtIODevice *vdev, VirtQueue *vq)
{
- VirtQueueElement elem;
+ VirtQueueElement
*
elem;
VirtIOSerial *vser;
uint8_t *buf;
size_t len;
VirtIOSerial *vser;
uint8_t *buf;
size_t len;
@@
-422,10
+437,15
@@
static void control_out(VirtIODevice *vdev, VirtQueue *vq)
len = 0;
buf = NULL;
len = 0;
buf = NULL;
-
while (virtqueue_pop(vq, &elem)
) {
+
for (;;
) {
size_t cur_len;
size_t cur_len;
- cur_len = iov_size(elem.out_sg, elem.out_num);
+ elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
+ if (!elem) {
+ break;
+ }
+
+ cur_len = iov_size(elem->out_sg, elem->out_num);
/*
* Allocate a new buf only if we didn't have one previously or
* if the size of the buf differs
/*
* Allocate a new buf only if we didn't have one previously or
* if the size of the buf differs
@@
-436,10
+456,11
@@
static void control_out(VirtIODevice *vdev, VirtQueue *vq)
buf = g_malloc(cur_len);
len = cur_len;
}
buf = g_malloc(cur_len);
len = cur_len;
}
- iov_to_buf(elem
.out_sg, elem.
out_num, 0, buf, cur_len);
+ iov_to_buf(elem
->out_sg, elem->
out_num, 0, buf, cur_len);
handle_control_message(vser, buf, cur_len);
handle_control_message(vser, buf, cur_len);
- virtqueue_push(vq, &elem, 0);
+ virtqueue_push(vq, elem, 0);
+ g_free(elem);
}
g_free(buf);
virtio_notify(vdev, vq);
}
g_free(buf);
virtio_notify(vdev, vq);
@@
-619,16
+640,14
@@
static void virtio_serial_save_device(VirtIODevice *vdev, QEMUFile *f)
qemu_put_byte(f, port->host_connected);
elem_popped = 0;
qemu_put_byte(f, port->host_connected);
elem_popped = 0;
- if (port->elem
.out_num
) {
+ if (port->elem) {
elem_popped = 1;
}
qemu_put_be32s(f, &elem_popped);
if (elem_popped) {
qemu_put_be32s(f, &port->iov_idx);
qemu_put_be64s(f, &port->iov_offset);
elem_popped = 1;
}
qemu_put_be32s(f, &elem_popped);
if (elem_popped) {
qemu_put_be32s(f, &port->iov_idx);
qemu_put_be64s(f, &port->iov_offset);
-
- qemu_put_buffer(f, (unsigned char *)&port->elem,
- sizeof(port->elem));
+ qemu_put_virtqueue_element(f, port->elem);
}
}
}
}
}
}
@@
-703,12
+722,8
@@
static int fetch_active_ports_list(QEMUFile *f, int version_id,
qemu_get_be32s(f, &port->iov_idx);
qemu_get_be64s(f, &port->iov_offset);
qemu_get_be32s(f, &port->iov_idx);
qemu_get_be64s(f, &port->iov_offset);
- qemu_get_buffer(f, (unsigned char *)&port->elem,
- sizeof(port->elem));
- virtqueue_map_sg(port->elem.in_sg, port->elem.in_addr,
- port->elem.in_num, 1);
- virtqueue_map_sg(port->elem.out_sg, port->elem.out_addr,
- port->elem.out_num, 1);
+ port->elem =
+ qemu_get_virtqueue_element(f, sizeof(VirtQueueElement));
/*
* Port was throttled on source machine. Let's
/*
* Port was throttled on source machine. Let's
@@
-801,7
+816,7
@@
static const TypeInfo virtser_bus_info = {
static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
{
static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
{
- VirtIOSerialPort *port =
DO_UPCAST(VirtIOSerialPort, dev,
qdev);
+ VirtIOSerialPort *port =
VIRTIO_SERIAL_PORT(
qdev);
monitor_printf(mon, "%*sport %d, guest %s, host %s, throttle %s\n",
indent, "", port->id,
monitor_printf(mon, "%*sport %d, guest %s, host %s, throttle %s\n",
indent, "", port->id,
@@
-930,7
+945,7
@@
static void virtser_port_device_realize(DeviceState *dev, Error **errp)
return;
}
return;
}
- port->elem
.out_num = 0
;
+ port->elem
= NULL
;
}
static void virtser_port_device_plug(HotplugHandler *hotplug_dev,
}
static void virtser_port_device_plug(HotplugHandler *hotplug_dev,