]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
cpu: Honor check='full' for host-passthrough CPUs
authorJiri Denemark <jdenemar@redhat.com>
Mon, 9 Mar 2020 13:14:04 +0000 (14:14 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 17 Mar 2020 21:53:53 +0000 (22:53 +0100)
The check attribute was completely ignored for host-passthrough CPUs
even if they explicitly requested some features to be enabled. For
example, a domain with the following CPU definition

  <cpu mode='host-passthrough' check='full'>
    <feature policy='require' name='svm'/>
  </cpu>

would happily start even when 'svm' cannot be enabled.

Let's call virCPUArchUpdateLive for host-passthrough CPUs with
VIR_CPU_CHECK_FULL to make sure the architecture specific code can
validate the provided virtual CPU against the desired definition.

https://bugzilla.redhat.com/show_bug.cgi?id=1515677

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/cpu/cpu.c
src/cpu/cpu_x86.c

index c461c4839de12f00a6e40b2d49e9328376f0d0ec..631c7553914f4a8f7d7b0b8a3a9444b2ebabf3df 100644 (file)
@@ -647,7 +647,8 @@ virCPUUpdateLive(virArch arch,
     if (!driver->updateLive)
         return 1;
 
-    if (cpu->mode == VIR_CPU_MODE_CUSTOM) {
+    if (cpu->mode == VIR_CPU_MODE_CUSTOM ||
+        cpu->check == VIR_CPU_CHECK_FULL) {
         if (driver->updateLive(cpu, dataEnabled, dataDisabled) < 0)
             return -1;
 
index 5a6b7bb1d8523be3376d78005b4a2cbe3f453ea7..7a8a2e3f3bd6e4e2ac6416888989bc83cf0717d1 100644 (file)
@@ -3009,8 +3009,10 @@ virCPUx86UpdateLive(virCPUDefPtr cpu,
                     virCPUDataPtr dataEnabled,
                     virCPUDataPtr dataDisabled)
 {
+    bool hostPassthrough = cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH;
     virCPUx86MapPtr map;
     virCPUx86ModelPtr model = NULL;
+    virCPUx86ModelPtr modelDisabled = NULL;
     virCPUx86Data enabled = VIR_CPU_X86_DATA_INIT;
     virCPUx86Data disabled = VIR_CPU_X86_DATA_INIT;
     virBuffer bufAdded = VIR_BUFFER_INITIALIZER;
@@ -3026,6 +3028,10 @@ virCPUx86UpdateLive(virCPUDefPtr cpu,
     if (!(model = x86ModelFromCPU(cpu, map, -1)))
         goto cleanup;
 
+    if (hostPassthrough &&
+        !(modelDisabled = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_DISABLE)))
+        goto cleanup;
+
     if (dataEnabled &&
         x86DataCopy(&enabled, &dataEnabled->data.x86) < 0)
         goto cleanup;
@@ -3040,7 +3046,8 @@ virCPUx86UpdateLive(virCPUDefPtr cpu,
 
         if (x86DataIsSubset(&model->data, &feature->data))
             expected = VIR_CPU_FEATURE_REQUIRE;
-        else
+        else if (!hostPassthrough ||
+                 x86DataIsSubset(&modelDisabled->data, &feature->data))
             expected = VIR_CPU_FEATURE_DISABLE;
 
         if (expected == VIR_CPU_FEATURE_DISABLE &&
@@ -3101,6 +3108,7 @@ virCPUx86UpdateLive(virCPUDefPtr cpu,
 
  cleanup:
     x86ModelFree(model);
+    x86ModelFree(modelDisabled);
     virCPUx86DataClear(&enabled);
     virCPUx86DataClear(&disabled);
     VIR_FREE(added);