From nobody Wed May 14 17:25: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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1523457815068787.1336378701524; Wed, 11 Apr 2018 07:43:35 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 07CDB319E1E8; Wed, 11 Apr 2018 14:43:33 +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 C235688467; Wed, 11 Apr 2018 14:43:32 +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 845D25BC02; Wed, 11 Apr 2018 14:43:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w3BEgH4g008895 for ; Wed, 11 Apr 2018 10:42:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id F1B7510B0F3A; Wed, 11 Apr 2018 14:42:16 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B549310B0F39 for ; Wed, 11 Apr 2018 14:42:16 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 07C34100B8F; Wed, 11 Apr 2018 16:42:11 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 11 Apr 2018 16:41:47 +0200 Message-Id: <6b6685b75225d32615c3ff39a8c2ebd43850a601.1523456480.git.jdenemar@redhat.com> In-Reply-To: References: In-Reply-To: References: Mail-Followup-To: libvir-list@redhat.com X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 57/73] qemu: Move migration capabilities JSON formatting 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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Wed, 11 Apr 2018 14:43:34 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" We want to have all migration capabilities parsing and formatting at one place, i.e., in qemu_migration_params.c. The parsing is already there in qemuMigrationCapsCheck. Signed-off-by: Jiri Denemark Reviewed-by: J=EF=BF=BDn Tomko --- src/qemu/qemu_migration_params.c | 66 ++++++++++++++++++++++++++-- src/qemu/qemu_migration_paramspriv.h | 4 ++ src/qemu/qemu_monitor.c | 27 +++++++----- src/qemu/qemu_monitor.h | 3 +- src/qemu/qemu_monitor_json.c | 40 ++--------------- src/qemu/qemu_monitor_json.h | 3 +- tests/qemumonitorjsontest.c | 11 +++-- 7 files changed, 96 insertions(+), 58 deletions(-) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index 77abc7191f..548bb1c0dd 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -591,6 +591,53 @@ qemuMigrationParamsToJSON(qemuMigrationParamsPtr migPa= rams) } =20 =20 +virJSONValuePtr +qemuMigrationCapsToJSON(virBitmapPtr caps, + virBitmapPtr states) +{ + virJSONValuePtr json =3D NULL; + virJSONValuePtr cap =3D NULL; + qemuMonitorMigrationCaps bit; + const char *name; + + if (!(json =3D virJSONValueNewArray())) + return NULL; + + for (bit =3D 0; bit < QEMU_MONITOR_MIGRATION_CAPS_LAST; bit++) { + bool supported =3D false; + bool state =3D false; + + ignore_value(virBitmapGetBit(caps, bit, &supported)); + if (!supported) + continue; + + ignore_value(virBitmapGetBit(states, bit, &state)); + + if (!(cap =3D virJSONValueNewObject())) + goto error; + + name =3D qemuMonitorMigrationCapsTypeToString(bit); + if (virJSONValueObjectAppendString(cap, "capability", name) < 0) + goto error; + + if (virJSONValueObjectAppendBoolean(cap, "state", state) < 0) + goto error; + + if (virJSONValueArrayAppend(json, cap) < 0) + goto error; + + cap =3D NULL; + } + + return json; + + error: + virJSONValueFree(json); + virJSONValueFree(cap); + return NULL; +} + + /** * qemuMigrationParamsApply * @driver: qemu driver @@ -611,6 +658,7 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver, qemuDomainObjPrivatePtr priv =3D vm->privateData; bool xbzrleCacheSize_old =3D false; virJSONValuePtr params =3D NULL; + virJSONValuePtr caps =3D NULL; qemuMigrationParam xbzrle =3D QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE; int ret =3D -1; int rc; @@ -618,10 +666,16 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver, if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) return -1; =20 - if (qemuMonitorSetMigrationCapabilities(priv->mon, priv->migrationCaps, - migParams->caps) < 0) + if (!(caps =3D qemuMigrationCapsToJSON(priv->migrationCaps, migParams-= >caps))) goto cleanup; =20 + if (virJSONValueArraySize(caps) > 0) { + rc =3D qemuMonitorSetMigrationCapabilities(priv->mon, caps); + caps =3D NULL; + if (rc < 0) + goto cleanup; + } + /* If QEMU is too old to support xbzrle-cache-size migration parameter, * we need to set it via migrate-set-cache-size and tell * qemuMonitorSetMigrationParams to ignore this parameter. @@ -974,6 +1028,7 @@ qemuMigrationCapsCheck(virQEMUDriverPtr driver, { qemuDomainObjPrivatePtr priv =3D vm->privateData; virBitmapPtr migEvent =3D NULL; + virJSONValuePtr json =3D NULL; char **caps =3D NULL; char **capStr; int ret =3D -1; @@ -1014,10 +1069,14 @@ qemuMigrationCapsCheck(virQEMUDriverPtr driver, =20 ignore_value(virBitmapSetBit(migEvent, QEMU_MONITOR_MIGRATION_CAPS= _EVENTS)); =20 + if (!(json =3D qemuMigrationCapsToJSON(migEvent, migEvent))) + goto cleanup; + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) goto cleanup; =20 - rc =3D qemuMonitorSetMigrationCapabilities(priv->mon, migEvent, mi= gEvent); + rc =3D qemuMonitorSetMigrationCapabilities(priv->mon, json); + json =3D NULL; =20 if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; @@ -1039,6 +1098,7 @@ qemuMigrationCapsCheck(virQEMUDriverPtr driver, ret =3D 0; =20 cleanup: + virJSONValueFree(json); virStringListFree(caps); return ret; } diff --git a/src/qemu/qemu_migration_paramspriv.h b/src/qemu/qemu_migration= _paramspriv.h index 350973b6f9..30773a679d 100644 --- a/src/qemu/qemu_migration_paramspriv.h +++ b/src/qemu/qemu_migration_paramspriv.h @@ -28,4 +28,8 @@ qemuMigrationParamsToJSON(qemuMigrationParamsPtr migParam= s); qemuMigrationParamsPtr qemuMigrationParamsFromJSON(virJSONValuePtr params); =20 +virJSONValuePtr +qemuMigrationCapsToJSON(virBitmapPtr caps, + virBitmapPtr states); + #endif /* __QEMU_MIGRATION_PARAMSPRIV_H__ */ diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 641465f227..13d885ffc5 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3988,22 +3988,27 @@ qemuMonitorGetMigrationCapabilities(qemuMonitorPtr = mon, } =20 =20 +/** + * qemuMonitorSetMigrationCapabilities: + * @mon: Pointer to the monitor object. + * @caps: Migration capabilities. + * + * The @caps object is consumed and should not be referenced by the caller + * after this function returns. + * + * Returns 0 on success, -1 on error. + */ int qemuMonitorSetMigrationCapabilities(qemuMonitorPtr mon, - virBitmapPtr caps, - virBitmapPtr states) + virJSONValuePtr caps) { - char *capsStr =3D virBitmapFormat(caps); - char *statesStr =3D virBitmapFormat(states); + QEMU_CHECK_MONITOR_JSON_GOTO(mon, error); =20 - VIR_DEBUG("caps=3D%s, states=3D%s", NULLSTR(capsStr), NULLSTR(statesSt= r)); + return qemuMonitorJSONSetMigrationCapabilities(mon, caps); =20 - VIR_FREE(capsStr); - VIR_FREE(statesStr); - - QEMU_CHECK_MONITOR_JSON(mon); - - return qemuMonitorJSONSetMigrationCapabilities(mon, caps, states); + error: + virJSONValueFree(caps); + return -1; } =20 =20 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 1c49cc2370..4ab0206713 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -728,8 +728,7 @@ VIR_ENUM_DECL(qemuMonitorMigrationCaps); int qemuMonitorGetMigrationCapabilities(qemuMonitorPtr mon, char ***capabilities); int qemuMonitorSetMigrationCapabilities(qemuMonitorPtr mon, - virBitmapPtr caps, - virBitmapPtr states); + virJSONValuePtr caps); =20 int qemuMonitorGetGICCapabilities(qemuMonitorPtr mon, virGICCapability **capabilities); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index b00bca7d46..7fd8e756b3 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -6111,47 +6111,14 @@ qemuMonitorJSONGetMigrationCapabilities(qemuMonitor= Ptr mon, =20 int qemuMonitorJSONSetMigrationCapabilities(qemuMonitorPtr mon, - virBitmapPtr caps, - virBitmapPtr states) + virJSONValuePtr caps) { int ret =3D -1; - qemuMonitorMigrationCaps bit; virJSONValuePtr cmd =3D NULL; virJSONValuePtr reply =3D NULL; - virJSONValuePtr cap =3D NULL; - virJSONValuePtr array; - - if (!(array =3D virJSONValueNewArray())) - goto cleanup; - - for (bit =3D 0; bit < QEMU_MONITOR_MIGRATION_CAPS_LAST; bit++) { - bool supported =3D false; - bool state =3D false; - - ignore_value(virBitmapGetBit(caps, bit, &supported)); - if (!supported) - continue; - - ignore_value(virBitmapGetBit(states, bit, &state)); - - if (!(cap =3D virJSONValueNewObject())) - goto cleanup; - - if (virJSONValueObjectAppendString(cap, "capability", - qemuMonitorMigrationCapsTypeToS= tring(bit)) < 0) - goto cleanup; - - if (virJSONValueObjectAppendBoolean(cap, "state", state) < 0) - goto cleanup; - - if (virJSONValueArrayAppend(array, cap) < 0) - goto cleanup; - - cap =3D NULL; - } =20 cmd =3D qemuMonitorJSONMakeCommand("migrate-set-capabilities", - "a:capabilities", &array, + "a:capabilities", &caps, NULL); if (!cmd) goto cleanup; @@ -6164,8 +6131,7 @@ qemuMonitorJSONSetMigrationCapabilities(qemuMonitorPt= r mon, =20 ret =3D 0; cleanup: - virJSONValueFree(array); - virJSONValueFree(cap); + virJSONValueFree(caps); virJSONValueFree(cmd); virJSONValueFree(reply); return ret; diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 5ada38b9fa..c6ad83af4c 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -146,8 +146,7 @@ int qemuMonitorJSONGetMigrationStats(qemuMonitorPtr mon, int qemuMonitorJSONGetMigrationCapabilities(qemuMonitorPtr mon, char ***capabilities); int qemuMonitorJSONSetMigrationCapabilities(qemuMonitorPtr mon, - virBitmapPtr caps, - virBitmapPtr states); + virJSONValuePtr caps); =20 int qemuMonitorJSONGetGICCapabilities(qemuMonitorPtr mon, virGICCapability **capabilities); diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index dafcccebad..697126f298 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -32,6 +32,7 @@ #include "virstring.h" #include "cpu/cpu.h" #include "qemu/qemu_monitor.h" +#include "qemu/qemu_migration_paramspriv.h" =20 #define VIR_FROM_THIS VIR_FROM_NONE =20 @@ -2141,6 +2142,7 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationCapabil= ities(const void *data) const char *cap; char **caps =3D NULL; virBitmapPtr bitmap =3D NULL; + virJSONValuePtr json =3D NULL; const char *reply =3D "{" " \"return\": [" @@ -2176,12 +2178,15 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationCapab= ilities(const void *data) goto cleanup; =20 ignore_value(virBitmapSetBit(bitmap, QEMU_MONITOR_MIGRATION_CAPS_XBZRL= E)); - if (qemuMonitorJSONSetMigrationCapabilities(qemuMonitorTestGetMonitor(= test), - bitmap, bitmap) < 0) + if (!(json =3D qemuMigrationCapsToJSON(bitmap, bitmap))) goto cleanup; =20 - ret =3D 0; + ret =3D qemuMonitorJSONSetMigrationCapabilities(qemuMonitorTestGetMoni= tor(test), + json); + json =3D NULL; + cleanup: + virJSONValueFree(json); qemuMonitorTestFree(test); virStringListFree(caps); virBitmapFree(bitmap); --=20 2.17.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list