[libvirt] [PATCH 12/22] Introduce virConnectBaselineHypervisorCPU public API

Jiri Denemark posted 22 patches 6 years, 12 months ago
[libvirt] [PATCH 12/22] Introduce virConnectBaselineHypervisorCPU public API
Posted by Jiri Denemark 6 years, 12 months ago
The new API computes the most feature-rich CPU which is compatible with
all given CPUs and can be provided by the specified hypervisor. It is a
more useful version of vitConnectBaselineCPU, which doesn't consider any
hypervisor capabilities when computing the best CPU.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 include/libvirt/libvirt-host.h |  8 ++++
 src/driver-hypervisor.h        | 10 +++++
 src/libvirt-host.c             | 81 ++++++++++++++++++++++++++++++++++
 src/libvirt_public.syms        |  1 +
 4 files changed, 100 insertions(+)

diff --git a/include/libvirt/libvirt-host.h b/include/libvirt/libvirt-host.h
index e2054baebc..84f4858169 100644
--- a/include/libvirt/libvirt-host.h
+++ b/include/libvirt/libvirt-host.h
@@ -667,6 +667,14 @@ char *virConnectBaselineCPU(virConnectPtr conn,
                             const char **xmlCPUs,
                             unsigned int ncpus,
                             unsigned int flags);
+char *virConnectBaselineHypervisorCPU(virConnectPtr conn,
+                                      const char *emulator,
+                                      const char *arch,
+                                      const char *machine,
+                                      const char *virttype,
+                                      const char **xmlCPUs,
+                                      unsigned int ncpus,
+                                      unsigned int flags);
 
 
 int virNodeGetFreePages(virConnectPtr conn,
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index d64de2d54c..9ce0d7e5de 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -687,6 +687,15 @@ typedef char *
                             const char **xmlCPUs,
                             unsigned int ncpus,
                             unsigned int flags);
