On Mon, Jul 15, 2013 at 18:24:47 +0200, Peter Krempa wrote:
https://bugzilla.redhat.com/show_bug.cgi?id=799354
Until now, the "host-model" cpu mode couldn't be influenced. This patch
allows to use the <feature> elements to either enable or disable
specific CPU flags. This can be used to force flags that can be emulated
even if the host CPU doesn't support them.
...
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 928a67b..ec99106 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -1739,6 +1739,41 @@ cleanup:
return ret;
}
+
+static int
+x86UpdateHostModel(virCPUDefPtr guest,
+ const virCPUDefPtr host)
+{
+ virCPUDefPtr oldguest;
+ size_t i;
+
+ guest->match = VIR_CPU_MATCH_EXACT;
+
+ /* no updates are required */
+ if (guest->nfeatures == 0) {
+ virCPUDefFreeModel(guest);
+ return virCPUDefCopyModel(guest, host, true);
+ }
+
+ /* update the host model according to the desired configuration */
+ if (!(oldguest = virCPUDefCopy(guest)))
+ return -1;
+
+ virCPUDefFreeModel(guest);
+ if (virCPUDefCopyModel(guest, host, true) < 0)
+ return -1;
+
+ for (i = 0; i < oldguest->nfeatures; i++) {
+ if (virCPUDefUpdateFeature(guest,
+ oldguest->features[i].name,
+ oldguest->features[i].policy) < 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+
static int
x86Update(virCPUDefPtr guest,
const virCPUDefPtr host)
@@ -1748,11 +1783,11 @@ x86Update(virCPUDefPtr guest,
return x86UpdateCustom(guest, host);
case VIR_CPU_MODE_HOST_MODEL:
+ return x86UpdateHostModel(guest, host);
+
+
Too many empty lines :-)
case VIR_CPU_MODE_HOST_PASSTHROUGH:
- if (guest->mode == VIR_CPU_MODE_HOST_MODEL)
- guest->match = VIR_CPU_MATCH_EXACT;
- else
- guest->match = VIR_CPU_MATCH_MINIMUM;
+ guest->match = VIR_CPU_MATCH_MINIMUM;
virCPUDefFreeModel(guest);
return virCPUDefCopyModel(guest, host, true);
ACK
Jirka