From nobody Sun Feb 8 12:14:36 2026 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.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; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1492090443203845.736795725203; Thu, 13 Apr 2017 06:34:03 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E62638FCE2; Thu, 13 Apr 2017 13:34:00 +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 52F7A9ECF7; Thu, 13 Apr 2017 13:34:00 +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 731FD1853D11; Thu, 13 Apr 2017 13:33:14 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v3DDX7U8013108 for ; Thu, 13 Apr 2017 09:33:07 -0400 Received: by smtp.corp.redhat.com (Postfix) id 60A3DACD54; Thu, 13 Apr 2017 13:33:07 +0000 (UTC) Received: from virval.usersys.redhat.com (dhcp129-92.brq.redhat.com [10.34.129.92]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 103CFC05CD for ; Thu, 13 Apr 2017 13:33:00 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id B85401041AA; Thu, 13 Apr 2017 15:32:59 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E62638FCE2 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E62638FCE2 From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 13 Apr 2017 15:32:53 +0200 Message-Id: <63d00903f83d07e5a08aed4f08b1fb85addc0a23.1492090347.git.jdenemar@redhat.com> In-Reply-To: References: In-Reply-To: References: Mail-Followup-To: libvir-list@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 4/9] qemu: Move qemuCaps host CPU data in a struct 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: , MIME-Version: 1.0 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.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Thu, 13 Apr 2017 13:34:01 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" We need to store several CPU related data structure for both KVM and TCG. So instead of keeping two different copies of everything let's make a virQEMUCapsHostCPUData struct and use it twice. Signed-off-by: Jiri Denemark --- src/qemu/qemu_capabilities.c | 166 +++++++++++++++++++++------------------= ---- 1 file changed, 81 insertions(+), 85 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 6f0d6287e..f914154be 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -373,6 +373,19 @@ struct virQEMUCapsMachineType { unsigned int maxCpus; bool hotplugCpus; }; + +typedef struct _virQEMUCapsHostCPUData virQEMUCapsHostCPUData; +typedef virQEMUCapsHostCPUData *virQEMUCapsHostCPUDataPtr; +struct _virQEMUCapsHostCPUData { + /* Only the "info" part is stored in the capabilities cache, the rest = is + * re-computed from other fields and external data sources everytime we + * probe QEMU or load the cache. + */ + qemuMonitorCPUModelInfoPtr info; + /* Host CPU definition reported in domain capabilities. */ + virCPUDefPtr reported; +}; + /* * Update the XML parser/formatter when adding more * information to this struct so that it gets cached @@ -407,15 +420,8 @@ struct _virQEMUCaps { size_t ngicCapabilities; virGICCapability *gicCapabilities; =20 - qemuMonitorCPUModelInfoPtr kvmCPUModelInfo; - qemuMonitorCPUModelInfoPtr tcgCPUModelInfo; - - /* Anything below is not stored in the cache since the values are - * re-computed from the other fields or external data sources every - * time we probe QEMU or load the results from the cache. - */ - virCPUDefPtr kvmCPUModel; - virCPUDefPtr tcgCPUModel; + virQEMUCapsHostCPUData kvmCPU; + virQEMUCapsHostCPUData tcgCPU; }; =20 struct virQEMUCapsSearchData { @@ -2119,23 +2125,15 @@ virQEMUCapsNew(void) =20 =20 static int -virQEMUCapsHostCPUDataCopy(virQEMUCapsPtr dst, - virQEMUCapsPtr src) +virQEMUCapsHostCPUDataCopy(virQEMUCapsHostCPUDataPtr dst, + virQEMUCapsHostCPUDataPtr src) { - if (src->kvmCPUModel && - !(dst->kvmCPUModel =3D virCPUDefCopy(src->kvmCPUModel))) + if (src->info && + !(dst->info =3D qemuMonitorCPUModelInfoCopy(src->info))) return -1; =20 - if (src->tcgCPUModel && - !(dst->tcgCPUModel =3D virCPUDefCopy(src->tcgCPUModel))) - return -1; - - if (src->kvmCPUModelInfo && - !(dst->kvmCPUModelInfo =3D qemuMonitorCPUModelInfoCopy(src->kvmCPU= ModelInfo))) - return -1; - - if (src->tcgCPUModelInfo && - !(dst->tcgCPUModelInfo =3D qemuMonitorCPUModelInfoCopy(src->tcgCPU= ModelInfo))) + if (src->reported && + !(dst->reported =3D virCPUDefCopy(src->reported))) return -1; =20 return 0; @@ -2143,17 +2141,12 @@ virQEMUCapsHostCPUDataCopy(virQEMUCapsPtr dst, =20 =20 static void -virQEMUCapsHostCPUDataClear(virQEMUCapsPtr qemuCaps) +virQEMUCapsHostCPUDataClear(virQEMUCapsHostCPUDataPtr cpuData) { - qemuMonitorCPUModelInfoFree(qemuCaps->kvmCPUModelInfo); - qemuMonitorCPUModelInfoFree(qemuCaps->tcgCPUModelInfo); - qemuCaps->kvmCPUModelInfo =3D NULL; - qemuCaps->tcgCPUModelInfo =3D NULL; + qemuMonitorCPUModelInfoFree(cpuData->info); + virCPUDefFree(cpuData->reported); =20 - virCPUDefFree(qemuCaps->kvmCPUModel); - virCPUDefFree(qemuCaps->tcgCPUModel); - qemuCaps->kvmCPUModel =3D NULL; - qemuCaps->tcgCPUModel =3D NULL; + memset(cpuData, '\0', sizeof(*cpuData)); } =20 =20 @@ -2194,7 +2187,8 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemu= Caps) goto error; } =20 - if (virQEMUCapsHostCPUDataCopy(ret, qemuCaps) < 0) + if (virQEMUCapsHostCPUDataCopy(&ret->kvmCPU, &qemuCaps->kvmCPU) < 0 || + virQEMUCapsHostCPUDataCopy(&ret->tcgCPU, &qemuCaps->tcgCPU) < 0) goto error; =20 if (VIR_ALLOC_N(ret->machineTypes, qemuCaps->nmachineTypes) < 0) @@ -2243,7 +2237,8 @@ void virQEMUCapsDispose(void *obj) =20 VIR_FREE(qemuCaps->gicCapabilities); =20 - virQEMUCapsHostCPUDataClear(qemuCaps); + virQEMUCapsHostCPUDataClear(&qemuCaps->kvmCPU); + virQEMUCapsHostCPUDataClear(&qemuCaps->tcgCPU); } =20 void @@ -2467,14 +2462,24 @@ virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCap= s, } =20 =20 +static virQEMUCapsHostCPUDataPtr +virQEMUCapsGetHostCPUData(virQEMUCapsPtr qemuCaps, + virDomainVirtType type) +{ + if (type =3D=3D VIR_DOMAIN_VIRT_KVM) + return &qemuCaps->kvmCPU; + else + return &qemuCaps->tcgCPU; +} + + virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps, virDomainVirtType type) { - if (type =3D=3D VIR_DOMAIN_VIRT_KVM) - return qemuCaps->kvmCPUModel; - else - return qemuCaps->tcgCPUModel; + virQEMUCapsHostCPUDataPtr cpuData =3D virQEMUCapsGetHostCPUData(qemuCa= ps, type); + + return cpuData->reported; } =20 =20 @@ -2483,10 +2488,9 @@ virQEMUCapsSetHostModel(virQEMUCapsPtr qemuCaps, virDomainVirtType type, virCPUDefPtr cpu) { - if (type =3D=3D VIR_DOMAIN_VIRT_KVM) - qemuCaps->kvmCPUModel =3D cpu; - else - qemuCaps->tcgCPUModel =3D cpu; + virQEMUCapsHostCPUDataPtr cpuData =3D virQEMUCapsGetHostCPUData(qemuCa= ps, type); + + cpuData->reported =3D cpu; } =20 =20 @@ -2882,24 +2886,28 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps, qemuMonitorPtr mon, bool tcg) { - qemuMonitorCPUModelInfoPtr *modelInfo; + qemuMonitorCPUModelInfoPtr modelInfo =3D NULL; qemuMonitorCPUModelInfoPtr nonMigratable =3D NULL; virHashTablePtr hash =3D NULL; const char *model; qemuMonitorCPUModelExpansionType type; + virDomainVirtType virtType; + virQEMUCapsHostCPUDataPtr cpuData; int ret =3D -1; =20 if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION)) return 0; =20 if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) { - modelInfo =3D &qemuCaps->tcgCPUModelInfo; + virtType =3D VIR_DOMAIN_VIRT_QEMU; model =3D "max"; } else { - modelInfo =3D &qemuCaps->kvmCPUModelInfo; + virtType =3D VIR_DOMAIN_VIRT_KVM; model =3D "host"; } =20 + cpuData =3D virQEMUCapsGetHostCPUData(qemuCaps, virtType); + /* Some x86_64 features defined in cpu_map.xml use spelling which diff= er * from the one preferred by QEMU. Static expansion would give us only= the * preferred spelling, thus we need to do a full expansion on the resu= lt of @@ -2910,14 +2918,14 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps, else type =3D QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC; =20 - if (qemuMonitorGetCPUModelExpansion(mon, type, model, true, modelInfo)= < 0) - return -1; + if (qemuMonitorGetCPUModelExpansion(mon, type, model, true, &modelInfo= ) < 0) + goto cleanup; =20 /* Try to check migratability of each feature. */ - if (*modelInfo && + if (modelInfo && qemuMonitorGetCPUModelExpansion(mon, type, model, false, &nonMigratable) < 0) - goto error; + goto cleanup; =20 if (nonMigratable) { qemuMonitorCPUPropertyPtr prop; @@ -2925,12 +2933,12 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps, size_t i; =20 if (!(hash =3D virHashCreate(0, NULL))) - goto error; + goto cleanup; =20 - for (i =3D 0; i < (*modelInfo)->nprops; i++) { - prop =3D (*modelInfo)->props + i; + for (i =3D 0; i < modelInfo->nprops; i++) { + prop =3D modelInfo->props + i; if (virHashAddEntry(hash, prop->name, prop) < 0) - goto error; + goto cleanup; } =20 for (i =3D 0; i < nonMigratable->nprops; i++) { @@ -2948,21 +2956,18 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps, } } =20 - (*modelInfo)->migratability =3D true; + modelInfo->migratability =3D true; } =20 + VIR_STEAL_PTR(cpuData->info, modelInfo); ret =3D 0; =20 cleanup: virHashFree(hash); qemuMonitorCPUModelInfoFree(nonMigratable); + qemuMonitorCPUModelInfoFree(modelInfo); =20 return ret; - - error: - qemuMonitorCPUModelInfoFree(*modelInfo); - *modelInfo =3D NULL; - goto cleanup; } =20 struct tpmTypeToCaps { @@ -3315,21 +3320,19 @@ virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps, virCPUDefPtr cpu, bool migratable) { - qemuMonitorCPUModelInfoPtr model; + virQEMUCapsHostCPUDataPtr cpuData =3D virQEMUCapsGetHostCPUData(qemuCa= ps, type); int ret =3D 1; =20 - if (type =3D=3D VIR_DOMAIN_VIRT_KVM) - model =3D qemuCaps->kvmCPUModelInfo; - else - model =3D qemuCaps->tcgCPUModelInfo; - - if (migratable && model && !model->migratability) + if (migratable && cpuData->info && !cpuData->info->migratability) return 1; =20 - if (ARCH_IS_S390(qemuCaps->arch)) - ret =3D virQEMUCapsInitCPUModelS390(qemuCaps, model, cpu, migratab= le); - else if (ARCH_IS_X86(qemuCaps->arch)) - ret =3D virQEMUCapsInitCPUModelX86(qemuCaps, type, model, cpu, mig= ratable); + if (ARCH_IS_S390(qemuCaps->arch)) { + ret =3D virQEMUCapsInitCPUModelS390(qemuCaps, cpuData->info, + cpu, migratable); + } else if (ARCH_IS_X86(qemuCaps->arch)) { + ret =3D virQEMUCapsInitCPUModelX86(qemuCaps, type, cpuData->info, + cpu, migratable); + } =20 if (ret =3D=3D 0) cpu->fallback =3D VIR_CPU_FALLBACK_FORBID; @@ -3389,10 +3392,9 @@ virQEMUCapsSetCPUModelInfo(virQEMUCapsPtr qemuCaps, virDomainVirtType type, qemuMonitorCPUModelInfoPtr modelInfo) { - if (type =3D=3D VIR_DOMAIN_VIRT_KVM) - qemuCaps->kvmCPUModelInfo =3D modelInfo; - else - qemuCaps->tcgCPUModelInfo =3D modelInfo; + virQEMUCapsHostCPUDataPtr cpuData =3D virQEMUCapsGetHostCPUData(qemuCa= ps, type); + + cpuData->info =3D modelInfo; } =20 =20 @@ -3851,18 +3853,11 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qe= muCaps, virBufferPtr buf, virDomainVirtType type) { - qemuMonitorCPUModelInfoPtr model; - const char *typeStr; + virQEMUCapsHostCPUDataPtr cpuData =3D virQEMUCapsGetHostCPUData(qemuCa= ps, type); + qemuMonitorCPUModelInfoPtr model =3D cpuData->info; + const char *typeStr =3D type =3D=3D VIR_DOMAIN_VIRT_KVM ? "kvm" : "tcg= "; size_t i; =20 - if (type =3D=3D VIR_DOMAIN_VIRT_KVM) { - typeStr =3D "kvm"; - model =3D qemuCaps->kvmCPUModelInfo; - } else { - typeStr =3D "tcg"; - model =3D qemuCaps->tcgCPUModelInfo; - } - if (!model) return; =20 @@ -4121,7 +4116,8 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps) VIR_FREE(qemuCaps->gicCapabilities); qemuCaps->ngicCapabilities =3D 0; =20 - virQEMUCapsHostCPUDataClear(qemuCaps); + virQEMUCapsHostCPUDataClear(&qemuCaps->kvmCPU); + virQEMUCapsHostCPUDataClear(&qemuCaps->tcgCPU); } =20 =20 --=20 2.12.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list