On x86, "-cpu host" enables some features that can't be
represented by a static CPU model definition: cache info
passthrough ("host-cache-info") and PMU passthrough ("pmu"). This
means a type=static expansion of "host" can't include those
features.

A type=full expansion of "host", on the other hand, can include
those features, but then the returned data won't be a static CPU
model representation.

Add a note to the documentation explaining that when using CPU
models that include non-migration-safe features, users need to
choose being precision and safety: a precise expansion of the CPU
model (full) won't be safe (static), (because they would include
pmu=on and host-cache-info=on), and a safe (static) expansion of
the CPU model won't be precise.

Architectures where CPU model expansion is always migration-safe
(e.g. s390x) can simply do what they already do, and set
'migration-safe' and 'static' to true.

Cc: Cornelia Huck <cornelia.h...@de.ibm.com>
Cc: Christian Borntraeger <borntrae...@de.ibm.com>
Cc: David Hildenbrand <da...@redhat.com>
Cc: libvir-l...@redhat.com
Cc: Jiri Denemark <jdene...@redhat.com>
Cc: "Jason J. Herne" <jjhe...@linux.vnet.ibm.com>
Cc: Markus Armbruster <arm...@redhat.com>
Cc: Eric Blake <ebl...@redhat.com>
Signed-off-by: Eduardo Habkost <ehabk...@redhat.com>
---
 qapi-schema.json          | 25 ++++++++++++++++++++++++-
 target-s390x/cpu_models.c |  4 ++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/qapi-schema.json b/qapi-schema.json
index 8d113f8..a102534 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3291,6 +3291,15 @@
 #        migration-safe, but allows tooling to get an insight and work with
 #        model details.
 #
+# Note: When a non-migration-safe CPU model is expanded in static mode, some
+# features enabled by the CPU model may be omitted, because they can't be
+# implemented by a static CPU model definition (e.g. cache info passthrough and
+# PMU passthrough in x86). If you need an accurate representation of the
+# features enabled by a non-migration-safe CPU model, use @full. If you need a
+# static representation that will keep ABI compatibility even when changing 
QEMU
+# version or machine-type, use @static (but keep in mind that some features may
+# be omitted).
+#
 # Since: 2.8.0
 ##
 { 'enum': 'CpuModelExpansionType',
@@ -3304,10 +3313,24 @@
 #
 # @model: the expanded CpuModelInfo.
 #
+# @migration-safe: the expanded CPU model in @model is a migration-safe
+#                  CPU model. See @CpuDefinitionInfo.migration-safe.
+#                  If expansion type was @static, this is always true.
+#                  (since 2.9)
+#
+# @static: the expanded CPU model in @model is a static CPU model.
+#          See @CpuDefinitionInfo.static. If expansion type was @static,
+#          this is always true.
+#          (since 2.9)
+#
+# query-cpu-model-expansion with static expansion type should always
+# return a static and migration-safe expansion.
+#
 # Since: 2.8.0
 ##
 { 'struct': 'CpuModelExpansionInfo',
-  'data': { 'model': 'CpuModelInfo' } }
+  'data': { 'model': 'CpuModelInfo', 'static': 'bool',
+            'migration-safe': 'bool' } }
 
 
 ##
diff --git a/target-s390x/cpu_models.c b/target-s390x/cpu_models.c
index 5b66d33..f934add 100644
--- a/target-s390x/cpu_models.c
+++ b/target-s390x/cpu_models.c
@@ -448,6 +448,10 @@ CpuModelExpansionInfo 
*arch_query_cpu_model_expansion(CpuModelExpansionType type
     /* convert it back to a static representation */
     expansion_info = g_malloc0(sizeof(*expansion_info));
     expansion_info->model = g_malloc0(sizeof(*expansion_info->model));
+
+    /* We always expand to a static and migration-safe CpuModelInfo */
+    expansion_info->q_static = true;
+    expansion_info->migration_safe = true;
     cpu_info_from_model(expansion_info->model, &s390_model, delta_changes);
     return expansion_info;
 }
-- 
2.7.4


Reply via email to