mirror of https://github.com/xemu-project/xemu.git
virtio-console: chardev hotswap support
In case of a backend change, the handler functions and the watch have to be reset. Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <1499342940-56739-12-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
75b601602b
commit
af50855c25
|
@ -163,6 +163,30 @@ static void chr_event(void *opaque, int event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int chr_be_change(void *opaque)
|
||||||
|
{
|
||||||
|
VirtConsole *vcon = opaque;
|
||||||
|
VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(vcon);
|
||||||
|
VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
|
||||||
|
|
||||||
|
if (k->is_console) {
|
||||||
|
qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
|
||||||
|
NULL, chr_be_change, vcon, NULL, true);
|
||||||
|
} else {
|
||||||
|
qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
|
||||||
|
chr_event, chr_be_change, vcon, NULL, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vcon->watch) {
|
||||||
|
g_source_remove(vcon->watch);
|
||||||
|
vcon->watch = qemu_chr_fe_add_watch(&vcon->chr,
|
||||||
|
G_IO_OUT | G_IO_HUP,
|
||||||
|
chr_write_unblocked, vcon);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void virtconsole_realize(DeviceState *dev, Error **errp)
|
static void virtconsole_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
|
VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
|
||||||
|
@ -187,11 +211,13 @@ static void virtconsole_realize(DeviceState *dev, Error **errp)
|
||||||
*/
|
*/
|
||||||
if (k->is_console) {
|
if (k->is_console) {
|
||||||
qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
|
qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
|
||||||
NULL, NULL, vcon, NULL, true);
|
NULL, chr_be_change,
|
||||||
|
vcon, NULL, true);
|
||||||
virtio_serial_open(port);
|
virtio_serial_open(port);
|
||||||
} else {
|
} else {
|
||||||
qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
|
qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
|
||||||
chr_event, NULL, vcon, NULL, false);
|
chr_event, chr_be_change,
|
||||||
|
vcon, NULL, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue