From nobody Wed Dec 17 03:04:41 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.24 as permitted sender) client-ip=209.132.183.24; envelope-from=libvir-list-bounces@redhat.com; helo=mx3-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.24 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by mx.zohomail.com with SMTPS id 1487154327943833.1016077408929; Wed, 15 Feb 2017 02:25:27 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v1FAGxsT002040; Wed, 15 Feb 2017 05:17:00 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v1FAFXMb003159 for ; Wed, 15 Feb 2017 05:15:33 -0500 Received: by smtp.corp.redhat.com (Postfix) id 6E138233DB; Wed, 15 Feb 2017 10:15:33 +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 E44AD244A2 for ; Wed, 15 Feb 2017 10:15:32 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 72E141020D3; Wed, 15 Feb 2017 11:15:29 +0100 (CET) From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 15 Feb 2017 11:15:05 +0100 Message-Id: In-Reply-To: References: In-Reply-To: References: Mail-Followup-To: libvir-list@redhat.com X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 11/33] qemu: Store more types in qemuMonitorCPUModelInfo 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-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" While query-cpu-model-expansion returns only boolean features on s390, but x86_64 reports some integer and string properties which we are interested in. Signed-off-by: Jiri Denemark --- src/qemu/qemu_capabilities.c | 84 ++++++++++++++++----= ---- src/qemu/qemu_monitor.c | 22 ++++++- src/qemu/qemu_monitor.h | 23 +++++-- src/qemu/qemu_monitor_json.c | 37 ++++++++--- tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml | 7 ++ 5 files changed, 133 insertions(+), 40 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index aab336954..466852d13 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3074,14 +3074,16 @@ virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps, cpu->nfeatures =3D 0; =20 for (i =3D 0; i < modelInfo->nprops; i++) { - if (VIR_STRDUP(cpu->features[i].name, modelInfo->props[i].name) < = 0) + virCPUFeatureDefPtr feature =3D cpu->features + cpu->nfeatures; + qemuMonitorCPUPropertyPtr prop =3D modelInfo->props + i; + + if (prop->type !=3D QEMU_MONITOR_CPU_PROPERTY_BOOLEAN) + continue; + + if (VIR_STRDUP(feature->name, prop->name) < 0) return -1; - - if (modelInfo->props[i].supported) - cpu->features[i].policy =3D VIR_CPU_FEATURE_REQUIRE; - else - cpu->features[i].policy =3D VIR_CPU_FEATURE_DISABLE; - + feature->policy =3D prop->value.boolean ? VIR_CPU_FEATURE_REQUIRE + : VIR_CPU_FEATURE_DISABLE; cpu->nfeatures++; } =20 @@ -3154,7 +3156,6 @@ static int virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, xmlXPathContextPtr ctxt) { - char *str =3D NULL; xmlNodePtr hostCPUNode; xmlNodePtr *featureNodes =3D NULL; xmlNodePtr oldnode =3D ctxt->node; @@ -3187,30 +3188,47 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemu= Caps, hostCPU->nprops =3D n; =20 for (i =3D 0; i < n; i++) { - hostCPU->props[i].name =3D virXMLPropString(featureNodes[i], "= name"); - if (!hostCPU->props[i].name) { + qemuMonitorCPUPropertyPtr prop =3D hostCPU->props + i; + ctxt->node =3D featureNodes[i]; + + if (!(prop->name =3D virXMLPropString(ctxt->node, "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing 'name' attribute for a host CPU" " model property in QEMU capabilities cac= he")); goto cleanup; } =20 - if (!(str =3D virXMLPropString(featureNodes[i], "boolean"))) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("missing 'boolean' attribute for a host C= PU" - " model property in QEMU capabilities cac= he")); - goto cleanup; - } - if (STREQ(str, "yes")) { - hostCPU->props[i].supported =3D true; - } else if (STREQ(str, "no")) { - hostCPU->props[i].supported =3D false; + if (virXPathBoolean("boolean(./@boolean)", ctxt)) { + if (virXPathBoolean("./@boolean=3D'yes'", ctxt)) + prop->value.boolean =3D true; + prop->type =3D QEMU_MONITOR_CPU_PROPERTY_BOOLEAN; + } else if (virXPathBoolean("boolean(./@string)", ctxt)) { + prop->value.string =3D virXMLPropString(ctxt->node, "strin= g"); + if (!prop->value.string) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid string value for '%s' host C= PU " + "model property in QEMU capabilities = cache"), + prop->name); + goto cleanup; + } + prop->type =3D QEMU_MONITOR_CPU_PROPERTY_STRING; + } else if (virXPathBoolean("boolean(./@ull)", ctxt)) { + if (virXPathULongLong("string(./@ull)", ctxt, + &prop->value.ull) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid integer value for '%s' host = CPU " + "model property in QEMU capabilities = cache"), + prop->name); + goto cleanup; + } + prop->type =3D QEMU_MONITOR_CPU_PROPERTY_ULL; } else { virReportError(VIR_ERR_INTERNAL_ERROR, - _("invalid boolean value: '%s'"), str); + _("missing value for '%s' host CPU model " + "property in QEMU capabilities cache"), + prop->name); goto cleanup; } - VIR_FREE(str); } } =20 @@ -3220,7 +3238,6 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCa= ps, =20 cleanup: ctxt->node =3D oldnode; - VIR_FREE(str); VIR_FREE(featureNodes); qemuMonitorCPUModelInfoFree(hostCPU); return ret; @@ -3552,9 +3569,24 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qem= uCaps, virBufferAdjustIndent(buf, 2); =20 for (i =3D 0; i < model->nprops; i++) { - virBufferAsprintf(buf, "\n", - model->props[i].name, - model->props[i].supported ? "yes" : "no"); + qemuMonitorCPUPropertyPtr prop =3D model->props + i; + + switch (prop->type) { + case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN: + virBufferAsprintf(buf, "= \n", + prop->name, prop->value.boolean ? "yes" : "n= o"); + break; + + case QEMU_MONITOR_CPU_PROPERTY_STRING: + virBufferAsprintf(buf, "name); + virBufferEscapeString(buf, "string=3D'%s'/>\n", prop->value.st= ring); + break; + + case QEMU_MONITOR_CPU_PROPERTY_ULL: + virBufferAsprintf(buf, "\n= ", + prop->name, prop->value.ull); + break; + } } =20 virBufferAdjustIndent(buf, -2); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index b15207a69..a434b234b 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3661,8 +3661,11 @@ qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfoP= tr model_info) if (!model_info) return; =20 - for (i =3D 0; i < model_info->nprops; i++) + for (i =3D 0; i < model_info->nprops; i++) { VIR_FREE(model_info->props[i].name); + if (model_info->props[i].type =3D=3D QEMU_MONITOR_CPU_PROPERTY_STR= ING) + VIR_FREE(model_info->props[i].value.string); + } =20 VIR_FREE(model_info->props); VIR_FREE(model_info->name); @@ -3691,7 +3694,22 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUMode= lInfo *orig) if (VIR_STRDUP(copy->props[i].name, orig->props[i].name) < 0) goto error; =20 - copy->props[i].supported =3D orig->props[i].supported; + copy->props[i].type =3D orig->props[i].type; + switch (orig->props[i].type) { + case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN: + copy->props[i].value.boolean =3D orig->props[i].value.boolean; + break; + + case QEMU_MONITOR_CPU_PROPERTY_STRING: + if (VIR_STRDUP(copy->props[i].value.string, + orig->props[i].value.string) < 0) + goto error; + break; + + case QEMU_MONITOR_CPU_PROPERTY_ULL: + copy->props[i].value.ull =3D orig->props[i].value.ull; + break; + } } =20 return copy; diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 8811d8501..112f041f1 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -921,16 +921,31 @@ int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, qemuMonitorCPUDefInfoPtr **cpus); void qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu); =20 +typedef enum { + QEMU_MONITOR_CPU_PROPERTY_BOOLEAN, + QEMU_MONITOR_CPU_PROPERTY_STRING, + QEMU_MONITOR_CPU_PROPERTY_ULL, +} qemuMonitorCPUPropertyType; + +typedef struct _qemuMonitorCPUProperty qemuMonitorCPUProperty; +typedef qemuMonitorCPUProperty *qemuMonitorCPUPropertyPtr; +struct _qemuMonitorCPUProperty { + char *name; + qemuMonitorCPUPropertyType type; + union { + bool boolean; + char *string; + unsigned long long ull; + } value; +}; + typedef struct _qemuMonitorCPUModelInfo qemuMonitorCPUModelInfo; typedef qemuMonitorCPUModelInfo *qemuMonitorCPUModelInfoPtr; =20 struct _qemuMonitorCPUModelInfo { char *name; size_t nprops; - struct { - char *name; - bool supported; - } *props; + qemuMonitorCPUPropertyPtr props; }; =20 int qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 1d281af48..415761525 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4983,18 +4983,39 @@ qemuMonitorJSONParseCPUModelProperty(const char *ke= y, void *opaque) { qemuMonitorCPUModelInfoPtr machine_model =3D opaque; - size_t n =3D machine_model->nprops; - bool supported; + qemuMonitorCPUPropertyPtr prop; =20 - if (virJSONValueGetBoolean(value, &supported) < 0) + prop =3D machine_model->props + machine_model->nprops; + + switch ((virJSONType) value->type) { + case VIR_JSON_TYPE_STRING: + if (VIR_STRDUP(prop->value.string, virJSONValueGetString(value)) <= 0) + return -1; + prop->type =3D QEMU_MONITOR_CPU_PROPERTY_STRING; + break; + + case VIR_JSON_TYPE_NUMBER: + /* Ignore numbers which cannot be parsed as unsigned long long */ + if (virJSONValueGetNumberUlong(value, &prop->value.ull) < 0) + return 0; + prop->type =3D QEMU_MONITOR_CPU_PROPERTY_ULL; + break; + + case VIR_JSON_TYPE_BOOLEAN: + virJSONValueGetBoolean(value, &prop->value.boolean); + prop->type =3D QEMU_MONITOR_CPU_PROPERTY_BOOLEAN; + break; + + case VIR_JSON_TYPE_OBJECT: + case VIR_JSON_TYPE_ARRAY: + case VIR_JSON_TYPE_NULL: return 0; - - if (VIR_STRDUP(machine_model->props[n].name, key) < 0) - return -1; - - machine_model->props[n].supported =3D supported; + } =20 machine_model->nprops++; + if (VIR_STRDUP(prop->name, key) < 0) + return -1; + return 0; } =20 diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml b/tests/qemuc= apabilitiesdata/caps_2.9.0.x86_64.xml index c13e8318f..32368e648 100644 --- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml @@ -222,11 +222,13 @@ + + @@ -242,6 +244,7 @@ + @@ -287,6 +290,7 @@ + @@ -297,6 +301,7 @@ + @@ -334,6 +339,7 @@ + @@ -363,6 +369,7 @@ + --=20 2.11.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list