[libvirt PATCH 6/9] libvirt: introduce virConnectGetHypervisorCPUModelDefinition public API

Tim Wiederhake posted 9 patches 3 years, 7 months ago
[libvirt PATCH 6/9] libvirt: introduce virConnectGetHypervisorCPUModelDefinition public API
Posted by Tim Wiederhake 3 years, 7 months ago
Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
---
 include/libvirt/libvirt-host.h |  7 +++++
 src/driver-hypervisor.h        |  9 ++++++
 src/libvirt-host.c             | 54 ++++++++++++++++++++++++++++++++++
 src/libvirt_public.syms        |  1 +
 4 files changed, 71 insertions(+)

diff --git a/include/libvirt/libvirt-host.h b/include/libvirt/libvirt-host.h
index 5aaa001adb..ad11c1172d 100644
--- a/include/libvirt/libvirt-host.h
+++ b/include/libvirt/libvirt-host.h
@@ -968,6 +968,13 @@ int virConnectGetHypervisorCPUModelNames(virConnectPtr conn,
                                          char ***aliases,
                                          unsigned int flags);
 
+int virConnectGetHypervisorCPUModelDefinition(virConnectPtr conn,
+                                              const char *arch,
+                                              const char *machine,
+                                              const char *name,
+                                              char **xmlCPU,
+                                              unsigned int flags);
+
 /**
  * virConnectBaselineCPUFlags:
  *
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index c81e5d4c75..b016ec7775 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -739,6 +739,14 @@ typedef int
                                            char ***aliases,
                                            unsigned int flags);
 
+typedef int
+(*virDrvConnectGetHypervisorCPUModelDefinition)(virConnectPtr conn,
+                                                const char *arch,
+                                                const char *machine,
+                                                const char *name,
+                                                char **xmlCPU,
+                                                unsigned int flags);
+
 typedef int
 (*virDrvDomainGetJobInfo)(virDomainPtr domain,
                           virDomainJobInfoPtr info);
@@ -1720,4 +1728,5 @@ struct _virHypervisorDriver {
     virDrvDomainGetMessages domainGetMessages;
     virDrvDomainStartDirtyRateCalc domainStartDirtyRateCalc;
     virDrvConnectGetHypervisorCPUModelNames connectGetHypervisorCPUModelNames;
+    virDrvConnectGetHypervisorCPUModelDefinition connectGetHypervisorCPUModelDefinition;
 };
diff --git a/src/libvirt-host.c b/src/libvirt-host.c
index 6e734628c1..8875f67a7b 100644
--- a/src/libvirt-host.c
+++ b/src/libvirt-host.c
@@ -1288,6 +1288,60 @@ virConnectGetHypervisorCPUModelNames(virConnectPtr conn,
     return -1;
 }
 
+/**
+ * virConnectGetHypervisorCPUModelDefinition:
+ *
+ * @conn: virConnect connection
+ * @arch: Architecture
+ * @machine: Machine type
+ * @name: CPU model name
+ * @xmlCPU: XML description of the CPUs
+ * @flags: extra flags; not used yet, so callers should always pass 0.
+ *
+ * Get the description of a specific hypervisor cpu model for a given machine
+ * type and architecture.
+ *
+ * Returns 0 on success, -1 otherwise.
+ *
+ * Since: 8.5.0
+ */
+int
+virConnectGetHypervisorCPUModelDefinition(virConnectPtr conn,
+                                          const char *arch,
+                                          const char *machine,
+                                          const char *name,
+                                          char **xmlCPU,
+                                          unsigned int flags)
+{
+    VIR_DEBUG("conn=%p, arch=%s, machine=%s, model=%s, flags=0x%x", conn,
+              NULLSTR(arch), NULLSTR(machine), NULLSTR(name), flags);
+    virResetLastError();
+
+    virCheckConnectReturn(conn, -1);
+    virCheckNonNullArgGoto(arch, error);
+    virCheckNonNullArgGoto(machine, error);
+    virCheckNonNullArgGoto(name, error);
+
+    if (conn->driver->connectGetHypervisorCPUModelDefinition) {
+        int ret;
+
+        ret = conn->driver->connectGetHypervisorCPUModelDefinition(conn, arch,
+                                                                   machine,
+                                                                   name,
+                                                                   xmlCPU,
+                                                                   flags);
+        if (ret < 0)
+            goto error;
+
+        return ret;
+    }
+
+    virReportUnsupportedError();
+
+ error:
+    virDispatchError(conn);
+    return -1;
+}
 
 /**
  * virConnectBaselineCPU:
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index c6a8e898ae..15ef29d07d 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -924,6 +924,7 @@ LIBVIRT_8.4.0 {
 
 LIBVIRT_8.5.0 {
     global:
+        virConnectGetHypervisorCPUModelDefinition;
         virConnectGetHypervisorCPUModelNames;
         virDomainAbortJobFlags;
 } LIBVIRT_8.4.0;
-- 
2.31.1
Re: [libvirt PATCH 6/9] libvirt: introduce virConnectGetHypervisorCPUModelDefinition public API
Posted by Daniel P. Berrangé 3 years, 6 months ago
On Tue, Jun 28, 2022 at 06:09:43PM +0200, Tim Wiederhake wrote:
> Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
> ---
>  include/libvirt/libvirt-host.h |  7 +++++
>  src/driver-hypervisor.h        |  9 ++++++
>  src/libvirt-host.c             | 54 ++++++++++++++++++++++++++++++++++
>  src/libvirt_public.syms        |  1 +
>  4 files changed, 71 insertions(+)
> 
> diff --git a/include/libvirt/libvirt-host.h b/include/libvirt/libvirt-host.h
> index 5aaa001adb..ad11c1172d 100644
> --- a/include/libvirt/libvirt-host.h
> +++ b/include/libvirt/libvirt-host.h
> @@ -968,6 +968,13 @@ int virConnectGetHypervisorCPUModelNames(virConnectPtr conn,
>                                           char ***aliases,
>                                           unsigned int flags);
>  
> +int virConnectGetHypervisorCPUModelDefinition(virConnectPtr conn,
> +                                              const char *arch,
> +                                              const char *machine,

Now we've got machine + arch, but still haven't got 'virttype' and
'emulator' parameters

> +                                              const char *name,
> +                                              char **xmlCPU,
> +                                              unsigned int flags);
> +


> diff --git a/src/libvirt-host.c b/src/libvirt-host.c
> index 6e734628c1..8875f67a7b 100644
> --- a/src/libvirt-host.c
> +++ b/src/libvirt-host.c
> @@ -1288,6 +1288,60 @@ virConnectGetHypervisorCPUModelNames(virConnectPtr conn,
>      return -1;
>  }
>  
> +/**
> + * virConnectGetHypervisorCPUModelDefinition:
> + *
> + * @conn: virConnect connection
> + * @arch: Architecture
> + * @machine: Machine type

Should be optional, defaulting to the default machine type if omitted.

For that matter, arch should be optional too

> + * @name: CPU model name
> + * @xmlCPU: XML description of the CPUs
> + * @flags: extra flags; not used yet, so callers should always pass 0.
> + *
> + * Get the description of a specific hypervisor cpu model for a given machine
> + * type and architecture.
> + *
> + * Returns 0 on success, -1 otherwise.
> + *
> + * Since: 8.5.0
> + */
> +int
> +virConnectGetHypervisorCPUModelDefinition(virConnectPtr conn,
> +                                          const char *arch,
> +                                          const char *machine,
> +                                          const char *name,
> +                                          char **xmlCPU,
> +                                          unsigned int flags)
> +{
> +    VIR_DEBUG("conn=%p, arch=%s, machine=%s, model=%s, flags=0x%x", conn,
> +              NULLSTR(arch), NULLSTR(machine), NULLSTR(name), flags);
> +    virResetLastError();
> +
> +    virCheckConnectReturn(conn, -1);
> +    virCheckNonNullArgGoto(arch, error);
> +    virCheckNonNullArgGoto(machine, error);
> +    virCheckNonNullArgGoto(name, error);
> +
> +    if (conn->driver->connectGetHypervisorCPUModelDefinition) {
> +        int ret;
> +
> +        ret = conn->driver->connectGetHypervisorCPUModelDefinition(conn, arch,
> +                                                                   machine,
> +                                                                   name,
> +                                                                   xmlCPU,
> +                                                                   flags);
> +        if (ret < 0)
> +            goto error;
> +
> +        return ret;
> +    }
> +
> +    virReportUnsupportedError();
> +
> + error:
> +    virDispatchError(conn);
> +    return -1;
> +}
>  
>  /**
>   * virConnectBaselineCPU:
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index c6a8e898ae..15ef29d07d 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -924,6 +924,7 @@ LIBVIRT_8.4.0 {
>  
>  LIBVIRT_8.5.0 {
>      global:
> +        virConnectGetHypervisorCPUModelDefinition;
>          virConnectGetHypervisorCPUModelNames;
>          virDomainAbortJobFlags;
>  } LIBVIRT_8.4.0;
> -- 
> 2.31.1
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
Re: [libvirt PATCH 6/9] libvirt: introduce virConnectGetHypervisorCPUModelDefinition public API
Posted by Daniel P. Berrangé 3 years, 6 months ago
On Mon, Jul 18, 2022 at 11:26:07AM +0100, Daniel P. Berrangé wrote:
> On Tue, Jun 28, 2022 at 06:09:43PM +0200, Tim Wiederhake wrote:
> > Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
> > ---
> >  include/libvirt/libvirt-host.h |  7 +++++
> >  src/driver-hypervisor.h        |  9 ++++++
> >  src/libvirt-host.c             | 54 ++++++++++++++++++++++++++++++++++
> >  src/libvirt_public.syms        |  1 +
> >  4 files changed, 71 insertions(+)
> > 
> > diff --git a/include/libvirt/libvirt-host.h b/include/libvirt/libvirt-host.h
> > index 5aaa001adb..ad11c1172d 100644
> > --- a/include/libvirt/libvirt-host.h
> > +++ b/include/libvirt/libvirt-host.h
> > @@ -968,6 +968,13 @@ int virConnectGetHypervisorCPUModelNames(virConnectPtr conn,
> >                                           char ***aliases,
> >                                           unsigned int flags);
> >  
> > +int virConnectGetHypervisorCPUModelDefinition(virConnectPtr conn,
> > +                                              const char *arch,
> > +                                              const char *machine,
> 
> Now we've got machine + arch, but still haven't got 'virttype' and
> 'emulator' parameters
> 
> > +                                              const char *name,
> > +                                              char **xmlCPU,
> > +                                              unsigned int flags);
> > +

I'm not actually convinced this new API is needed at all. Thue
virConnectBaselineHypervisorCPU API has a flag
VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES to let you expand all
features in a given CPU model name.


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|