Filter out non-migratable features if VIR_CONNECT_BASELINE_CPU_MIGRATABLE was specified. --- v2: use the existing migrate_blocker field This removes the need for patch 1/5. src/bhyve/bhyve_driver.c | 3 +- src/cpu/cpu_x86.c | 25 +++++++++++++++-- src/qemu/qemu_driver.c | 3 +- tests/cputest.c | 6 ++++ tests/cputestdata/x86-baseline-6-migratable.xml | 10 +++++++ tests/cputestdata/x86-baseline-6-result.xml | 11 ++++++++ tests/cputestdata/x86-baseline-6.xml | 37 +++++++++++++++++++++++++ 7 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 tests/cputestdata/x86-baseline-6-migratable.xml create mode 100644 tests/cputestdata/x86-baseline-6-result.xml create mode 100644 tests/cputestdata/x86-baseline-6.xml diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index ae39917..2817f8e 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1340,7 +1340,8 @@ bhyveConnectBaselineCPU(virConnectPtr conn, { char *cpu = NULL; - virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, NULL); + virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES | + VIR_CONNECT_BASELINE_CPU_MIGRATABLE, NULL); if (virConnectBaselineCPUEnsureACL(conn) < 0) goto cleanup; diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 45be262..2a568aa 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -1556,7 +1556,8 @@ x86Decode(virCPUDefPtr cpu, const virCPUx86Data *cpuData = NULL; size_t i; - virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, -1); + virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES | + VIR_CONNECT_BASELINE_CPU_MIGRATABLE, -1); if (!data || !(map = virCPUx86GetMap())) return -1; @@ -1633,6 +1634,21 @@ x86Decode(virCPUDefPtr cpu, goto out; } + /* Remove non-migratable features by default + * Note: this only works as long as no CPU model contains non-migratable + * features directly */ + if (flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE) { + for (i = 0; i < cpuModel->nfeatures; i++) { + const struct x86_feature *feat; + for (feat = map->migrate_blockers; feat; feat = feat->next) { + if (STREQ(feat->name, cpuModel->features[i].name)) { + VIR_FREE(cpuModel->features[i].name); + VIR_DELETE_ELEMENT_INPLACE(cpuModel->features, i, cpuModel->nfeatures); + } + } + } + } + if (flags & VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES) { if (!(copy = x86DataCopy(cpuData)) || !(features = x86DataFromCPUFeatures(cpuModel, map))) @@ -1915,6 +1931,9 @@ x86Baseline(virCPUDefPtr *cpus, const char *modelName; bool matchingNames = true; + virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES | + VIR_CONNECT_BASELINE_CPU_MIGRATABLE, NULL); + if (!(map = virCPUx86GetMap())) goto error; @@ -1996,7 +2015,9 @@ x86Baseline(virCPUDefPtr *cpus, if (vendor && virCPUx86DataAddCPUID(base_model->data, &vendor->cpuid) < 0) goto error; - if (x86Decode(cpu, base_model->data, models, nmodels, modelName, flags) < 0) + if (x86Decode(cpu, base_model->data, models, nmodels, modelName, + flags & (VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES | + VIR_CONNECT_BASELINE_CPU_MIGRATABLE)) < 0) goto error; if (STREQ_NULLABLE(cpu->model, modelName)) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8f0cf2b..8d765d9 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12416,7 +12416,8 @@ qemuConnectBaselineCPU(virConnectPtr conn ATTRIBUTE_UNUSED, { char *cpu = NULL; - virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, NULL); + virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES | + VIR_CONNECT_BASELINE_CPU_MIGRATABLE, NULL); if (virConnectBaselineCPUEnsureACL(conn) < 0) goto cleanup; diff --git a/tests/cputest.c b/tests/cputest.c index e49ae24..ab3efdf 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -346,6 +346,8 @@ cpuTestBaseline(const void *arg) if (data->flags & VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES) suffix = "expanded"; + else if (data->flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE) + suffix = "migratable"; else suffix = "result"; if (virAsprintf(&result, "%s-%s", data->name, suffix) < 0) @@ -533,6 +535,8 @@ mymain(void) char *label; \ if ((flags) & VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES) \ suffix = " (expanded)"; \ + if ((flags) & VIR_CONNECT_BASELINE_CPU_MIGRATABLE) \ + suffix = " (migratable)"; \ if (virAsprintf(&label, "%s%s", name, suffix) < 0) { \ ret = -1; \ } else { \ @@ -612,6 +616,8 @@ mymain(void) DO_TEST_BASELINE("x86", "4", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0); DO_TEST_BASELINE("x86", "5", 0, 0); DO_TEST_BASELINE("x86", "5", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0); + DO_TEST_BASELINE("x86", "6", 0, 0); + DO_TEST_BASELINE("x86", "6", VIR_CONNECT_BASELINE_CPU_MIGRATABLE, 0); DO_TEST_BASELINE("ppc64", "incompatible-vendors", 0, -1); DO_TEST_BASELINE("ppc64", "no-vendor", 0, 0); diff --git a/tests/cputestdata/x86-baseline-6-migratable.xml b/tests/cputestdata/x86-baseline-6-migratable.xml new file mode 100644 index 0000000..3c2f38c --- /dev/null +++ b/tests/cputestdata/x86-baseline-6-migratable.xml @@ -0,0 +1,10 @@ +<cpu mode='custom' match='exact'> + <model fallback='allow'>SandyBridge</model> + <vendor>Intel</vendor> + <feature policy='require' name='hypervisor'/> + <feature policy='require' name='osxsave'/> + <feature policy='require' name='pcid'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='vme'/> + <feature policy='disable' name='rdtscp'/> +</cpu> diff --git a/tests/cputestdata/x86-baseline-6-result.xml b/tests/cputestdata/x86-baseline-6-result.xml new file mode 100644 index 0000000..bea0beb --- /dev/null +++ b/tests/cputestdata/x86-baseline-6-result.xml @@ -0,0 +1,11 @@ +<cpu mode='custom' match='exact'> + <model fallback='allow'>SandyBridge</model> + <vendor>Intel</vendor> + <feature policy='require' name='invtsc'/> + <feature policy='require' name='hypervisor'/> + <feature policy='require' name='osxsave'/> + <feature policy='require' name='pcid'/> + <feature policy='require' name='ss'/> + <feature policy='require' name='vme'/> + <feature policy='disable' name='rdtscp'/> +</cpu> diff --git a/tests/cputestdata/x86-baseline-6.xml b/tests/cputestdata/x86-baseline-6.xml new file mode 100644 index 0000000..9845b93 --- /dev/null +++ b/tests/cputestdata/x86-baseline-6.xml @@ -0,0 +1,37 @@ +<cpuTest> +<cpu> + <arch>x86_64</arch> + <model>Westmere</model> + <vendor>Intel</vendor> + <topology sockets='4' cores='1' threads='1'/> + <feature name='hypervisor'/> + <feature name='avx'/> + <feature name='osxsave'/> + <feature name='xsave'/> + <feature name='tsc-deadline'/> + <feature name='x2apic'/> + <feature name='pcid'/> + <feature name='pclmuldq'/> + <feature name='ss'/> + <feature name='vme'/> + <feature name='invtsc'/> +</cpu> +<cpu> + <arch>x86_64</arch> + <model>Nehalem</model> + <vendor>Intel</vendor> + <topology sockets='4' cores='1' threads='1'/> + <feature name='aes'/> + <feature name='hypervisor'/> + <feature name='avx'/> + <feature name='osxsave'/> + <feature name='xsave'/> + <feature name='tsc-deadline'/> + <feature name='x2apic'/> + <feature name='pcid'/> + <feature name='pclmuldq'/> + <feature name='ss'/> + <feature name='vme'/> + <feature name='invtsc'/> +</cpu> +</cpuTest> -- 2.0.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list