2011-08-14 19:24:40 +00:00
|
|
|
>From ab57ac80b3e681a61ed34c84c36df673e6f9be33 Mon Sep 17 00:00:00 2001
|
2011-08-04 19:07:48 +00:00
|
|
|
From: Alon Levy <alevy@redhat.com>
|
|
|
|
Date: Thu, 28 Jul 2011 15:08:48 +0300
|
2011-08-14 19:24:40 +00:00
|
|
|
Subject: [PATCH 23/28] virtio-serial-bus: replay guest_open on migration
|
2011-08-04 19:07:48 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
Signed-off-by: Alon Levy <alevy@redhat.com>
|
|
|
|
---
|
|
|
|
hw/virtio-serial-bus.c | 6 ++++++
|
|
|
|
1 files changed, 6 insertions(+), 0 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
|
|
|
|
index c5eb931..4a6d932 100644
|
|
|
|
--- a/hw/virtio-serial-bus.c
|
|
|
|
+++ b/hw/virtio-serial-bus.c
|
|
|
|
@@ -618,6 +618,7 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
|
|
|
for (i = 0; i < nr_active_ports; i++) {
|
|
|
|
uint32_t id;
|
|
|
|
bool host_connected;
|
|
|
|
+ VirtIOSerialPortInfo *info;
|
|
|
|
|
|
|
|
id = qemu_get_be32(f);
|
|
|
|
port = find_port_by_id(s, id);
|
|
|
|
@@ -626,6 +627,11 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
|
|
|
}
|
|
|
|
|
|
|
|
port->guest_connected = qemu_get_byte(f);
|
|
|
|
+ info = DO_UPCAST(VirtIOSerialPortInfo, qdev, port->dev.info);
|
|
|
|
+ if (port->guest_connected && info->guest_open) {
|
|
|
|
+ /* replay guest open */
|
|
|
|
+ info->guest_open(port);
|
|
|
|
+ }
|
|
|
|
host_connected = qemu_get_byte(f);
|
|
|
|
if (host_connected != port->host_connected) {
|
|
|
|
/*
|
|
|
|
--
|
|
|
|
1.7.5.1
|
|
|
|
|