qmp: add QMP interface "query-cpu-model-comparison"
Let's provide a standardized interface to compare two CPU models. "query-cpu-model-compare" takes two models and returns how they compare in a specific configuration. The result will give guarantees about runnability. E.g. if a CPU model A is a subset of CPU model B, model A is guaranteed to run in configurations where model B runs, but not the other way around (might or might not run). Usually, CPU features or CPU generations are used to calculate the result. If a model is not guaranteed to run in a certain environment (e.g. incompatible), a compatible one can be created by "baselining" both models (follow up patch). Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Message-Id: <20160905085244.99980-27-dahi@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
		
							parent
							
								
									e09484efbc
								
							
						
					
					
						commit
						0031e0d683
					
				| 
						 | 
				
			
			@ -38,5 +38,8 @@ CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp);
 | 
			
		|||
CpuModelExpansionInfo *arch_query_cpu_model_expansion(CpuModelExpansionType type,
 | 
			
		||||
                                                      CpuModelInfo *mode,
 | 
			
		||||
                                                      Error **errp);
 | 
			
		||||
CpuModelCompareInfo *arch_query_cpu_model_comparison(CpuModelInfo *modela,
 | 
			
		||||
                                                     CpuModelInfo *modelb,
 | 
			
		||||
                                                     Error **errp);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3158,6 +3158,92 @@
 | 
			
		|||
            'model': 'CpuModelInfo' },
 | 
			
		||||
  'returns': 'CpuModelExpansionInfo' }
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
# @CpuModelCompareResult:
 | 
			
		||||
#
 | 
			
		||||
# An enumeration of CPU model comparation results. The result is usually
 | 
			
		||||
# calcualted using e.g. CPU features or CPU generations.
 | 
			
		||||
#
 | 
			
		||||
# @incompatible: If model A is incompatible to model B, model A is not
 | 
			
		||||
#                guaranteed to run where model B runs and the other way around.
 | 
			
		||||
#
 | 
			
		||||
# @identical: If model A is identical to model B, model A is guaranteed to run
 | 
			
		||||
#             where model B runs and the other way around.
 | 
			
		||||
#
 | 
			
		||||
# @superset: If model A is a superset of model B, model B is guaranteed to run
 | 
			
		||||
#            where model A runs. There are no guarantees about the other way.
 | 
			
		||||
#
 | 
			
		||||
# @subset: If model A is a subset of model B, model A is guaranteed to run
 | 
			
		||||
#          where model B runs. There are no guarantees about the other way.
 | 
			
		||||
#
 | 
			
		||||
# Since: 2.8.0
 | 
			
		||||
##
 | 
			
		||||
{ 'enum': 'CpuModelCompareResult',
 | 
			
		||||
  'data': [ 'incompatible', 'identical', 'superset', 'subset' ] }
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
# @CpuModelCompareInfo
 | 
			
		||||
#
 | 
			
		||||
# The result of a CPU model comparison.
 | 
			
		||||
#
 | 
			
		||||
# @result: The result of the compare operation.
 | 
			
		||||
# @responsible-properties: List of properties that led to the comparison result
 | 
			
		||||
#                          not being identical.
 | 
			
		||||
#
 | 
			
		||||
# @responsible-properties is a list of QOM property names that led to
 | 
			
		||||
# both CPUs not being detected as identical. For identical models, this
 | 
			
		||||
# list is empty.
 | 
			
		||||
# If a QOM property is read-only, that means there's no known way to make the
 | 
			
		||||
# CPU models identical. If the special property name "type" is included, the
 | 
			
		||||
# models are by definition not identical and cannot be made identical.
 | 
			
		||||
#
 | 
			
		||||
# Since: 2.8.0
 | 
			
		||||
