]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: report whether a CPU model is deprecated in dom capabilities
authorDaniel P. Berrangé <berrange@redhat.com>
Fri, 22 Jan 2021 11:15:08 +0000 (11:15 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Wed, 3 Feb 2021 17:26:39 +0000 (17:26 +0000)
QEMU has the ability to mark CPUs as deprecated. This should be exposed
to management applications in the domain capabilities.

This attribute is only set when the model is actually deprecated.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
17 files changed:
docs/formatdomaincaps.html.in
docs/schemas/domaincaps.rng
src/conf/domain_capabilities.c
src/conf/domain_capabilities.h
src/qemu/qemu_capabilities.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
tests/cputest.c
tests/domaincapsdata/qemu_5.2.0-q35.x86_64.xml
tests/domaincapsdata/qemu_5.2.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_5.2.0.x86_64.xml
tests/domaincapsdata/qemu_6.0.0-q35.x86_64.xml
tests/domaincapsdata/qemu_6.0.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_6.0.0.x86_64.xml
tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml
tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml

index 65ab5574d389dfd61aefc96907db69e50429101e..8df88f535535e28c10370b2297e918e37313da7f 100644 (file)
       &lt;feature policy='require' name='vmx'/&gt;
     &lt;/mode&gt;
     &lt;mode name='custom' supported='yes'&gt;
-      &lt;model usable='no'&gt;Broadwell&lt;/model&gt;
-      &lt;model usable='yes'&gt;Broadwell-noTSX&lt;/model&gt;
-      &lt;model usable='no'&gt;Haswell&lt;/model&gt;
+      &lt;model usable='no' deprecated='no'&gt;Broadwell&lt;/model&gt;
+      &lt;model usable='yes' deprecated='no'&gt;Broadwell-noTSX&lt;/model&gt;
+      &lt;model usable='no' deprecated='yes'&gt;Haswell&lt;/model&gt;
       ...
     &lt;/mode&gt;
   &lt;/cpu&gt;
         cannot be used without disabling some features that the CPU of such
         model is expected to have. A special value <code>unknown</code>
         indicates libvirt does not have enough information to provide the
-        usability data.
+        usability data. The <code>deprecated</code> attribute reflects
+        the hypervisor's policy on usage of this model
+        <span class="since">(since 7.1.0)</span>.
       </dd>
     </dl>
 
index 0dbffb28ac2d6611d57dd3d574923bc04aeb992d..a57ef715c3dfd41bef050a0e53ff884c3d9d0bdb 100644 (file)
               <value>unknown</value>
             </choice>
           </attribute>
+          <optional>
+            <attribute name="deprecated">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
           <text/>
         </element>
       </zeroOrMore>
index 08789aeb31cc6c6b8764245836aefc0b26d1955b..837c571b45035f942de87689b283133326f17ca7 100644 (file)
@@ -175,7 +175,8 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old)
         if (virDomainCapsCPUModelsAdd(cpuModels,
                                       old->models[i].name,
                                       old->models[i].usable,
-                                      old->models[i].blockers) < 0)
+                                      old->models[i].blockers,
+                                      old->models[i].deprecated) < 0)
             goto error;
     }
 
@@ -191,7 +192,8 @@ int
 virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels,
                           const char *name,
                           virDomainCapsCPUUsable usable,
-                          char **blockers)
+                          char **blockers,
+                          bool deprecated)
 {
     g_autofree char * nameCopy = NULL;
     virDomainCapsCPUModelPtr cpu;
@@ -208,6 +210,7 @@ virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels,
     cpu->usable = usable;
     cpu->name = g_steal_pointer(&nameCopy);
     cpu->blockers = g_strdupv(blockers);
+    cpu->deprecated = deprecated;
 
     return 0;
 }
@@ -388,8 +391,11 @@ virDomainCapsCPUCustomFormat(virBufferPtr buf,
 
     for (i = 0; i < custom->nmodels; i++) {
         virDomainCapsCPUModelPtr model = custom->models + i;
-        virBufferAsprintf(buf, "<model usable='%s'>%s</model>\n",
-                          virDomainCapsCPUUsableTypeToString(model->usable),
+        virBufferAsprintf(buf, "<model usable='%s'",
+                          virDomainCapsCPUUsableTypeToString(model->usable));
+        if (model->deprecated)
+            virBufferAddLit(buf, " deprecated='yes'");
+        virBufferAsprintf(buf, ">%s</model>\n",
                           model->name);
     }
 
index b22d40abb280b68031cbb7e5f2cb34571da62409..f454780185f549b358fa78fa26f8a6f877bda1d4 100644 (file)
@@ -146,6 +146,7 @@ struct _virDomainCapsCPUModel {
     char *name;
     virDomainCapsCPUUsable usable;
     char **blockers; /* NULL-terminated list of usability blockers */
+    bool deprecated;
 };
 
 typedef struct _virDomainCapsCPUModels virDomainCapsCPUModels;
@@ -228,7 +229,8 @@ virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr o
 int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels,
                               const char *name,
                               virDomainCapsCPUUsable usable,
-                              char **blockers);
+                              char **blockers,
+                              bool deprecated);
 virDomainCapsCPUModelPtr
 virDomainCapsCPUModelsGet(virDomainCapsCPUModelsPtr cpuModels,
                           const char *name);
