[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] hw/virtio-serial-bus: post_load send_event when
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [PATCH] hw/virtio-serial-bus: post_load send_event when vm is running |
Date: |
Sat, 17 Nov 2012 16:08:17 +0000 |
On Wed, Nov 14, 2012 at 1:09 PM, Alon Levy <address@hidden> wrote:
> Add a new timer based on vm_clock for 1 ns in the future from post_load
> to do the event send in case host_connected differs between migration
> source and target.
>
> RHBZ: 867366
>
> Signed-off-by: Alon Levy <address@hidden>
> ---
> hw/virtio-serial-bus.c | 54
> ++++++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 44 insertions(+), 10 deletions(-)
>
> diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
> index d20bd8b..efa8a81 100644
> --- a/hw/virtio-serial-bus.c
> +++ b/hw/virtio-serial-bus.c
> @@ -53,6 +53,15 @@ struct VirtIOSerial {
> uint32_t *ports_map;
>
> struct virtio_console_config config;
> +
> + struct {
Please add a name, for example PostLoad.
> + QEMUTimer *timer;
> + int nr_active_ports;
> + struct {
> + VirtIOSerialPort *port;
> + uint8_t host_connected;
> + } *connected;
> + } post_load;
> };
>
> static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id)
> @@ -626,6 +635,29 @@ static void virtio_serial_save(QEMUFile *f, void *opaque)
> }
> }
>
> +static void virtio_serial_post_load_timer_cb(void *opaque)
> +{
> + int i;
> + VirtIOSerial *s = opaque;
> + VirtIOSerialPort *port;
> + uint8_t host_connected;
> +
> + for (i = 0 ; i < s->post_load.nr_active_ports; ++i) {
> + port = s->post_load.connected[i].port;
> + host_connected = s->post_load.connected[i].host_connected;
> + if (host_connected != port->host_connected) {
> + /*
> + * We have to let the guest know of the host connection
> + * status change
> + */
> + send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN,
> + port->host_connected);
> + }
> + }
> + g_free(s->post_load.connected);
> + s->post_load.connected = NULL;
> +}
> +
> static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
> {
> VirtIOSerial *s = opaque;
> @@ -673,10 +705,13 @@ static int virtio_serial_load(QEMUFile *f, void
> *opaque, int version_id)
>
> qemu_get_be32s(f, &nr_active_ports);
>
> + 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++) {
> uint32_t id;
> - bool host_connected;
>
> id = qemu_get_be32(f);
> port = find_port_by_id(s, id);
> @@ -685,15 +720,8 @@ static int virtio_serial_load(QEMUFile *f, void *opaque,
> int version_id)
> }
>
> port->guest_connected = qemu_get_byte(f);
> - host_connected = qemu_get_byte(f);
> - if (host_connected != port->host_connected) {
> - /*
> - * We have to let the guest know of the host connection
> - * status change
> - */
> - send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN,
> - port->host_connected);
> - }
> + 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;
> @@ -718,6 +746,7 @@ static int virtio_serial_load(QEMUFile *f, void *opaque,
> int version_id)
> }
> }
> }
> + qemu_mod_timer(s->post_load.timer, 1);
> return 0;
> }
>
> @@ -967,6 +996,9 @@ VirtIODevice *virtio_serial_init(DeviceState *dev,
> virtio_serial_conf *conf)
> register_savevm(dev, "virtio-console", -1, 3, virtio_serial_save,
> virtio_serial_load, vser);
>
> + vser->post_load.timer = qemu_new_timer_ns(vm_clock,
> + virtio_serial_post_load_timer_cb, vser);
> +
> return vdev;
> }
>
> @@ -979,6 +1011,8 @@ void virtio_serial_exit(VirtIODevice *vdev)
> g_free(vser->ivqs);
> g_free(vser->ovqs);
> g_free(vser->ports_map);
> + g_free(vser->post_load.connected);
> + qemu_free_timer(vser->post_load.timer);
>
> virtio_cleanup(vdev);
> }
> --
> 1.8.0
>
>