[libvirt] [PATCH v2 3/5] Implement VIR_CONNECT_BASELINE_CPU_MIGRATABLE in the x86 cpu driver

Ján Tomko jtomko at redhat.com
Thu Feb 19 15:22:38 UTC 2015


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




More information about the libvir-list mailing list