Virtio-serial fixes
1. Post migration inject interrupt to a running vm to workaround a bug in kvm irqchip emulation (pending upstream acceptance) 2. Redo fedora only fix for #725965 (replay guest open after migration) based on the above fix.
This commit is contained in:
parent
156e0fb737
commit
d195bae2d0
@ -1,51 +0,0 @@
|
|||||||
From a9bc20afc1f0604ee81c23b7c67d627e51d2e8d4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alon Levy <alevy@redhat.com>
|
|
||||||
Date: Thu, 28 Jul 2011 15:08:48 +0300
|
|
||||||
Subject: [PATCH] virtio-serial-bus: replay guest_open on migration
|
|
||||||
|
|
||||||
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>
|
|
||||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
|
||||||
---
|
|
||||||
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 82073f5..18c2ed3 100644
|
|
||||||
--- a/hw/virtio-serial-bus.c
|
|
||||||
+++ b/hw/virtio-serial-bus.c
|
|
||||||
@@ -682,6 +682,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;
|
|
||||||
+ VirtIOSerialPortClass *vsc;
|
|
||||||
|
|
||||||
id = qemu_get_be32(f);
|
|
||||||
port = find_port_by_id(s, id);
|
|
||||||
@@ -690,6 +691,11 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
port->guest_connected = qemu_get_byte(f);
|
|
||||||
+ vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
|
|
||||||
+ if (port->guest_connected && vsc->guest_open) {
|
|
||||||
+ /* replay guest open */
|
|
||||||
+ vsc->guest_open(port);
|
|
||||||
+ }
|
|
||||||
host_connected = qemu_get_byte(f);
|
|
||||||
if (host_connected != port->host_connected) {
|
|
||||||
/*
|
|
||||||
--
|
|
||||||
1.7.12.1
|
|
||||||
|
|
130
0413-hw-virtio-serial-bus-post_load-send_event-when-vm-is.patch
Normal file
130
0413-hw-virtio-serial-bus-post_load-send_event-when-vm-is.patch
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
From 9903053345528aa8eebb16365b2ece77c58c0cf6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alon Levy <alevy@redhat.com>
|
||||||
|
Date: Wed, 14 Nov 2012 15:06:35 +0200
|
||||||
|
Subject: [PATCH 1/2] hw/virtio-serial-bus: post_load send_event when vm is
|
||||||
|
running
|
||||||
|
|
||||||
|
Add a new timer based on vm_clock for 1 ns in the future from post_load
|
||||||
|
to do the event send in case host_connected differs between migration
|
||||||
|
source and target.
|
||||||
|
|
||||||
|
RHBZ: 867366
|
||||||
|
|
||||||
|
Signed-off-by: Alon Levy <alevy@redhat.com>
|
||||||
|
---
|
||||||
|
hw/virtio-serial-bus.c | 54 ++++++++++++++++++++++++++++++++++++++++----------
|
||||||
|
1 file changed, 44 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
|
||||||
|
index d20bd8b..a028877 100644
|
||||||
|
--- a/hw/virtio-serial-bus.c
|
||||||
|
+++ b/hw/virtio-serial-bus.c
|
||||||
|
@@ -53,6 +53,15 @@ struct VirtIOSerial {
|
||||||
|
uint32_t *ports_map;
|
||||||
|
|
||||||
|
struct virtio_console_config config;
|
||||||
|
+
|
||||||
|
+ struct VirtIOSerialPostLoad {
|
||||||
|
+ QEMUTimer *timer;
|
||||||
|
+ int nr_active_ports;
|
||||||
|
+ struct VirtIOSerialPostLoadPort {
|
||||||
|
+ VirtIOSerialPort *port;
|
||||||
|
+ uint8_t host_connected;
|
||||||
|
+ } *connected;
|
||||||
|
+ } post_load;
|
||||||
|
};
|
||||||
|
|
||||||
|
static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id)
|
||||||
|
@@ -626,6 +635,29 @@ static void virtio_serial_save(QEMUFile *f, void *opaque)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void virtio_serial_post_load_timer_cb(void *opaque)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ VirtIOSerial *s = opaque;
|
||||||
|
+ VirtIOSerialPort *port;
|
||||||
|
+ uint8_t host_connected;
|
||||||
|
+
|
||||||
|
+ for (i = 0 ; i < s->post_load.nr_active_ports; ++i) {
|
||||||
|
+ port = s->post_load.connected[i].port;
|
||||||
|
+ host_connected = s->post_load.connected[i].host_connected;
|
||||||
|
+ if (host_connected != port->host_connected) {
|
||||||
|
+ /*
|
||||||
|
+ * We have to let the guest know of the host connection
|
||||||
|
+ * status change
|
||||||
|
+ */
|
||||||
|
+ send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN,
|
||||||
|
+ port->host_connected);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ g_free(s->post_load.connected);
|
||||||
|
+ s->post_load.connected = NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
||||||
|
{
|
||||||
|
VirtIOSerial *s = opaque;
|
||||||
|
@@ -673,10 +705,13 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
||||||
|
|
||||||
|
qemu_get_be32s(f, &nr_active_ports);
|
||||||
|
|
||||||
|
+ s->post_load.nr_active_ports = nr_active_ports;
|
||||||
|
+ s->post_load.connected =
|
||||||
|
+ g_malloc0(sizeof(*s->post_load.connected) * nr_active_ports);
|
||||||
|
+
|
||||||
|
/* Items in struct VirtIOSerialPort */
|
||||||
|
for (i = 0; i < nr_active_ports; i++) {
|
||||||
|
uint32_t id;
|
||||||
|
- bool host_connected;
|
||||||
|
|
||||||
|
id = qemu_get_be32(f);
|
||||||
|
port = find_port_by_id(s, id);
|
||||||
|
@@ -685,15 +720,8 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
||||||
|
}
|
||||||
|
|
||||||
|
port->guest_connected = qemu_get_byte(f);
|
||||||
|
- host_connected = qemu_get_byte(f);
|
||||||
|
- if (host_connected != port->host_connected) {
|
||||||
|
- /*
|
||||||
|
- * We have to let the guest know of the host connection
|
||||||
|
- * status change
|
||||||
|
- */
|
||||||
|
- send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN,
|
||||||
|
- port->host_connected);
|
||||||
|
- }
|
||||||
|
+ s->post_load.connected[i].port = port;
|
||||||
|
+ s->post_load.connected[i].host_connected = qemu_get_byte(f);
|
||||||
|
|
||||||
|
if (version_id > 2) {
|
||||||
|
uint32_t elem_popped;
|
||||||
|
@@ -718,6 +746,7 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ qemu_mod_timer(s->post_load.timer, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -967,6 +996,9 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf)
|
||||||
|
register_savevm(dev, "virtio-console", -1, 3, virtio_serial_save,
|
||||||
|
virtio_serial_load, vser);
|
||||||
|
|
||||||
|
+ vser->post_load.timer = qemu_new_timer_ns(vm_clock,
|
||||||
|
+ virtio_serial_post_load_timer_cb, vser);
|
||||||
|
+
|
||||||
|
return vdev;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -979,6 +1011,8 @@ void virtio_serial_exit(VirtIODevice *vdev)
|
||||||
|
g_free(vser->ivqs);
|
||||||
|
g_free(vser->ovqs);
|
||||||
|
g_free(vser->ports_map);
|
||||||
|
+ g_free(vser->post_load.connected);
|
||||||
|
+ qemu_free_timer(vser->post_load.timer);
|
||||||
|
|
||||||
|
virtio_cleanup(vdev);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.8.0
|
||||||
|
|
@ -0,0 +1,54 @@
|
|||||||
|
From 5b6831175b21aa5a3405a21dd79e1ef0a81bbdb3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alon Levy <alevy@redhat.com>
|
||||||
|
Date: Fri, 16 Nov 2012 16:24:47 +0200
|
||||||
|
Subject: [PATCH 2/2] 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 a028877..a6ec2df 100644
|
||||||
|
--- a/hw/virtio-serial-bus.c
|
||||||
|
+++ b/hw/virtio-serial-bus.c
|
||||||
|
@@ -641,6 +641,7 @@ static void virtio_serial_post_load_timer_cb(void *opaque)
|
||||||
|
VirtIOSerial *s = opaque;
|
||||||
|
VirtIOSerialPort *port;
|
||||||
|
uint8_t host_connected;
|
||||||
|
+ VirtIOSerialPortClass *vsc;
|
||||||
|
|
||||||
|
for (i = 0 ; i < s->post_load.nr_active_ports; ++i) {
|
||||||
|
port = s->post_load.connected[i].port;
|
||||||
|
@@ -653,6 +654,11 @@ static void virtio_serial_post_load_timer_cb(void *opaque)
|
||||||
|
send_control_event(port, 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);
|
||||||
|
s->post_load.connected = NULL;
|
||||||
|
--
|
||||||
|
1.8.0
|
||||||
|
|
17
qemu.spec
17
qemu.spec
@ -109,7 +109,7 @@
|
|||||||
Summary: QEMU is a FAST! processor emulator
|
Summary: QEMU is a FAST! processor emulator
|
||||||
Name: qemu
|
Name: qemu
|
||||||
Version: 1.2.0
|
Version: 1.2.0
|
||||||
Release: 22%{?dist}
|
Release: 23%{?dist}
|
||||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||||
Epoch: 2
|
Epoch: 2
|
||||||
License: GPLv2+ and LGPLv2+ and BSD
|
License: GPLv2+ and LGPLv2+ and BSD
|
||||||
@ -406,8 +406,11 @@ Patch0407: 0407-virtio-console-Enable-port-throttling-when-chardev-i.patch
|
|||||||
Patch0408: 0408-spice-qemu-char.c-add-throttling.patch
|
Patch0408: 0408-spice-qemu-char.c-add-throttling.patch
|
||||||
Patch0409: 0409-spice-qemu-char.c-remove-intermediate-buffer.patch
|
Patch0409: 0409-spice-qemu-char.c-remove-intermediate-buffer.patch
|
||||||
Patch0410: 0410-usb-redir-Add-flow-control-support.patch
|
Patch0410: 0410-usb-redir-Add-flow-control-support.patch
|
||||||
Patch0411: 0411-virtio-serial-bus-replay-guest_open-on-migration.patch
|
# 411 superceded by 414 which does the same thing but on top of 413 that is
|
||||||
|
# going upstream.
|
||||||
Patch0412: 0412-char-Disable-write-callback-if-throttled-chardev-is-.patch
|
Patch0412: 0412-char-Disable-write-callback-if-throttled-chardev-is-.patch
|
||||||
|
Patch0413: 0413-hw-virtio-serial-bus-post_load-send_event-when-vm-is.patch
|
||||||
|
Patch0414: 0414-hw-virtio-serial-bus-replay-guest-open-on-destinatio.patch
|
||||||
|
|
||||||
# Spice features from upstream master: seamless migration & dynamic monitors
|
# Spice features from upstream master: seamless migration & dynamic monitors
|
||||||
Patch0500: 0500-qxl-disallow-unknown-revisions.patch
|
Patch0500: 0500-qxl-disallow-unknown-revisions.patch
|
||||||
@ -482,7 +485,6 @@ Patch804: 0804-wip-hw-qxl-inject-interrupts-in-any-state.patch
|
|||||||
# 38f419f (configure: Fix CONFIG_QEMU_HELPERDIR generation, 2012-10-17)
|
# 38f419f (configure: Fix CONFIG_QEMU_HELPERDIR generation, 2012-10-17)
|
||||||
Patch805: 0805-configure-Fix-CONFIG_QEMU_HELPERDIR-generation.patch
|
Patch805: 0805-configure-Fix-CONFIG_QEMU_HELPERDIR-generation.patch
|
||||||
|
|
||||||
|
|
||||||
BuildRequires: SDL-devel
|
BuildRequires: SDL-devel
|
||||||
BuildRequires: zlib-devel
|
BuildRequires: zlib-devel
|
||||||
BuildRequires: which
|
BuildRequires: which
|
||||||
@ -1157,8 +1159,10 @@ such as kvm_stat.
|
|||||||
%patch0408 -p1
|
%patch0408 -p1
|
||||||
%patch0409 -p1
|
%patch0409 -p1
|
||||||
%patch0410 -p1
|
%patch0410 -p1
|
||||||
%patch0411 -p1
|
# 411 superceded by 414
|
||||||
%patch0412 -p1
|
%patch0412 -p1
|
||||||
|
%patch0413 -p1
|
||||||
|
%patch0414 -p1
|
||||||
|
|
||||||
%patch0500 -p1
|
%patch0500 -p1
|
||||||
%patch0501 -p1
|
%patch0501 -p1
|
||||||
@ -1223,7 +1227,6 @@ such as kvm_stat.
|
|||||||
%patch804 -p1
|
%patch804 -p1
|
||||||
%patch805 -p1
|
%patch805 -p1
|
||||||
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%if %{with kvmonly}
|
%if %{with kvmonly}
|
||||||
buildarch="%{kvm_target}-softmmu"
|
buildarch="%{kvm_target}-softmmu"
|
||||||
@ -1819,6 +1822,10 @@ fi
|
|||||||
%{_mandir}/man1/qemu-img.1*
|
%{_mandir}/man1/qemu-img.1*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Nov 17 2012 Alon Levy <alevy@redhat.com> - 2:1.2.0-23
|
||||||
|
- Rewrite fix for bz #725965 based on fix for bz #867366
|
||||||
|
- Resolve bz #867366
|
||||||
|
|
||||||
* Fri Nov 16 2012 Paolo Bonzini <pbonzini@redhat.com> - 2:1.2.0-22
|
* Fri Nov 16 2012 Paolo Bonzini <pbonzini@redhat.com> - 2:1.2.0-22
|
||||||
- Fix previous commit
|
- Fix previous commit
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user