index 4a1bf9b6fefddbdce2c0834a6a1d6a61e6652029..ed3b34204ec91e86ef7c14995a17d02d2ca133d8 100644 (file)
@@ -2184,7 +2184,7 @@ virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefsPtr defs,
             continue;
 
         if (virDomainCapsCPUModelsAdd(cpuModels, cpu->name, cpu->usable,
-                                      cpu->blockers) < 0)
+                                      cpu->blockers, cpu->deprecated) < 0)
             return NULL;
     }
 
@@ -3904,6 +3904,7 @@ virQEMUCapsLoadCPUModels(virQEMUCapsAccelPtr caps,
         int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN;
         g_autofree char * strUsable = NULL;
         g_autofree xmlNodePtr * blockerNodes = NULL;
+        g_autofree char *deprecated = NULL;
         int nblockers;
 
         if ((strUsable = virXMLPropString(nodes[i], "usable")) &&
@@ -3948,6 +3949,11 @@ virQEMUCapsLoadCPUModels(virQEMUCapsAccelPtr caps,
                 }
             }
         }
+
+        deprecated = virXMLPropString(nodes[i], "deprecated");
+        if (deprecated &&
+            STREQ(deprecated, "yes"))
+            cpu->deprecated = true;
     }
 
     caps->cpuModels = g_steal_pointer(&defs);
@@ -4456,6 +4462,8 @@ virQEMUCapsFormatCPUModels(virQEMUCapsAccelPtr caps,
             virBufferAsprintf(buf, " usable='%s'",
                               virDomainCapsCPUUsableTypeToString(cpu->usable));
         }
+        if (cpu->deprecated)
+            virBufferAddLit(buf, " deprecated='yes'");
 
         if (cpu->blockers) {
             size_t j;
index 09b8617097b340fbc069b547a73c7bd72b087a9d..990519252e14d196acb48e1ac2d9a437a0dc67a4 100644 (file)
@@ -3673,6 +3673,7 @@ qemuMonitorCPUDefsCopy(qemuMonitorCPUDefsPtr src)
         cpuDst->name = g_strdup(cpuSrc->name);
         cpuDst->type = g_strdup(cpuSrc->type);
         cpuDst->blockers = g_strdupv(cpuSrc->blockers);
+        cpuDst->deprecated = cpuSrc->deprecated;
     }
 
     return g_steal_pointer(&defs);
index a07617ec285277a727a48d949debd641424e0cc8..67f149ebdef49a5539727359fa59ec855b26d6d7 100644 (file)
@@ -1193,6 +1193,7 @@ struct _qemuMonitorCPUDefInfo {
     char *name;
     char *type;
     char **blockers; /* NULL-terminated string list */
+    bool deprecated;
 };
 
 typedef struct _qemuMonitorCPUDefs qemuMonitorCPUDefs;
index 8a75a2734eac182464847a500d78a22200deff5a..6534878d457f31445d91b86657890b06347fdf18 100644 (file)
@@ -5896,6 +5896,10 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
 
             cpu->usable = VIR_DOMCAPS_CPU_USABLE_NO;
         }
+
+        if (virJSONValueObjectHasKey(child, "deprecated") &&
+            virJSONValueObjectGetBoolean(child, "deprecated", &cpu->deprecated) < 0)
+            return -1;
     }
 
     *cpuDefs = g_steal_pointer(&defs);
index 4c75ee535f76a8a76dcdb54ea46d6c02429e773b..593861dfe91b9667634d7c063ff076f38e43839f 100644 (file)
@@ -846,7 +846,7 @@ cpuTestUpdateLive(const void *arg)
         }
 
         if (virDomainCapsCPUModelsAdd(models, expected->model,
-                                      usable, blockers) < 0)
+                                      usable, blockers, false) < 0)
             goto cleanup;
 
         cpu->fallback = VIR_CPU_FALLBACK_ALLOW;
