2013-05-25 18:38:28 +00:00
|
|
|
From 1a888642291d5bc49c657c313e4bc01b59f47d2a Mon Sep 17 00:00:00 2001
|
2013-02-20 01:14:18 +00:00
|
|
|
From: Alon Levy <alevy@redhat.com>
|
|
|
|
Date: Fri, 16 Nov 2012 16:24:47 +0200
|
|
|
|
Subject: [PATCH] hw/virtio-serial-bus: replay guest open on destination
|
|
|
|
|
|
|
|
This is rewrite of a patch carried in Fedora previously based
|
|
|
|
on new code upstream, here is the original message, it still applies:
|
|
|
|
(the original fedora patch was commit id
|
|
|
|
a9bc20afc1f0604ee81c23b7c67d627e51d2e8d4, this is useful for grepping in
|
|
|
|
logs, it isn't in upstream)
|
|
|
|
|
|
|
|
When migrating a host with with a spice agent running the mouse becomes
|
|
|
|
non operational after the migration. This is rhbz #725965.
|
|
|
|
|
|
|
|
The problem is that after migration spice doesn't know the guest agent
|
|
|
|
is open. Spice is just a char dev here. And a chardev cannot query it's
|
|
|
|
device, the device has to let the chardev know when it is open. Right
|
|
|
|
now after migration the chardev which is recreated is in it's default
|
|
|
|
state, which assumes the guest is disconnected.
|
|
|
|
|
|
|
|
Char devices carry no information across migration, but the
|
|
|
|
virtio-serial does already carry the guest_connected state. This patch
|
|
|
|
passes that bit to the chardev.
|
|
|
|
---
|
|
|
|
hw/virtio-serial-bus.c | 6 ++++++
|
|
|
|
1 file changed, 6 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
|
|
|
|
index aa7d0d7..5078129 100644
|
|
|
|
--- a/hw/virtio-serial-bus.c
|
|
|
|
+++ b/hw/virtio-serial-bus.c
|
|
|
|
@@ -642,6 +642,7 @@ static void virtio_serial_post_load_timer_cb(void *opaque)
|
|
|
|
VirtIOSerial *s = opaque;
|
|
|
|
VirtIOSerialPort *port;
|
|
|
|
uint8_t host_connected;
|
|
|
|
+ VirtIOSerialPortClass *vsc;
|
|
|
|
|
|
|
|
if (!s->post_load) {
|
|
|
|
return;
|
|
|
|
@@ -657,6 +658,11 @@ static void virtio_serial_post_load_timer_cb(void *opaque)
|
|
|
|
send_control_event(s, port->id, VIRTIO_CONSOLE_PORT_OPEN,
|
|
|
|
port->host_connected);
|
|
|
|
}
|
|
|
|
+ vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
|
|
|
|
+ if (port->guest_connected && vsc->guest_open) {
|
|
|
|
+ /* replay guest open */
|
|
|
|
+ vsc->guest_open(port);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
g_free(s->post_load->connected);
|
|
|
|
qemu_free_timer(s->post_load->timer);
|