Skip to content

Commit 9a709f0

Browse files
olafheringbonzini
authored andcommitted
piix: fix xenfv regression, add compat machine xenfv-4.2
With QEMU 4.0 an incompatible change was added to pc_piix, which makes it practical impossible to migrate domUs started with qemu2 or qemu3 to newer qemu versions. Commit 7fccf2a added and enabled a new member "smbus_no_migration_support". In commit 4ab2f2a the vmstate_acpi got new elements, which are conditionally filled. As a result, an incoming migration expected smbus related data unless smbus migration was disabled for a given MachineClass. Since first commit forgot to handle 'xenfv', domUs started with QEMU 4.x are incompatible with their QEMU siblings. Using other existing machine types, such as 'pc-i440fx-3.1', is not possible because 'xenfv' creates the 'xen-platform' PCI device at 00:02.0, while all other variants to run a domU would create it at 00:04.0. To cover both the existing and the broken case of 'xenfv' in a single qemu binary, a new compatibility variant of 'xenfv-4.2' must be added which targets domUs started with qemu 4.2. The existing 'xenfv' restores compatibility of QEMU 5.x with qemu 3.1. Host admins who started domUs with QEMU 4.x (preferrable QEMU 4.2) have to use a wrapper script which appends '-machine xenfv-4.2' to the device-model command line. This is only required if there is no maintenance window which allows to temporary shutdown the domU and restart it with a fixed device-model. The wrapper script is as simple as this: #!/bin/sh exec /usr/bin/qemu-system-i386 "$@" -machine xenfv-4.2 With xl this script will be enabled with device_model_override=, see xl.cfg(5). To live migrate a domU, adjust the existing domU.cfg and pass it to xl migrate or xl save/restore: xl migrate -C new-domU.cfg domU remote-host xl save domU CheckpointFile new-domU.cfg xl restore new-domU.cfg CheckpointFile With libvirt this script will be enabled with the <emulator> element in domU.xml. Use 'virsh edit' prior 'virsh migrate' to replace the existing <emulator> element to point it to the wrapper script. Signed-off-by: Olaf Hering <[email protected]> Message-Id: <[email protected]> [Adjust tests for blacklisted machine types, simplifying the one in qom-test. - Paolo] Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 53ef8a9 commit 9a709f0

File tree

4 files changed

+26
-39
lines changed

4 files changed

+26
-39
lines changed

hw/i386/pc_piix.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -948,13 +948,26 @@ DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
948948

949949

950950
#ifdef CONFIG_XEN
951-
static void xenfv_machine_options(MachineClass *m)
951+
static void xenfv_4_2_machine_options(MachineClass *m)
952952
{
953+
pc_i440fx_4_2_machine_options(m);
954+
m->desc = "Xen Fully-virtualized PC";
955+
m->max_cpus = HVM_MAX_VCPUS;
956+
m->default_machine_opts = "accel=xen";
957+
}
958+
959+
DEFINE_PC_MACHINE(xenfv_4_2, "xenfv-4.2", pc_xen_hvm_init,
960+
xenfv_4_2_machine_options);
961+
962+
static void xenfv_3_1_machine_options(MachineClass *m)
963+
{
964+
pc_i440fx_3_1_machine_options(m);
953965
m->desc = "Xen Fully-virtualized PC";
966+
m->alias = "xenfv";
954967
m->max_cpus = HVM_MAX_VCPUS;
955968
m->default_machine_opts = "accel=xen";
956969
}
957970

958-
DEFINE_PC_MACHINE(xenfv, "xenfv", pc_xen_hvm_init,
959-
xenfv_machine_options);
971+
DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init,
972+
xenfv_3_1_machine_options);
960973
#endif

tests/qtest/device-introspect-test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ static void add_machine_test_case(const char *mname)
288288
char *path, *args;
289289

290290
/* Ignore blacklisted machines */
291-
if (g_str_equal("xenfv", mname) || g_str_equal("xenpv", mname)) {
291+
if (!memcmp("xenfv", mname, 5) || g_str_equal("xenpv", mname)) {
292292
return;
293293
}
294294

tests/qtest/qom-test.c

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,6 @@
1515
#include "qemu/cutils.h"
1616
#include "libqtest.h"
1717

18-
static const char *blacklist_x86[] = {
19-
"xenfv", "xenpv", NULL
20-
};
21-
22-
static const struct {
23-
const char *arch;
24-
const char **machine;
25-
} blacklists[] = {
26-
{ "i386", blacklist_x86 },
27-
{ "x86_64", blacklist_x86 },
28-
};
29-
30-
static bool is_blacklisted(const char *arch, const char *mach)
31-
{
32-
int i;
33-
const char **p;
34-
35-
for (i = 0; i < ARRAY_SIZE(blacklists); i++) {
36-
if (!strcmp(blacklists[i].arch, arch)) {
37-
for (p = blacklists[i].machine; *p; p++) {
38-
if (!strcmp(*p, mach)) {
39-
return true;
40-
}
41-
}
42-
}
43-
}
44-
return false;
45-
}
46-
4718
static void test_properties(QTestState *qts, const char *path, bool recurse)
4819
{
4920
char *child_path;
@@ -108,13 +79,16 @@ static void test_machine(gconstpointer data)
10879

10980
static void add_machine_test_case(const char *mname)
11081
{
111-
const char *arch = qtest_get_arch();
82+
char *path;
11283

113-
if (!is_blacklisted(arch, mname)) {
114-
char *path = g_strdup_printf("qom/%s", mname);
115-
qtest_add_data_func(path, g_strdup(mname), test_machine);
116-
g_free(path);
84+
/* Ignore blacklisted machines that have known problems */
85+
if (!memcmp("xenfv", mname, 5) || g_str_equal("xenpv", mname)) {
86+
return;
11787
}
88+
89+
path = g_strdup_printf("qom/%s", mname);
90+
qtest_add_data_func(path, g_strdup(mname), test_machine);
91+
g_free(path);
11892
}
11993

12094
int main(int argc, char **argv)

tests/qtest/test-hmp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ static void add_machine_test_case(const char *mname)
143143
char *path;
144144

145145
/* Ignore blacklisted machines that have known problems */
146-
if (!strcmp("xenfv", mname) || !strcmp("xenpv", mname)) {
146+
if (!memcmp("xenfv", mname, 5) || g_str_equal("xenpv", mname)) {
147147
return;
148148
}
149149

0 commit comments

Comments
 (0)