[libvirt] [PATCH 02/41] domcaps: Add support for listing supported CPU models

John Ferlan jferlan at redhat.com
Mon Aug 29 16:31:44 UTC 2016



On 08/12/2016 09:32 AM, Jiri Denemark wrote:
> The patch adds <cpu> element to domain capabilities XML:
> 
>     <cpu>
>         <mode name='host-passthrough' supported='yes'/>
>         <mode name='host-model' supported='yes'/>
>         <mode name='custom' supported='yes'>
>             <model>Broadwell</model>
>             <model>Broadwell-noTSX</model>
>             ...
>         </mode>
>     </cpu>
> 
> Applications can use it to inspect what CPU configuration modes are
> supported for a specific combination of domain type, emulator binary,
> guest architecture and machine type.
> 
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
>  docs/formatdomaincaps.html.in                      |  44 ++++++
>  docs/schemas/domaincaps.rng                        |  43 ++++++
>  src/conf/domain_capabilities.c                     | 150 +++++++++++++++++++++
>  src/conf/domain_capabilities.h                     |  33 +++++
>  src/libvirt_private.syms                           |   4 +
>  tests/domaincapsschemadata/basic.xml               |   5 +
>  tests/domaincapsschemadata/full.xml                |   9 ++
>  tests/domaincapsschemadata/libxl-xenfv-usb.xml     |   5 +
>  tests/domaincapsschemadata/libxl-xenfv.xml         |   5 +
>  tests/domaincapsschemadata/libxl-xenpv-usb.xml     |   5 +
>  tests/domaincapsschemadata/libxl-xenpv.xml         |   5 +
>  tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml   |   5 +
>  .../qemu_2.6.0-gicv2-virt.aarch64.xml              |   5 +
>  .../qemu_2.6.0-gicv3-virt.aarch64.xml              |   5 +
>  tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml  |   5 +
>  tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml  |   5 +
>  tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml   |   5 +
>  tests/domaincapstest.c                             |   9 ++
>  18 files changed, 347 insertions(+)

[...]

> diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
> index 1676f0e..c07f995 100644
> --- a/src/conf/domain_capabilities.c
> +++ b/src/conf/domain_capabilities.c

[...]

> +
> +int
> +virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels,
> +                               char **name)
> +{
> +    if (VIR_RESIZE_N(cpuModels->models, cpuModels->alloc,
> +                     cpuModels->count, 1) < 0)
> +        return -1;
> +
> +    cpuModels->models[cpuModels->count++].name = *name;
> +    *name = NULL;

Similar to VIR_STEAL_PTR with the added count++ twist...

> +    return 0;
> +}
> +
> +
> +int
> +virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels,
> +                          const char *name,
> +                          ssize_t nameLen)
> +{
> +    char *copy = NULL;
> +
> +    if (VIR_STRNDUP(copy, name, nameLen) < 0)
> +        goto error;
> +
> +    if (virDomainCapsCPUModelsAddSteal(cpuModels, &copy) < 0)
> +        goto error;
> +
> +    return 0;
> +
> + error:
> +    VIR_FREE(copy);
> +    return -1;
> +}
> +
> +
>  int
>  virDomainCapsEnumSet(virDomainCapsEnumPtr capsEnum,
>                       const char *capsEnumName,
> @@ -234,6 +338,51 @@ virDomainCapsOSFormat(virBufferPtr buf,
>  }
>  
>  static void

[...]

> diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h
> index 492a9cf..509c306 100644
> --- a/src/conf/domain_capabilities.h
> +++ b/src/conf/domain_capabilities.h
> @@ -102,6 +102,30 @@ struct _virDomainCapsFeatureGIC {
>      virDomainCapsEnum version; /* Info about virGICVersion */
>  };
>  
> +typedef struct _virDomainCapsCPUModel virDomainCapsCPUModel;
> +typedef virDomainCapsCPUModel *virDomainCapsCPUModelPtr;
> +struct _virDomainCapsCPUModel {
> +    char *name;
> +};
> +
> +typedef struct _virDomainCapsCPUModels virDomainCapsCPUModels;
> +typedef virDomainCapsCPUModels *virDomainCapsCPUModelsPtr;
> +struct _virDomainCapsCPUModels {
> +    virObject parent;
> +
> +    size_t alloc;
> +    size_t count;

Easier for me to read/see "->nmodels_max" and "->nmodels"... Not sure
how pervasive it is to change... Not a requirement, your call...

> +    virDomainCapsCPUModelPtr models;
> +};
> +
> +typedef struct _virDomainCapsCPU virDomainCapsCPU;
> +typedef virDomainCapsCPU *virDomainCapsCPUPtr;
> +struct _virDomainCapsCPU {
> +    bool hostPassthrough;
> +    bool hostModel;
> +    virDomainCapsCPUModelsPtr custom;
> +};
> +

[...]




More information about the libvir-list mailing list