@@ -953,7 +953,7 @@ cpuTestInitModels(const char **list)
 
     for (model = list; *model; model++) {
         if (virDomainCapsCPUModelsAdd(cpus, *model,
-                                      VIR_DOMCAPS_CPU_USABLE_UNKNOWN, NULL) < 0)
+                                      VIR_DOMCAPS_CPU_USABLE_UNKNOWN, NULL, false) < 0)
             goto error;
     }
 
index 7111bdf2c520e5e0adba046474efa17aff1b8b58..5a5232751d360906eb6d89bf44f77274aed21eab 100644 (file)
@@ -91,8 +91,8 @@
       <model usable='no'>IvyBridge</model>
       <model usable='no'>Icelake-Server-noTSX</model>
       <model usable='no'>Icelake-Server</model>
-      <model usable='no'>Icelake-Client-noTSX</model>
-      <model usable='no'>Icelake-Client</model>
+      <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+      <model usable='no' deprecated='yes'>Icelake-Client</model>
       <model usable='no'>Haswell-noTSX-IBRS</model>
       <model usable='no'>Haswell-noTSX</model>
       <model usable='no'>Haswell-IBRS</model>
index 9d2e870b1cf0eaae7dc97f193cd16dd2dca3ac11..63546dc0a5b97dfa9dc89943f96cc04507729c8f 100644 (file)
@@ -96,8 +96,8 @@
       <model usable='no'>IvyBridge</model>
       <model usable='no'>Icelake-Server-noTSX</model>
       <model usable='no'>Icelake-Server</model>
-      <model usable='no'>Icelake-Client-noTSX</model>
-      <model usable='no'>Icelake-Client</model>
+      <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+      <model usable='no' deprecated='yes'>Icelake-Client</model>
       <model usable='no'>Haswell-noTSX-IBRS</model>
       <model usable='no'>Haswell-noTSX</model>
       <model usable='no'>Haswell-IBRS</model>
index d8113c4e928a6aa869219ce26e8d37461b292097..efc21244b35b01ea7ef49a30e470e872b123401a 100644 (file)
@@ -90,8 +90,8 @@
       <model usable='no'>IvyBridge</model>
       <model usable='no'>Icelake-Server-noTSX</model>
       <model usable='no'>Icelake-Server</model>
-      <model usable='no'>Icelake-Client-noTSX</model>
-      <model usable='no'>Icelake-Client</model>
+      <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+      <model usable='no' deprecated='yes'>Icelake-Client</model>
       <model usable='no'>Haswell-noTSX-IBRS</model>
       <model usable='no'>Haswell-noTSX</model>
       <model usable='no'>Haswell-IBRS</model>
index b364cdb74bb2a39e19a0f157a8768c2a873d468d..f216a8af3318d61ee9f7ce8178ceca5ee1628f46 100644 (file)
@@ -91,8 +91,8 @@
       <model usable='no'>IvyBridge</model>
       <model usable='no'>Icelake-Server-noTSX</model>
       <model usable='no'>Icelake-Server</model>
-      <model usable='no'>Icelake-Client-noTSX</model>
-      <model usable='no'>Icelake-Client</model>
+      <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+      <model usable='no' deprecated='yes'>Icelake-Client</model>
       <model usable='no'>Haswell-noTSX-IBRS</model>
       <model usable='no'>Haswell-noTSX</model>
       <model usable='no'>Haswell-IBRS</model>
index e4bd76fa3a52795dd1ac65cd13ddd1f71ea4e362..d52814f9eec9082e433612fed25bf63722ebd9a1 100644 (file)
@@ -96,8 +96,8 @@
       <model usable='no'>IvyBridge</model>
       <model usable='no'>Icelake-Server-noTSX</model>
       <model usable='no'>Icelake-Server</model>
-      <model usable='no'>Icelake-Client-noTSX</model>
-      <model usable='no'>Icelake-Client</model>
+      <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+      <model usable='no' deprecated='yes'>Icelake-Client</model>
       <model usable='no'>Haswell-noTSX-IBRS</model>
       <model usable='no'>Haswell-noTSX</model>
       <model usable='no'>Haswell-IBRS</model>
index 52d41c148e796e74164da77c7a00849c24fc8ac4..c5a11d03b455eff5fa8af1ef449ff308a95b5871 100644 (file)
@@ -90,8 +90,8 @@
       <model usable='no'>IvyBridge</model>
       <model usable='no'>Icelake-Server-noTSX</model>
       <model usable='no'>Icelake-Server</model>
-      <model usable='no'>Icelake-Client-noTSX</model>
-      <model usable='no'>Icelake-Client</model>
+      <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+      <model usable='no' deprecated='yes'>Icelake-Client</model>
       <model usable='no'>Haswell-noTSX-IBRS</model>
       <model usable='no'>Haswell-noTSX</model>
       <model usable='no'>Haswell-IBRS</model>
