mirror of https://github.com/xemu-project/xemu.git
virtio-serial: move active ports loading to separate function
The virtio_serial_load() function became too big, split the code that gets the port info from the source into a separate function. Signed-off-by: Amit Shah <amit.shah@redhat.com>
This commit is contained in:
parent
c3587ca1a2
commit
2e575a86ab
|
@ -658,10 +658,60 @@ static void virtio_serial_post_load_timer_cb(void *opaque)
|
||||||
s->post_load.connected = NULL;
|
s->post_load.connected = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fetch_active_ports_list(QEMUFile *f, int version_id,
|
||||||
|
VirtIOSerial *s, uint32_t nr_active_ports)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
s->post_load.nr_active_ports = nr_active_ports;
|
||||||
|
s->post_load.connected =
|
||||||
|
g_malloc0(sizeof(*s->post_load.connected) * nr_active_ports);
|
||||||
|
|
||||||
|
/* Items in struct VirtIOSerialPort */
|
||||||
|
for (i = 0; i < nr_active_ports; i++) {
|
||||||
|
VirtIOSerialPort *port;
|
||||||
|
uint32_t id;
|
||||||
|
|
||||||
|
id = qemu_get_be32(f);
|
||||||
|
port = find_port_by_id(s, id);
|
||||||
|
if (!port) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
port->guest_connected = qemu_get_byte(f);
|
||||||
|
s->post_load.connected[i].port = port;
|
||||||
|
s->post_load.connected[i].host_connected = qemu_get_byte(f);
|
||||||
|
|
||||||
|
if (version_id > 2) {
|
||||||
|
uint32_t elem_popped;
|
||||||
|
|
||||||
|
qemu_get_be32s(f, &elem_popped);
|
||||||
|
if (elem_popped) {
|
||||||
|
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 was throttled on source machine. Let's
|
||||||
|
* unthrottle it here so data starts flowing again.
|
||||||
|
*/
|
||||||
|
virtio_serial_throttle_port(port, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qemu_mod_timer(s->post_load.timer, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
||||||
{
|
{
|
||||||
VirtIOSerial *s = opaque;
|
VirtIOSerial *s = opaque;
|
||||||
VirtIOSerialPort *port;
|
|
||||||
uint32_t max_nr_ports, nr_active_ports, ports_map;
|
uint32_t max_nr_ports, nr_active_ports, ports_map;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -705,48 +755,12 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
||||||
|
|
||||||
qemu_get_be32s(f, &nr_active_ports);
|
qemu_get_be32s(f, &nr_active_ports);
|
||||||
|
|
||||||
s->post_load.nr_active_ports = nr_active_ports;
|
if (nr_active_ports) {
|
||||||
s->post_load.connected =
|
ret = fetch_active_ports_list(f, version_id, s, nr_active_ports);
|
||||||
g_malloc0(sizeof(*s->post_load.connected) * nr_active_ports);
|
if (ret) {
|
||||||
|
return ret;
|
||||||
/* Items in struct VirtIOSerialPort */
|
|
||||||
for (i = 0; i < nr_active_ports; i++) {
|
|
||||||
uint32_t id;
|
|
||||||
|
|
||||||
id = qemu_get_be32(f);
|
|
||||||
port = find_port_by_id(s, id);
|
|
||||||
if (!port) {
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
port->guest_connected = qemu_get_byte(f);
|
|
||||||
s->post_load.connected[i].port = port;
|
|
||||||
s->post_load.connected[i].host_connected = qemu_get_byte(f);
|
|
||||||
|
|
||||||
if (version_id > 2) {
|
|
||||||
uint32_t elem_popped;
|
|
||||||
|
|
||||||
qemu_get_be32s(f, &elem_popped);
|
|
||||||
if (elem_popped) {
|
|
||||||
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 was throttled on source machine. Let's
|
|
||||||
* unthrottle it here so data starts flowing again.
|
|
||||||
*/
|
|
||||||
virtio_serial_throttle_port(port, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
qemu_mod_timer(s->post_load.timer, 1);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue