From nobody Sun Feb 8 22:50:42 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of redhat.com designates 207.211.31.120 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=1572960527; cv=none; d=zoho.com; s=zohoarc; b=gSL1za+PTLrSipMjqZI/mEw9LOVqInLcYMU6SJKvzSH4gXbHVoxTkaVO1U1mAzFPDdERlR7004l0xdlV4PY1rxNNDLtjc7vVxnbPtGqHSakWOs10v/CoO15vf4+2GaVf3N6psVanElOJ/A+ArXHJ3KscWgYvsfqsM0FCq/jhR1A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1572960527; 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=09XB7lnSUSIRC395WvqWJGGddMF7iQfqklMe9amKhdY=; b=jVaULJVMvIdxRBiPtFLRpvLyt6P0ZztA4TaS0l3/FIUbbLAlTw9BZbVS5qHdePUbkb5BZhfGdRKx6dIr9SlNSg0N1D/3MTNSSCPA45zzN8CwSwegD1dUaBTYQKBNvWH5ZSO5cANot3Pc0OnkHLEjjZJJcBTwSLA/DZxON6SljzQ= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1572960527809231.7034632112642; Tue, 5 Nov 2019 05:28:47 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-333-Os0nj64SN5eXrfAh8Asb5g-1; Tue, 05 Nov 2019 08:28:44 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6BD5A107ACC8; Tue, 5 Nov 2019 13:28:39 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 44A541001B00; Tue, 5 Nov 2019 13:28:39 +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 03B604E580; Tue, 5 Nov 2019 13:28:39 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id xA5DS0N1003989 for ; Tue, 5 Nov 2019 08:28:00 -0500 Received: by smtp.corp.redhat.com (Postfix) id A20C01001B32; Tue, 5 Nov 2019 13:28:00 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2E4D51001B11 for ; Tue, 5 Nov 2019 13:27:57 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 7F7D1105B27; Tue, 5 Nov 2019 14:27:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1572960526; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=09XB7lnSUSIRC395WvqWJGGddMF7iQfqklMe9amKhdY=; b=AXwzIiu1C9hrjf8+70gwjelC4ulWkpbmuhfnAZYxRRRkazn3LNwzWwN8C9G8KheJwsyFw9 H/fHs3GmjJekJECwkVbqg7moVtf0RAkX6NyUryIexNHH+iP+7YLCG3EnRRSfEfUB188ykf hgzmAxq1hFyHcd755Gt+yk3y/MPugPw= From: Jiri Denemark To: libvir-list@redhat.com Date: Tue, 5 Nov 2019 14:27:08 +0100 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v3 10/52] qemu: Introduce qemuMonitorCPUDefs 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-MC-Unique: Os0nj64SN5eXrfAh8Asb5g-1 X-Mimecast-Spam-Score: 0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" It is a container for a CPU models list (qemuMonitorCPUDefInfo) and a number of elements in this list. Signed-off-by: Jiri Denemark Reviewed-by: J=C3=A1n Tomko --- Notes: Version 2: - v1 reviewed by J=C3=A1n Tomko, but the patch had to be changed because of the previous patch =20 Version 3: - new functions use glib src/qemu/qemu_capabilities.c | 30 +++++++++------------ src/qemu/qemu_monitor.c | 36 +++++++++++++++++++------ src/qemu/qemu_monitor.h | 14 ++++++++-- src/qemu/qemu_monitor_json.c | 52 ++++++++++++++---------------------- src/qemu/qemu_monitor_json.h | 2 +- tests/qemumonitorjsontest.c | 38 ++++++++++---------------- 6 files changed, 88 insertions(+), 84 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index c88cf2f3b0..e8b857b8cf 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2447,18 +2447,17 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, virArch arch, virDomainCapsCPUModelsPtr *cpuModels) { + g_autoptr(qemuMonitorCPUDefs) defs =3D NULL; virDomainCapsCPUModelsPtr models =3D NULL; - qemuMonitorCPUDefInfoPtr *cpus =3D NULL; - int ncpus =3D 0; size_t i; int ret =3D -1; =20 *cpuModels =3D NULL; =20 - if ((ncpus =3D qemuMonitorGetCPUDefinitions(mon, &cpus)) < 0) + if (qemuMonitorGetCPUDefinitions(mon, &defs) < 0) return -1; =20 - if (ncpus =3D=3D 0) { + if (!defs) { ret =3D 0; goto cleanup; } @@ -2473,29 +2472,29 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, goto cleanup; =20 for (name =3D libvirtModels; name && *name; name++) { - for (i =3D 0; i < ncpus; i++) { - if (STRCASENEQ(cpus[i]->name, *name)) + for (i =3D 0; i < defs->ncpus; i++) { + if (STRCASENEQ(defs->cpus[i]->name, *name)) continue; =20 - VIR_FREE(cpus[i]->name); - cpus[i]->name =3D g_strdup(*name); + VIR_FREE(defs->cpus[i]->name); + defs->cpus[i]->name =3D g_strdup(*name); } } } =20 - if (!(models =3D virDomainCapsCPUModelsNew(ncpus))) + if (!(models =3D virDomainCapsCPUModelsNew(defs->ncpus))) goto cleanup; =20 - for (i =3D 0; i < ncpus; i++) { + for (i =3D 0; i < defs->ncpus; i++) { virDomainCapsCPUUsable usable =3D VIR_DOMCAPS_CPU_USABLE_UNKNOWN; =20 - if (cpus[i]->usable =3D=3D VIR_TRISTATE_BOOL_YES) + if (defs->cpus[i]->usable =3D=3D VIR_TRISTATE_BOOL_YES) usable =3D VIR_DOMCAPS_CPU_USABLE_YES; - else if (cpus[i]->usable =3D=3D VIR_TRISTATE_BOOL_NO) + else if (defs->cpus[i]->usable =3D=3D VIR_TRISTATE_BOOL_NO) usable =3D VIR_DOMCAPS_CPU_USABLE_NO; =20 - if (virDomainCapsCPUModelsAddSteal(models, &cpus[i]->name, usable, - &cpus[i]->blockers) < 0) + if (virDomainCapsCPUModelsAddSteal(models, &defs->cpus[i]->name, u= sable, + &defs->cpus[i]->blockers) < 0) goto cleanup; } =20 @@ -2503,9 +2502,6 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, ret =3D 0; =20 cleanup: - for (i =3D 0; i < ncpus; i++) - qemuMonitorCPUDefInfoFree(cpus[i]); - VIR_FREE(cpus); virObjectUnref(models); return ret; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 224d6a76c9..44c8ba2adb 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3553,25 +3553,45 @@ qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPt= r machine) =20 int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) { - VIR_DEBUG("cpus=3D%p", cpus); + VIR_DEBUG("cpuDefs=3D%p", cpuDefs); =20 QEMU_CHECK_MONITOR(mon); =20 - return qemuMonitorJSONGetCPUDefinitions(mon, cpus); + return qemuMonitorJSONGetCPUDefinitions(mon, cpuDefs); } =20 =20 void -qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu) +qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs) { - if (!cpu) + size_t i; + + if (!defs) return; =20 - virStringListFree(cpu->blockers); - VIR_FREE(cpu->name); - VIR_FREE(cpu); + for (i =3D 0; i < defs->ncpus; i++) { + g_strfreev(defs->cpus[i]->blockers); + g_free(defs->cpus[i]->name); + g_free(defs->cpus[i]); + } + + g_free(defs->cpus); + g_free(defs); +} + + +qemuMonitorCPUDefsPtr +qemuMonitorCPUDefsNew(size_t count) +{ + g_autoptr(qemuMonitorCPUDefs) defs =3D NULL; + + defs =3D g_new0(qemuMonitorCPUDefs, 1); + defs->cpus =3D g_new0(qemuMonitorCPUDefInfoPtr, count); + defs->ncpus =3D count; + + return g_steal_pointer(&defs); } =20 =20 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index c4b7196794..00f4dd437f 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1112,9 +1112,19 @@ struct _qemuMonitorCPUDefInfo { char **blockers; /* NULL-terminated string list */ }; =20 +typedef struct _qemuMonitorCPUDefs qemuMonitorCPUDefs; +typedef qemuMonitorCPUDefs *qemuMonitorCPUDefsPtr; +struct _qemuMonitorCPUDefs { + size_t ncpus; + qemuMonitorCPUDefInfoPtr *cpus; +}; + int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus); -void qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu); + qemuMonitorCPUDefsPtr *cpuDefs); +qemuMonitorCPUDefsPtr qemuMonitorCPUDefsNew(size_t count); +void qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuMonitorCPUDefs, qemuMonitorCPUDefsFree); + =20 typedef enum { QEMU_MONITOR_CPU_PROPERTY_BOOLEAN, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index c330026692..8f04be79c1 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5575,56 +5575,53 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon, =20 int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) { - int ret =3D -1; + g_autoptr(qemuMonitorCPUDefs) defs =3D NULL; g_autoptr(virJSONValue) cmd =3D NULL; g_autoptr(virJSONValue) reply =3D NULL; virJSONValuePtr data; - qemuMonitorCPUDefInfoPtr *cpulist =3D NULL; - size_t n =3D 0; + size_t ncpus; size_t i; =20 - *cpus =3D NULL; + *cpuDefs =3D NULL; =20 if (!(cmd =3D qemuMonitorJSONMakeCommand("query-cpu-definitions", NULL= ))) return -1; =20 if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) - goto cleanup; + return -1; =20 /* Urgh, some QEMU architectures have the query-cpu-definitions * command, but return 'GenericError' with string "Not supported", * instead of simply omitting the command entirely :-( */ - if (qemuMonitorJSONHasError(reply, "GenericError")) { - ret =3D 0; - goto cleanup; - } + if (qemuMonitorJSONHasError(reply, "GenericError")) + return 0; =20 if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_ARRAY) < 0) - goto cleanup; + return -1; =20 data =3D virJSONValueObjectGetArray(reply, "return"); - n =3D virJSONValueArraySize(data); + ncpus =3D virJSONValueArraySize(data); =20 - if (VIR_ALLOC_N(cpulist, n) < 0) - goto cleanup; + if (!(defs =3D qemuMonitorCPUDefsNew(ncpus))) + return -1; =20 - for (i =3D 0; i < n; i++) { + for (i =3D 0; i < defs->ncpus; i++) { virJSONValuePtr child =3D virJSONValueArrayGet(data, i); const char *tmp; qemuMonitorCPUDefInfoPtr cpu; =20 if (VIR_ALLOC(cpu) < 0) - goto cleanup; + return -1; =20 - cpulist[i] =3D cpu; + defs->cpus[i] =3D cpu; =20 if (!(tmp =3D virJSONValueObjectGetString(child, "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("query-cpu-definitions reply data was missing= 'name'")); - goto cleanup; + return -1; } =20 cpu->name =3D g_strdup(tmp); @@ -5640,7 +5637,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unavailable-features in query-cpu-defini= tions " "reply data was not an array")); - goto cleanup; + return -1; } =20 len =3D virJSONValueArraySize(blockers); @@ -5652,7 +5649,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, =20 cpu->usable =3D VIR_TRISTATE_BOOL_NO; if (VIR_ALLOC_N(cpu->blockers, len + 1) < 0) - goto cleanup; + return -1; =20 for (j =3D 0; j < len; j++) { virJSONValuePtr blocker =3D virJSONValueArrayGet(blockers,= j); @@ -5661,7 +5658,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unexpected value in unavailable-feat= ures " "array")); - goto cleanup; + return -1; } =20 cpu->blockers[j] =3D g_strdup(virJSONValueGetString(blocke= r)); @@ -5669,17 +5666,8 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, } } =20 - ret =3D n; - *cpus =3D cpulist; - cpulist =3D NULL; - - cleanup: - if (cpulist) { - for (i =3D 0; i < n; i++) - qemuMonitorCPUDefInfoFree(cpulist[i]); - VIR_FREE(cpulist); - } - return ret; + *cpuDefs =3D g_steal_pointer(&defs); + return 0; } =20 =20 diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index e85a606792..7e6d1b9919 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -379,7 +379,7 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon, ATTRIBUTE_NONNULL(2); =20 int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) ATTRIBUTE_NONNULL(2); =20 int qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon, diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 963b54d27f..c84ff0d6b4 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -428,10 +428,7 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaqu= e) { const testGenericData *data =3D opaque; virDomainXMLOptionPtr xmlopt =3D data->xmlopt; - int ret =3D -1; - qemuMonitorCPUDefInfoPtr *cpus =3D NULL; - int ncpus =3D 0; - size_t i; + g_autoptr(qemuMonitorCPUDefs) defs =3D NULL; g_autoptr(qemuMonitorTest) test =3D NULL; =20 if (!(test =3D qemuMonitorTestNewSchema(xmlopt, data->schema))) @@ -453,31 +450,30 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaq= ue) " } " " ]" "}") < 0) - goto cleanup; + return -1; =20 - if ((ncpus =3D qemuMonitorGetCPUDefinitions(qemuMonitorTestGetMonitor(= test), - &cpus)) < 0) - goto cleanup; + if (qemuMonitorGetCPUDefinitions(qemuMonitorTestGetMonitor(test), &def= s) < 0) + return -1; =20 - if (ncpus !=3D 3) { + if (defs->ncpus !=3D 3) { virReportError(VIR_ERR_INTERNAL_ERROR, - "ncpus %d is not 3", ncpus); - goto cleanup; + "ncpus %zu is not 3", defs->ncpus); + return -1; } =20 #define CHECK_FULL(i, wantname, Usable) \ do { \ - if (STRNEQ(cpus[i]->name, (wantname))) { \ + if (STRNEQ(defs->cpus[i]->name, (wantname))) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ "name %s is not %s", \ - cpus[i]->name, (wantname)); \ - goto cleanup; \ + defs->cpus[i]->name, (wantname)); \ + return -1; \ } \ - if (cpus[i]->usable !=3D (Usable)) { \ + if (defs->cpus[i]->usable !=3D (Usable)) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ "%s: expecting usable flag %d, got %d", \ - cpus[i]->name, Usable, cpus[i]->usable); \ - goto cleanup; \ + defs->cpus[i]->name, Usable, defs->cpus[i]->usa= ble); \ + return -1; \ } \ } while (0) =20 @@ -496,13 +492,7 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaqu= e) #undef CHECK_USABLE #undef CHECK_FULL =20 - ret =3D 0; - - cleanup: - for (i =3D 0; i < ncpus; i++) - qemuMonitorCPUDefInfoFree(cpus[i]); - VIR_FREE(cpus); - return ret; + return 0; } =20 =20 --=20 2.23.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list