[libvirt] [PATCH v2 18/31] qemu: Switch qemuCaps to use qemuMonitorCPUDefs

Ján Tomko jtomko at redhat.com
Wed Oct 16 15:26:03 UTC 2019


On Tue, Oct 15, 2019 at 05:34:54PM +0200, Jiri Denemark wrote:
>We will need to keep some QEMU-specific data for each CPU model
>supported by a QEMU binary. Instead of complicating the generic
>virDomainCapsCPUModelsPtr, we can just directly store
>qemuMonitorCPUDefsPtr returned by the capabilities probing code.
>
>Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
>---
>
>Notes:
>    Version 2:
>    - adapted to changes made by the new patches
>
> src/qemu/qemu_capabilities.c | 109 +++++++++++++++++------------------
> 1 file changed, 53 insertions(+), 56 deletions(-)
>
>diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>index 436d65f578..a274cef120 100644
>--- a/src/qemu/qemu_capabilities.c
>+++ b/src/qemu/qemu_capabilities.c
>@@ -607,8 +607,8 @@ struct _virQEMUCaps {
>     virArch arch;
>
>     virHashTablePtr domCapsCache;
>-    virDomainCapsCPUModelsPtr kvmCPUModels;
>-    virDomainCapsCPUModelsPtr tcgCPUModels;
>+    qemuMonitorCPUDefsPtr kvmCPUModels;
>+    qemuMonitorCPUDefsPtr tcgCPUModels;
>
>     size_t nmachineTypes;
>     struct virQEMUCapsMachineType *machineTypes;
>@@ -1625,17 +1625,9 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
>
>     ret->arch = qemuCaps->arch;
>
>-    if (qemuCaps->kvmCPUModels) {
>-        ret->kvmCPUModels = virDomainCapsCPUModelsCopy(qemuCaps->kvmCPUModels);
>-        if (!ret->kvmCPUModels)
>-            goto error;
>-    }
>-
>-    if (qemuCaps->tcgCPUModels) {
>-        ret->tcgCPUModels = virDomainCapsCPUModelsCopy(qemuCaps->tcgCPUModels);
>-        if (!ret->tcgCPUModels)
>-            goto error;
>-    }
>+    if (qemuMonitorCPUDefsCopy(&ret->kvmCPUModels, qemuCaps->kvmCPUModels) < 0 ||
>+        qemuMonitorCPUDefsCopy(&ret->tcgCPUModels, qemuCaps->tcgCPUModels) < 0)
>+        goto error;
>
>     if (virQEMUCapsHostCPUDataCopy(&ret->kvmCPU, &qemuCaps->kvmCPU) < 0 ||
>         virQEMUCapsHostCPUDataCopy(&ret->tcgCPU, &qemuCaps->tcgCPU) < 0)
>@@ -1861,25 +1853,36 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps,
>                              virDomainCapsCPUUsable usable)
> {
>     size_t i;
>-    virDomainCapsCPUModelsPtr cpus = NULL;
>+    size_t start;
>+    qemuMonitorCPUDefsPtr defs = NULL;
>
>     if (type == VIR_DOMAIN_VIRT_KVM && qemuCaps->kvmCPUModels)
>-        cpus = qemuCaps->kvmCPUModels;
>+        defs = qemuCaps->kvmCPUModels;
>     else if (type == VIR_DOMAIN_VIRT_QEMU && qemuCaps->tcgCPUModels)
>-        cpus = qemuCaps->tcgCPUModels;
>+        defs = qemuCaps->tcgCPUModels;
>+
>+    if (defs) {
>+        start = defs->ncpus;
>
>-    if (!cpus) {
>-        if (!(cpus = virDomainCapsCPUModelsNew(count)))
>+        if (VIR_EXPAND_N(defs->cpus, defs->ncpus, count) < 0)
>+            return -1;
>+    } else {
>+        start = 0;
>+
>+        if (!(defs = qemuMonitorCPUDefsNew(count)))
>             return -1;
>
>         if (type == VIR_DOMAIN_VIRT_KVM)
>-            qemuCaps->kvmCPUModels = cpus;
>+            qemuCaps->kvmCPUModels = defs;
>         else
>-            qemuCaps->tcgCPUModels = cpus;
>+            qemuCaps->tcgCPUModels = defs;
>     }
>
>     for (i = 0; i < count; i++) {
>-        if (virDomainCapsCPUModelsAdd(cpus, name[i], usable, NULL) < 0)
>+        qemuMonitorCPUDefInfoPtr cpu = defs->cpus + start + i;
>+
>+        cpu->usable = usable;

This fails to compile with my CLang:
    qemu/qemu_capabilities.c:1884:23: error: implicit conversion from enumeration type 'virDomainCapsCPUUsable' to different enumeration type 'virTristateBool' [-Werror,-Wenum-conversion]
            cpu->usable = usable;
                        ~ ^~~~~~

An explicit cast works:
  cpu->usable = (virTristateBool)usable;
but I forgot what is our preferred spacing for casts again.

>+        if (VIR_STRDUP(cpu->name, name[i]) < 0)

consider g_strdup

>             return -1;
>     }
>
>@@ -3503,7 +3503,7 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
>                          xmlXPathContextPtr ctxt,
>                          virDomainVirtType type)
> {
>-    virDomainCapsCPUModelsPtr cpus = NULL;
>+    VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL;

g_autoptr

>     VIR_AUTOFREE(xmlNodePtr *) nodes = NULL;
>     size_t i;
>     int n;
>@@ -3579,11 +3574,13 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
>                 }
>             }
>         }
>-
>-        if (virDomainCapsCPUModelsAddSteal(cpus, &name, usable, &blockers) < 0)
>-            return -1;
>     }
>
>+    if (type == VIR_DOMAIN_VIRT_KVM)
>+        VIR_STEAL_PTR(qemuCaps->kvmCPUModels, defs);
>+    else
>+        VIR_STEAL_PTR(qemuCaps->tcgCPUModels, defs);

g_steal_pointer

>+
>     return 0;
> }
>

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

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20191016/8d30cb7a/attachment-0001.sig>


More information about the libvir-list mailing list