+typedef char *
+(*virDrvConnectBaselineHypervisorCPU)(virConnectPtr conn,
+                                      const char *emulator,
+                                      const char *arch,
+                                      const char *machine,
+                                      const char *virttype,
+                                      const char **xmlCPUs,
+                                      unsigned int ncpus,
+                                      unsigned int flags);
 
 typedef int
 (*virDrvConnectGetCPUModelNames)(virConnectPtr conn,
@@ -1542,6 +1551,7 @@ struct _virHypervisorDriver {
     virDrvDomainSetBlockThreshold domainSetBlockThreshold;
     virDrvDomainSetLifecycleAction domainSetLifecycleAction;
     virDrvConnectCompareHypervisorCPU connectCompareHypervisorCPU;
+    virDrvConnectBaselineHypervisorCPU connectBaselineHypervisorCPU;
 };
 
 
diff --git a/src/libvirt-host.c b/src/libvirt-host.c
index 17cf183499..cdbbe35e5a 100644
--- a/src/libvirt-host.c
+++ b/src/libvirt-host.c
@@ -1127,6 +1127,9 @@ virConnectGetCPUModelNames(virConnectPtr conn, const char *arch, char ***models,
  * Computes the most feature-rich CPU which is compatible with all given
  * host CPUs.
  *
+ * See vitConnectBaselineHypervisorCPU() to get a CPU which can be provided
+ * by a specific hypervisor.
+ *
  * If @flags includes VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES then libvirt
  * will explicitly list all CPU features that are part of the host CPU,
  * without this flag features that are part of the CPU model will not be
@@ -1174,6 +1177,84 @@ virConnectBaselineCPU(virConnectPtr conn,
 }
 
 
+/**
+ * virConnectBaselineHypervisorCPU:
+ *
+ * @conn: pointer to the hypervisor connection
+ * @emulator: path to the emulator binary
+ * @arch: domain architecture
+ * @machine: machine type
+ * @virttype: virtualization type
+ * @xmlCPUs: array of XML descriptions of CPUs
+ * @ncpus: number of CPUs in xmlCPUs
+ * @flags: bitwise-OR of virConnectBaselineCPUFlags
+ *
+ * Computes the most feature-rich CPU which is compatible with all given CPUs
+ * and can be provided by the specified hypervisor. For best results the
+ * host-model CPUs as advertised by virConnectGetDomainCapabilities() should be
+ * passed in @xmlCPUs. Any of @emulator, @arch, @machine, and @virttype
+ * parameters may be NULL; libvirt will choose sensible defaults tailored to
+ * the host and its current configuration.
+ *
+ * This is different from vitConnectBaselineCPU() which doesn't consider any
+ * hypervisor abilities when computing the best CPU.
+ *
+ * If @flags includes VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES then libvirt
+ * will explicitly list all CPU features that are part of the computed CPU,
+ * without this flag features that are part of the CPU model will not be
+ * listed.
+ *
+ * If @flags includes VIR_CONNECT_BASELINE_CPU_MIGRATABLE, the resulting
+ * CPU will not include features that block migration.
+ *
+ * Returns XML description of the computed CPU (caller frees) or NULL on error.
+ */
+char *
+virConnectBaselineHypervisorCPU(virConnectPtr conn,
+                                const char *emulator,
+                                const char *arch,
+                                const char *machine,
+                                const char *virttype,
+                                const char **xmlCPUs,
+                                unsigned int ncpus,
+                                unsigned int flags)
+{
+    size_t i;
+
+    VIR_DEBUG("conn=%p, emulator=%s, arch=%s, machine=%s, "
+              "virttype=%s, xmlCPUs=%p, ncpus=%u, flags=0x%x",
+              conn, NULLSTR(emulator), NULLSTR(arch), NULLSTR(machine),
+              NULLSTR(virttype), xmlCPUs, ncpus, flags);
+    if (xmlCPUs) {
+        for (i = 0; i < ncpus; i++)
+            VIR_DEBUG("xmlCPUs[%zu]=%s", i, NULLSTR(xmlCPUs[i]));
+    }
+
+    virResetLastError();
+
+    virCheckConnectReturn(conn, NULL);
+    virCheckNonNullArgGoto(xmlCPUs, error);
+
+    if (conn->driver->connectBaselineHypervisorCPU) {
+        char *cpu;
+
+        cpu = conn->driver->connectBaselineHypervisorCPU(conn, emulator, arch,
+                                                         machine, virttype,
+                                                         xmlCPUs, ncpus, flags);
+        if (!cpu)
+            goto error;
+
+        return cpu;
+    }
+
+    virReportUnsupportedError();
+
+ error:
+    virDispatchError(conn);
+    return NULL;
+}
+
+
 /**
  * virConnectSetKeepAlive:
  * @conn: pointer to a hypervisor connection
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 97597d7708..05ab077fb4 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -788,6 +788,7 @@ LIBVIRT_4.1.0 {
 LIBVIRT_4.4.0 {
     global:
         virConnectCompareHypervisorCPU;
+        virConnectBaselineHypervisorCPU;
 } LIBVIRT_4.1.0;
 
 # .... define new API here using predicted next version number ....
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 12/22] Introduce virConnectBaselineHypervisorCPU public API
Posted by Ján Tomko 6 years, 11 months ago
On Wed, May 16, 2018 at 10:39:31AM +0200, Jiri Denemark wrote:
>The new API computes the most feature-rich CPU which is compatible with
>all given CPUs and can be provided by the specified hypervisor. It is a
>more useful version of vitConnectBaselineCPU, which doesn't consider any
>hypervisor capabilities when computing the best CPU.
>
>Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
>---
> include/libvirt/libvirt-host.h |  8 ++++
> src/driver-hypervisor.h        | 10 +++++
> src/libvirt-host.c             | 81 ++++++++++++++++++++++++++++++++++
> src/libvirt_public.syms        |  1 +
> 4 files changed, 100 insertions(+)
>
>diff --git a/src/libvirt-host.c b/src/libvirt-host.c
>index 17cf183499..cdbbe35e5a 100644
>--- a/src/libvirt-host.c
>+++ b/src/libvirt-host.c
>@@ -1127,6 +1127,9 @@ virConnectGetCPUModelNames(virConnectPtr conn, const char *arch, char ***models,
>  * Computes the most feature-rich CPU which is compatible with all given
>  * host CPUs.
>  *
>+ * See vitConnectBaselineHypervisorCPU() to get a CPU which can be provided

The same rypo.

>+ * by a specific hypervisor.
>+ *
>  * If @flags includes VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES then libvirt
>  * will explicitly list all CPU features that are part of the host CPU,
>  * without this flag features that are part of the CPU model will not be

Reviewed-by: Ján Tomko <jtomko@redhat.com>

Jano
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 12/22] Introduce virConnectBaselineHypervisorCPU public API
Posted by Collin Walling 6 years, 11 months ago
On 05/16/2018 04:39 AM, Jiri Denemark wrote:
> The new API computes the most feature-rich CPU which is compatible with
> all given CPUs and can be provided by the specified hypervisor. It is a
> more useful version of vitConnectBaselineCPU, which doesn't consider any

s/vit/vir

> hypervisor capabilities when computing the best CPU.
> 
> Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
> ---
>  include/libvirt/libvirt-host.h |  8 ++++
>  src/driver-hypervisor.h        | 10 +++++
>  src/libvirt-host.c             | 81 ++++++++++++++++++++++++++++++++++
>  src/libvirt_public.syms        |  1 +
>  4 files changed, 100 insertions(+)
> 
> diff --git a/include/libvirt/libvirt-host.h b/include/libvirt/libvirt-host.h
> index e2054baebc..84f4858169 100644
> --- a/include/libvirt/libvirt-host.h
> +++ b/include/libvirt/libvirt-host.h
> @@ -667,6 +667,14 @@ char *virConnectBaselineCPU(virConnectPtr conn,
>                              const char **xmlCPUs,
>                              unsigned int ncpus,
>                              unsigned int flags);
> +char *virConnectBaselineHypervisorCPU(virConnectPtr conn,
> +                                      const char *emulator,
> +                                      const char *arch,
> +                                      const char *machine,
> +                                      const char *virttype,
> +                                      const char **xmlCPUs,
> +                                      unsigned int ncpus,
> +                                      unsigned int flags);
>  
>  
>  int virNodeGetFreePages(virConnectPtr conn,
> diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
> index d64de2d54c..9ce0d7e5de 100644
> --- a/src/driver-hypervisor.h
> +++ b/src/driver-hypervisor.h
> @@ -687,6 +687,15 @@ typedef char *
>                              const char **xmlCPUs,
>                              unsigned int ncpus,
>                              unsigned int flags);
> +typedef char *
> +(*virDrvConnectBaselineHypervisorCPU)(virConnectPtr conn,
> +                                      const char *emulator,
> +                                      const char *arch,
> +                                      const char *machine,
> +                                      const char *virttype,
> +                                      const char **xmlCPUs,
> +                                      unsigned int ncpus,
> +                                      unsigned int flags);
>  
>  typedef int
>  (*virDrvConnectGetCPUModelNames)(virConnectPtr conn,
> @@ -1542,6 +1551,7 @@ struct _virHypervisorDriver {
>      virDrvDomainSetBlockThreshold domainSetBlockThreshold;
>      virDrvDomainSetLifecycleAction domainSetLifecycleAction;
>      virDrvConnectCompareHypervisorCPU connectCompareHypervisorCPU;
> +    virDrvConnectBaselineHypervisorCPU connectBaselineHypervisorCPU;
>  };
>  
>  
> diff --git a/src/libvirt-host.c b/src/libvirt-host.c
> index 17cf183499..cdbbe35e5a 100644
> --- a/src/libvirt-host.c
> +++ b/src/libvirt-host.c
> @@ -1127,6 +1127,9 @@ virConnectGetCPUModelNames(virConnectPtr conn, const char *arch, char ***models,
>   * Computes the most feature-rich CPU which is compatible with all given
>   * host CPUs.
>   *
> + * See vitConnectBaselineHypervisorCPU() to get a CPU which can be provided

same here

> + * by a specific hypervisor.

Maybe say "by the hypervisor" here? I don't think it's as important as the change to the 
documentation as discussed in the previous patch, but it might be good for consistency.

> + *
>   * If @flags includes VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES then libvirt
>   * will explicitly list all CPU features that are part of the host CPU,
>   * without this flag features that are part of the CPU model will not be
> @@ -1174,6 +1177,84 @@ virConnectBaselineCPU(virConnectPtr conn,
>  }
>  
>  
> +/**
> + * virConnectBaselineHypervisorCPU:
> + *
> + * @conn: pointer to the hypervisor connection
> + * @emulator: path to the emulator binary
> + * @arch: domain architecture

I'd say "CPU architecture" instead

> + * @machine: machine type
> + * @virttype: virtualization type
> + * @xmlCPUs: array of XML descriptions of CPUs
> + * @ncpus: number of CPUs in xmlCPUs
> + * @flags: bitwise-OR of virConnectBaselineCPUFlags
> + *
> + * Computes the most feature-rich CPU which is compatible with all given CPUs
> + * and can be provided by the specified hypervisor. For best results the
> + * host-model CPUs as advertised by virConnectGetDomainCapabilities() should be
> + * passed in @xmlCPUs. Any of @emulator, @arch, @machine, and @virttype
> + * parameters may be NULL; libvirt will choose sensible defaults tailored to
> + * the host and its current configuration.
> + *
> + * This is different from vitConnectBaselineCPU() which doesn't consider any

s/vit/vir

> + * hypervisor abilities when computing the best CPU.
> + *
> + * If @flags includes VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES then libvirt
> + * will explicitly list all CPU features that are part of the computed CPU,
> + * without this flag features that are part of the CPU model will not be
> + * listed.
> + *
> + * If @flags includes VIR_CONNECT_BASELINE_CPU_MIGRATABLE, the resulting
> + * CPU will not include features that block migration.
> + *
> + * Returns XML description of the computed CPU (caller frees) or NULL on error.
> + */
> +char *
> +virConnectBaselineHypervisorCPU(virConnectPtr conn,
> +                                const char *emulator,
> +                                const char *arch,
> +                                const char *machine,
> +                                const char *virttype,
> +                                const char **xmlCPUs,
> +                                unsigned int ncpus,
> +                                unsigned int flags)
> +{
> +    size_t i;
> +
> +    VIR_DEBUG("conn=%p, emulator=%s, arch=%s, machine=%s, "
> +              "virttype=%s, xmlCPUs=%p, ncpus=%u, flags=0x%x",
> +              conn, NULLSTR(emulator), NULLSTR(arch), NULLSTR(machine),
> +              NULLSTR(virttype), xmlCPUs, ncpus, flags);
> +    if (xmlCPUs) {
> +        for (i = 0; i < ncpus; i++)
> +            VIR_DEBUG("xmlCPUs[%zu]=%s", i, NULLSTR(xmlCPUs[i]));
> +    }
> +
> +    virResetLastError();
> +
> +    virCheckConnectReturn(conn, NULL);
> +    virCheckNonNullArgGoto(xmlCPUs, error);
> +
> +    if (conn->driver->connectBaselineHypervisorCPU) {
> +        char *cpu;
> +
> +        cpu = conn->driver->connectBaselineHypervisorCPU(conn, emulator, arch,
> +                                                         machine, virttype,
> +                                                         xmlCPUs, ncpus, flags);
> +        if (!cpu)
> +            goto error;
> +
> +        return cpu;
> +    }
> +
> +    virReportUnsupportedError();
> +
> + error:
> +    virDispatchError(conn);
> +    return NULL;
> +}
> +
> +
>  /**
>   * virConnectSetKeepAlive:
>   * @conn: pointer to a hypervisor connection
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index 97597d7708..05ab077fb4 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -788,6 +788,7 @@ LIBVIRT_4.1.0 {
>  LIBVIRT_4.4.0 {
>      global:
>          virConnectCompareHypervisorCPU;
> +        virConnectBaselineHypervisorCPU;
>  } LIBVIRT_4.1.0;
>  
>  # .... define new API here using predicted next version number ....
> 

Other than the nits above:

Reviewed-by: Collin Walling <walling@linux.ibm.com>

-- 
Respectfully,
- Collin Walling

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list