##
 | 
			
		||||
{ 'struct': 'CpuModelCompareInfo',
 | 
			
		||||
  'data': {'result': 'CpuModelCompareResult',
 | 
			
		||||
           'responsible-properties': ['str']
 | 
			
		||||
          }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
# @query-cpu-model-comparison:
 | 
			
		||||
#
 | 
			
		||||
# Compares two CPU models, returning how they compare in a specific
 | 
			
		||||
# configuration. The results indicates how both models compare regarding
 | 
			
		||||
# runnability. This result can be used by tooling to make decisions if a
 | 
			
		||||
# certain CPU model will run in a certain configuration or if a compatible
 | 
			
		||||
# CPU model has to be created by baselining.
 | 
			
		||||
#
 | 
			
		||||
# Usually, a CPU model is compared against the maximum possible CPU model
 | 
			
		||||
# of a ceratin configuration (e.g. the "host" model for KVM). If that CPU
 | 
			
		||||
# model is identical or a subset, it will run in that configuration.
 | 
			
		||||
#
 | 
			
		||||
# The result returned by this command may be affected by:
 | 
			
		||||
#
 | 
			
		||||
# * QEMU version: CPU models may look different depending on the QEMU version.
 | 
			
		||||
#   (Except for CPU models reported as "static" in query-cpu-definitions.)
 | 
			
		||||
# * machine-type: CPU model  may look different depending on the machine-type.
 | 
			
		||||
#   (Except for CPU models reported as "static" in query-cpu-definitions.)
 | 
			
		||||
# * machine options (including accelerator): in some architectures, CPU models
 | 
			
		||||
#   may look different depending on machine and accelerator options. (Except for
 | 
			
		||||
#   CPU models reported as "static" in query-cpu-definitions.)
 | 
			
		||||
# * "-cpu" arguments and global properties: arguments to the -cpu option and
 | 
			
		||||
#   global properties may affect expansion of CPU models. Using
 | 
			
		||||
#   query-cpu-model-expansion while using these is not advised.
 | 
			
		||||
#
 | 
			
		||||
# Some architectures may not support comparing CPU models.
 | 
			
		||||
#
 | 
			
		||||
# Returns: a CpuModelBaselineInfo. Returns an error if comparing CPU models is
 | 
			
		||||
#          not supported, if a model cannot be used, if a model contains
 | 
			
		||||
#          an unknown cpu definition name, unknown properties or properties
 | 
			
		||||
#          with wrong types.
 | 
			
		||||
#
 | 
			
		||||
# Since: 2.8.0
 | 
			
		||||
##
 | 
			
		||||
{ 'command': 'query-cpu-model-comparison',
 | 
			
		||||
  'data': { 'modela': 'CpuModelInfo', 'modelb': 'CpuModelInfo' },
 | 
			
		||||
  'returns': 'CpuModelCompareInfo' }
 | 
			
		||||
 | 
			
		||||
# @AddfdInfo:
 | 
			
		||||
#
 | 
			
		||||
# Information about a file descriptor that was added to an fd set.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3947,6 +3947,12 @@ EQMP
 | 
			
		|||
        .mhandler.cmd_new = qmp_marshal_query_cpu_model_expansion,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        .name       = "query-cpu-model-comparison",
 | 
			
		||||
        .args_type  = "modela:q,modelb:q",
 | 
			
		||||
        .mhandler.cmd_new = qmp_marshal_query_cpu_model_comparison,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        .name       = "query-target",
 | 
			
		||||
        .args_type  = "",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										7
									
								
								qmp.c
								
								
								
								
							
							
						
						
									
										7
									
								
								qmp.c
								
								
								
								
							| 
						 | 
				
			
			@ -614,6 +614,13 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
 | 
			
		|||
    return arch_query_cpu_model_expansion(type, model, errp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CpuModelCompareInfo *qmp_query_cpu_model_comparison(CpuModelInfo *modela,
 | 
			
		||||
                                                    CpuModelInfo *modelb,
 | 
			
		||||
                                                    Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    return arch_query_cpu_model_comparison(modela, modelb, errp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qmp_add_client(const char *protocol, const char *fdname,
 | 
			
		||||
                    bool has_skipauth, bool skipauth, bool has_tls, bool tls,
 | 
			
		||||
                    Error **errp)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
stub-obj-y += arch-query-cpu-def.o
 | 
			
		||||
stub-obj-y += arch-query-cpu-model-expansion.o
 | 
			
		||||
stub-obj-y += arch-query-cpu-model-comparison.o
 | 
			
		||||
stub-obj-y += bdrv-next-monitor-owned.o
 | 
			
		||||
stub-obj-y += blk-commit-all.o
 | 
			
		||||
stub-obj-y += blockdev-close-all-bdrv-states.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
#include "qemu/osdep.h"
 | 
			
		||||
#include "qemu-common.h"
 | 
			
		||||
#include "sysemu/arch_init.h"
 | 
			
		||||
#include "qapi/qmp/qerror.h"
 | 
			
		||||
 | 
			
		||||
CpuModelCompareInfo *arch_query_cpu_model_comparison(CpuModelInfo *modela,
 | 
			
		||||
                                                     CpuModelInfo *modelb,
 | 
			
		||||
                                                     Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    error_setg(errp, QERR_UNSUPPORTED);
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue