qemu-devel
[Top][All Lists]
Advanced

[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
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]