[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: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH] hw/virtio-serial-bus: post_load send_event when vm is running |
Date: |
Sun, 18 Nov 2012 11:29:25 -0500 (EST) |
> > struct virtio_console_config config;
> > +
> > + struct {
>
> Please add a name, for example PostLoad.
Why? This is not C++ and the namespace would be global. It's just to
have a nice grouping.
Paolo
> > + 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
> >
> >
>