index dea2ff4b5470040fc6258713acbc0e0992d0523b..7f15bcda092ab28b0fef241e9cf183d23e750062 100644 (file)
     <blocker name='avx512f'/>
     <blocker name='pku'/>
   </cpu>
-  <cpu type='kvm' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no'>
+  <cpu type='kvm' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='pcid'/>
     <blocker name='erms'/>
     <blocker name='invpcid'/>
     <blocker name='spec-ctrl'/>
     <blocker name='pku'/>
   </cpu>
-  <cpu type='kvm' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no'>
+  <cpu type='kvm' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='pcid'/>
     <blocker name='hle'/>
     <blocker name='erms'/>
     <blocker name='spec-ctrl'/>
     <blocker name='pku'/>
   </cpu>
-  <cpu type='kvm' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no'>
+  <cpu type='kvm' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='pcid'/>
     <blocker name='erms'/>
     <blocker name='invpcid'/>
     <blocker name='spec-ctrl'/>
     <blocker name='pku'/>
   </cpu>
-  <cpu type='kvm' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no'>
+  <cpu type='kvm' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='pcid'/>
     <blocker name='hle'/>
     <blocker name='erms'/>
     <blocker name='wbnoinvd'/>
     <blocker name='xsavec'/>
   </cpu>
-  <cpu type='tcg' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no'>
+  <cpu type='tcg' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='fma'/>
     <blocker name='pcid'/>
     <blocker name='x2apic'/>
     <blocker name='wbnoinvd'/>
     <blocker name='xsavec'/>
   </cpu>
-  <cpu type='tcg' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no'>
+  <cpu type='tcg' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='fma'/>
     <blocker name='pcid'/>
     <blocker name='x2apic'/>
     <blocker name='wbnoinvd'/>
     <blocker name='xsavec'/>
   </cpu>
-  <cpu type='tcg' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no'>
+  <cpu type='tcg' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='fma'/>
     <blocker name='pcid'/>
     <blocker name='x2apic'/>
     <blocker name='wbnoinvd'/>
     <blocker name='xsavec'/>
   </cpu>
-  <cpu type='tcg' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no'>
+  <cpu type='tcg' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='fma'/>
     <blocker name='pcid'/>
     <blocker name='x2apic'/>
index f988357c445711437d614e76043d1747829eb80f..9198d85b7e90dd34b02f1733804cf5b94c755a46 100644 (file)
     <blocker name='avx512f'/>
     <blocker name='pku'/>
   </cpu>
-  <cpu type='kvm' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no'>
+  <cpu type='kvm' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='pcid'/>
     <blocker name='erms'/>
     <blocker name='invpcid'/>
     <blocker name='spec-ctrl'/>
     <blocker name='pku'/>
   </cpu>
-  <cpu type='kvm' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no'>
+  <cpu type='kvm' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='pcid'/>
     <blocker name='hle'/>
     <blocker name='erms'/>
     <blocker name='spec-ctrl'/>
     <blocker name='pku'/>
   </cpu>
-  <cpu type='kvm' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no'>
+  <cpu type='kvm' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='pcid'/>
     <blocker name='erms'/>
     <blocker name='invpcid'/>
     <blocker name='spec-ctrl'/>
     <blocker name='pku'/>
   </cpu>
-  <cpu type='kvm' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no'>
+  <cpu type='kvm' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='pcid'/>
     <blocker name='hle'/>
     <blocker name='erms'/>
     <blocker name='wbnoinvd'/>
     <blocker name='xsavec'/>
   </cpu>
-  <cpu type='tcg' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no'>
+  <cpu type='tcg' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='fma'/>
     <blocker name='pcid'/>
     <blocker name='x2apic'/>
     <blocker name='wbnoinvd'/>
     <blocker name='xsavec'/>
   </cpu>
-  <cpu type='tcg' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no'>
+  <cpu type='tcg' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='fma'/>
     <blocker name='pcid'/>
     <blocker name='x2apic'/>
     <blocker name='wbnoinvd'/>
     <blocker name='xsavec'/>
   </cpu>
-  <cpu type='tcg' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no'>
+  <cpu type='tcg' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='fma'/>
     <blocker name='pcid'/>
     <blocker name='x2apic'/>
     <blocker name='wbnoinvd'/>
     <blocker name='xsavec'/>
   </cpu>
-  <cpu type='tcg' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no'>
+  <cpu type='tcg' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no' deprecated='yes'>
     <blocker name='fma'/>
     <blocker name='pcid'/>
     <blocker name='x2apic'/>