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)
|
||||
{
|
||||
VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
|
||||
@ -187,11 +211,13 @@ static void virtconsole_realize(DeviceState *dev, Error **errp)
|
||||
*/
|
||||
if (k->is_console) {
|
||||
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);
|
||||
} else {
|
||||
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
Block a user