summaryrefslogtreecommitdiffstats
path: root/hw/char/virtio-console.c
diff options
context:
space:
mode:
authorPavel Butsykin2017-09-19 14:07:33 +0200
committerPaolo Bonzini2017-09-21 11:51:49 +0200
commit55289fb036481396466d7825fa01d829c891108c (patch)
tree3a3913a0815b31982f08562fd1fefb3a4b01b509 /hw/char/virtio-console.c
parentMerge remote-tracking branch 'remotes/gkurz/tags/for-upstream' into staging (diff)
downloadqemu-55289fb036481396466d7825fa01d829c891108c.tar.gz
qemu-55289fb036481396466d7825fa01d829c891108c.tar.xz
qemu-55289fb036481396466d7825fa01d829c891108c.zip
virtio-serial: add enable_backend callback
We should guarantee that RAM will not be modified while VM has a stopped state, otherwise it can lead to negative consequences during post-copy migration. In RUN_STATE_FINISH_MIGRATE step, it's expected that RAM on source side will not be modified as this could lead to non-consistent vm state on the destination side. Also RAM access during postcopy-ram migration with enabled release-ram capability can lead to sad consequences. Let's add enable_backend() callback to avoid undesirable virtioqueue changes in the guest memory. Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com> Message-Id: <20170919120733.22020-1-pbutsykin@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hw/char/virtio-console.c')
-rw-r--r--hw/char/virtio-console.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
index 198b2a89c0..172c72d06c 100644
--- a/hw/char/virtio-console.c
+++ b/hw/char/virtio-console.c
@@ -187,6 +187,26 @@ static int chr_be_change(void *opaque)
return 0;
}
+static void virtconsole_enable_backend(VirtIOSerialPort *port, bool enable)
+{
+ VirtConsole *vcon = VIRTIO_CONSOLE(port);
+
+ if (!qemu_chr_fe_backend_connected(&vcon->chr)) {
+ return;
+ }
+
+ if (enable) {
+ VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
+
+ qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
+ k->is_console ? NULL : chr_event,
+ chr_be_change, vcon, NULL, false);
+ } else {
+ qemu_chr_fe_set_handlers(&vcon->chr, NULL, NULL, NULL,
+ NULL, NULL, NULL, false);
+ }
+}
+
static void virtconsole_realize(DeviceState *dev, Error **errp)
{
VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
@@ -258,6 +278,7 @@ static void virtserialport_class_init(ObjectClass *klass, void *data)
k->unrealize = virtconsole_unrealize;
k->have_data = flush_buf;
k->set_guest_connected = set_guest_connected;
+ k->enable_backend = virtconsole_enable_backend;
k->guest_writable = guest_writable;
dc->props = virtserialport_properties;
}