From nobody Fri Dec 19 06:33:46 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1571153747; cv=none; d=zoho.com; s=zohoarc; b=YsnpI/tV5giaUIyqTyL5Pe6oh/cix7hbcDChpF+PlhUjzqzvwv66naUaawioNDFpXejGOvD6riYY3J0uKuRehLu4zCyQHuPro1xv4hrmy05riKAW8XUu5IPjKUBTO8rI1kbtq0IR55cXJsy0LzL9A60d9sOj/V0rdgYKtbswrYw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1571153747; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=voM6eldG96CI0cNOS5Wl87BhkXw8/WYD9l0kW7fly7M=; b=BteDPILQLgEaNvRJcmVZQFqN+9AIwAepRpqkahxTytKhD90E7E68TGhtHY96eVNBkBl+6LwJbxgoAlO3SoU3oJ8xU/8MwAb1veLMRRRjy9ffGisYjMnMGegzxePu79hfG0sDE1b4Db7AjgdR4tAVPM4piL/RZd+ABc9VUuB3VBQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1571153747891787.9640683810098; Tue, 15 Oct 2019 08:35:47 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C9ED2300D1C8; Tue, 15 Oct 2019 15:35:45 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9B52E60BE2; Tue, 15 Oct 2019 15:35:45 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 50253180BA9A; Tue, 15 Oct 2019 15:35:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x9FFZG8E024671 for ; Tue, 15 Oct 2019 11:35:16 -0400 Received: by smtp.corp.redhat.com (Postfix) id 81D1C60BE2; Tue, 15 Oct 2019 15:35:16 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 308CE60C57 for ; Tue, 15 Oct 2019 15:35:16 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 8BF39101CDF; Tue, 15 Oct 2019 17:35:09 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Tue, 15 Oct 2019 17:34:54 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 18/31] qemu: Switch qemuCaps to use qemuMonitorCPUDefs X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Tue, 15 Oct 2019 15:35:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: J=C3=A1n Tomko --- 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; =20 virHashTablePtr domCapsCache; - virDomainCapsCPUModelsPtr kvmCPUModels; - virDomainCapsCPUModelsPtr tcgCPUModels; + qemuMonitorCPUDefsPtr kvmCPUModels; + qemuMonitorCPUDefsPtr tcgCPUModels; =20 size_t nmachineTypes; struct virQEMUCapsMachineType *machineTypes; @@ -1625,17 +1625,9 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qem= uCaps) =20 ret->arch =3D qemuCaps->arch; =20 - if (qemuCaps->kvmCPUModels) { - ret->kvmCPUModels =3D virDomainCapsCPUModelsCopy(qemuCaps->kvmCPUM= odels); - if (!ret->kvmCPUModels) - goto error; - } - - if (qemuCaps->tcgCPUModels) { - ret->tcgCPUModels =3D virDomainCapsCPUModelsCopy(qemuCaps->tcgCPUM= odels); - if (!ret->tcgCPUModels) - goto error; - } + if (qemuMonitorCPUDefsCopy(&ret->kvmCPUModels, qemuCaps->kvmCPUModels)= < 0 || + qemuMonitorCPUDefsCopy(&ret->tcgCPUModels, qemuCaps->tcgCPUModels)= < 0) + goto error; =20 if (virQEMUCapsHostCPUDataCopy(&ret->kvmCPU, &qemuCaps->kvmCPU) < 0 || virQEMUCapsHostCPUDataCopy(&ret->tcgCPU, &qemuCaps->tcgCPU) < 0) @@ -1861,25 +1853,36 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCap= s, virDomainCapsCPUUsable usable) { size_t i; - virDomainCapsCPUModelsPtr cpus =3D NULL; + size_t start; + qemuMonitorCPUDefsPtr defs =3D NULL; =20 if (type =3D=3D VIR_DOMAIN_VIRT_KVM && qemuCaps->kvmCPUModels) - cpus =3D qemuCaps->kvmCPUModels; + defs =3D qemuCaps->kvmCPUModels; else if (type =3D=3D VIR_DOMAIN_VIRT_QEMU && qemuCaps->tcgCPUModels) - cpus =3D qemuCaps->tcgCPUModels; + defs =3D qemuCaps->tcgCPUModels; + + if (defs) { + start =3D defs->ncpus; =20 - if (!cpus) { - if (!(cpus =3D virDomainCapsCPUModelsNew(count))) + if (VIR_EXPAND_N(defs->cpus, defs->ncpus, count) < 0) + return -1; + } else { + start =3D 0; + + if (!(defs =3D qemuMonitorCPUDefsNew(count))) return -1; =20 if (type =3D=3D VIR_DOMAIN_VIRT_KVM) - qemuCaps->kvmCPUModels =3D cpus; + qemuCaps->kvmCPUModels =3D defs; else - qemuCaps->tcgCPUModels =3D cpus; + qemuCaps->tcgCPUModels =3D defs; } =20 for (i =3D 0; i < count; i++) { - if (virDomainCapsCPUModelsAdd(cpus, name[i], usable, NULL) < 0) + qemuMonitorCPUDefInfoPtr cpu =3D defs->cpus + start + i; + + cpu->usable =3D usable; + if (VIR_STRDUP(cpu->name, name[i]) < 0) return -1; } =20 @@ -1928,20 +1931,17 @@ virQEMUCapsGetCPUModels(virQEMUCapsPtr qemuCaps, const char **modelWhitelist, const char **modelBlacklist) { - virDomainCapsCPUModelsPtr cpuModels; + qemuMonitorCPUDefsPtr defs; =20 if (type =3D=3D VIR_DOMAIN_VIRT_KVM) - cpuModels =3D qemuCaps->kvmCPUModels; + defs =3D qemuCaps->kvmCPUModels; else - cpuModels =3D qemuCaps->tcgCPUModels; + defs =3D qemuCaps->tcgCPUModels; =20 - if (!cpuModels) + if (!defs) return NULL; =20 - if (modelWhitelist || modelBlacklist) - return virDomainCapsCPUModelsFilter(cpuModels, modelWhitelist, mod= elBlacklist); - - return virDomainCapsCPUModelsCopy(cpuModels); + return virQEMUCapsCPUDefsToModels(defs, modelWhitelist, modelBlacklist= ); } =20 =20 @@ -2001,7 +2001,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, virDomainVirtType type, virCPUMode mode) { - virDomainCapsCPUModelsPtr cpus; + qemuMonitorCPUDefsPtr cpus; =20 switch (mode) { case VIR_CPU_MODE_HOST_PASSTHROUGH: @@ -2017,7 +2017,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, cpus =3D qemuCaps->kvmCPUModels; else cpus =3D qemuCaps->tcgCPUModels; - return cpus && cpus->nmodels > 0; + return cpus && cpus->ncpus > 0; =20 case VIR_CPU_MODE_LAST: break; @@ -2553,18 +2553,18 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qe= muCaps, qemuMonitorPtr mon, bool tcg) { - virDomainCapsCPUModelsPtr models =3D NULL; + qemuMonitorCPUDefsPtr defs =3D NULL; =20 if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS)) return 0; =20 - if (virQEMUCapsFetchCPUModels(mon, qemuCaps->arch, &models) < 0) + if (virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch, &defs) < 0) return -1; =20 if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) - qemuCaps->tcgCPUModels =3D models; + qemuCaps->tcgCPUModels =3D defs; else - qemuCaps->kvmCPUModels =3D models; + qemuCaps->kvmCPUModels =3D defs; =20 return 0; } @@ -3503,7 +3503,7 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, xmlXPathContextPtr ctxt, virDomainVirtType type) { - virDomainCapsCPUModelsPtr cpus =3D NULL; + VIR_AUTOPTR(qemuMonitorCPUDefs) defs =3D NULL; VIR_AUTOFREE(xmlNodePtr *) nodes =3D NULL; size_t i; int n; @@ -3523,20 +3523,14 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, if (n =3D=3D 0) return 0; =20 - if (!(cpus =3D virDomainCapsCPUModelsNew(n))) + if (!(defs =3D qemuMonitorCPUDefsNew(n))) return -1; =20 - if (type =3D=3D VIR_DOMAIN_VIRT_KVM) - qemuCaps->kvmCPUModels =3D cpus; - else - qemuCaps->tcgCPUModels =3D cpus; - for (i =3D 0; i < n; i++) { + qemuMonitorCPUDefInfoPtr cpu =3D defs->cpus + i; int usable =3D VIR_DOMCAPS_CPU_USABLE_UNKNOWN; VIR_AUTOFREE(char *) strUsable =3D NULL; - VIR_AUTOFREE(char *) name =3D NULL; VIR_AUTOFREE(xmlNodePtr *) blockerNodes =3D NULL; - VIR_AUTOSTRINGLIST blockers =3D NULL; int nblockers; =20 if ((strUsable =3D virXMLPropString(nodes[i], "usable")) && @@ -3546,8 +3540,9 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, strUsable); return -1; } + cpu->usable =3D usable; =20 - if (!(name =3D virXMLPropString(nodes[i], "name"))) { + if (!(cpu->name =3D virXMLPropString(nodes[i], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing cpu name in QEMU capabilities cache"= )); return -1; @@ -3567,11 +3562,11 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, if (nblockers > 0) { size_t j; =20 - if (VIR_ALLOC_N(blockers, nblockers + 1) < 0) + if (VIR_ALLOC_N(cpu->blockers, nblockers + 1) < 0) return -1; =20 for (j =3D 0; j < nblockers; j++) { - if (!(blockers[j] =3D virXMLPropString(blockerNodes[j], "n= ame"))) { + if (!(cpu->blockers[j] =3D virXMLPropString(blockerNodes[j= ], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing blocker name in QEMU " "capabilities cache")); @@ -3579,11 +3574,13 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, } } } - - if (virDomainCapsCPUModelsAddSteal(cpus, &name, usable, &blockers)= < 0) - return -1; } =20 + if (type =3D=3D VIR_DOMAIN_VIRT_KVM) + VIR_STEAL_PTR(qemuCaps->kvmCPUModels, defs); + else + VIR_STEAL_PTR(qemuCaps->tcgCPUModels, defs); + return 0; } =20 @@ -3993,23 +3990,23 @@ virQEMUCapsFormatCPUModels(virQEMUCapsPtr qemuCaps, virBufferPtr buf, virDomainVirtType type) { - virDomainCapsCPUModelsPtr cpus; + qemuMonitorCPUDefsPtr defs; const char *typeStr; size_t i; =20 if (type =3D=3D VIR_DOMAIN_VIRT_KVM) { typeStr =3D "kvm"; - cpus =3D qemuCaps->kvmCPUModels; + defs =3D qemuCaps->kvmCPUModels; } else { typeStr =3D "tcg"; - cpus =3D qemuCaps->tcgCPUModels; + defs =3D qemuCaps->tcgCPUModels; } =20 - if (!cpus) + if (!defs) return; =20 - for (i =3D 0; i < cpus->nmodels; i++) { - virDomainCapsCPUModelPtr cpu =3D cpus->models + i; + for (i =3D 0; i < defs->ncpus; i++) { + qemuMonitorCPUDefInfoPtr cpu =3D defs->cpus + i; =20 virBufferAsprintf(buf, "name); --=20 2.23.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list