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