[libvirt] [PATCH v2 04/11] qemu-caps: Get host model directly from Qemu when available
Jiri Denemark
jdenemar at redhat.com
Thu Dec 15 12:57:37 UTC 2016
On Fri, Dec 09, 2016 at 14:38:33 -0500, Jason J. Herne wrote:
> From: "Collin L. Walling" <walling at linux.vnet.ibm.com>
>
> When qmp query-cpu-model-expansion is available probe Qemu for its view of the
> host model. In kvm environments this can provide a more complete view of the
> host model because features supported by Qemu and Kvm can be considered.
>
> Signed-off-by: Collin L. Walling <walling at linux.vnet.ibm.com>
> Signed-off-by: Jason J. Herne <jjherne at linux.vnet.ibm.com>
> ---
> src/qemu/qemu_capabilities.c | 180 ++++++++++++++++++++++++++++++++++++++++++-
> src/qemu/qemu_capabilities.h | 1 +
> 2 files changed, 177 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 081afc5..793afcc 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -354,6 +354,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
> "gluster.debug_level",
> "vhost-scsi",
> "drive-iotune-group",
> + "query-cpu-model-expansion",
We put an empty line after a group of 5 capabilities.
> );
>
>
> @@ -397,6 +398,8 @@ struct _virQEMUCaps {
> size_t ngicCapabilities;
> virGICCapability *gicCapabilities;
>
> + qemuMonitorCPUModelInfoPtr hostCPUModelInfo;
> +
> /* Anything below is not stored in the cache since the values are
> * re-computed from the other fields or external data sources every
> * time we probe QEMU or load the results from the cache.
...
> @@ -3052,6 +3123,85 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
> virResetLastError();
> }
>
> +void
> +virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
> + virCapsPtr caps)
> +{
The following code should remain here:
if (!caps)
return;
if (!virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch))
goto error;
Otherwise probing s390 QEMU binary on non-s390 host would report an
error.
> + switch (qemuCaps->arch) {
> + case VIR_ARCH_S390:
> + case VIR_ARCH_S390X:
> + if (virQEMUCapsCopyCPUModelFromQEMU(qemuCaps) == 0)
> + break;
It doesn't make sense to fallback to CopyCPUModelFromHost if
CopyCPUModelFromQEMU fails on s390.
> +
> + default: virQEMUCapsCopyCPUModelFromHost(qemuCaps, caps);
> + }
> +}
> +
> +
> +static int
> +virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
> + xmlXPathContextPtr ctxt,
> + xmlNodePtr hostCPUNode)
> +{
> + char *str = NULL;
> + xmlNodePtr *featureNodes = NULL;
> + xmlNodePtr oldnode = ctxt->node;
> + int ret = -1;
> + size_t i;
> + int n;
> +
> + if ((str = virXMLPropString(hostCPUNode, "model"))) {
> + if (VIR_ALLOC(qemuCaps->hostCPUModelInfo) < 0)
> + goto cleanup;
> + if (VIR_STRDUP(qemuCaps->hostCPUModelInfo->name, str) < 0)
> + goto cleanup;
> + }
As I already noted in the previous version you should not allocate the
structure only if model attribute was set.
> +
> + ctxt->node = hostCPUNode;
...
> @@ -3148,6 +3298,7 @@ virQEMUCapsLoadCache(virCapsPtr caps,
> size_t i;
> int n;
> xmlNodePtr *nodes = NULL;
> + xmlNodePtr node = NULL;
There's no need to initialize this variable.
> xmlXPathContextPtr ctxt = NULL;
> char *str = NULL;
> long long int l;
> @@ -3247,6 +3398,11 @@ virQEMUCapsLoadCache(virCapsPtr caps,
> }
> VIR_FREE(str);
>
> + if ((node = virXPathNode("./hostCPU", ctxt)) &&
> + virQEMUCapsLoadHostCPUModelInfo(qemuCaps, ctxt, node) < 0)
> + goto cleanup;
> + node = NULL;
No need to reset it back to NULL either.
Anyway, you can move virXPathNode("./hostCPU", ctxt) inside
virQEMUCapsLoadHostCPUModelInfo.
> +
> if (virQEMUCapsLoadCPUModels(qemuCaps, ctxt, VIR_DOMAIN_VIRT_KVM) < 0 ||
> virQEMUCapsLoadCPUModels(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0)
> goto cleanup;
..
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index cbab879..71d2570 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -389,6 +389,7 @@ typedef enum {
> QEMU_CAPS_GLUSTER_DEBUG_LEVEL, /* -drive gluster.debug_level={0..9} */
> QEMU_CAPS_DEVICE_VHOST_SCSI, /* -device vhost-scsi-{ccw,pci} */
> QEMU_CAPS_DRIVE_IOTUNE_GROUP, /* -drive throttling.group=<name> */
An empty line with /* 245 */ comment should be added here.
> + QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION, /* qmp query-cpu-model-expansion */
>
> QEMU_CAPS_LAST /* this must always be the last item */
> } virQEMUCapsFlags;
Jirka
More information about the libvir-list
mailing list