From nobody Mon Dec 15 23:05:22 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 1523457817580975.4813677245844; Wed, 11 Apr 2018 07:43:37 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 59F2F3150034; Wed, 11 Apr 2018 14:43:36 +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 2847467E49; Wed, 11 Apr 2018 14:43:36 +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 D53D3180215F; Wed, 11 Apr 2018 14:43:35 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w3BEgHYo008911 for ; Wed, 11 Apr 2018 10:42:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1E5BC2024CA4; Wed, 11 Apr 2018 14:42:17 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BA9582026609 for ; Wed, 11 Apr 2018 14:42:16 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 129CD100B93; Wed, 11 Apr 2018 16:42:11 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 11 Apr 2018 16:41:49 +0200 Message-Id: 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.4 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 59/73] qemu: Add support for sending capabilities in migration cookie 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.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Wed, 11 Apr 2018 14:43:36 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Some migration capabilities may be enabled automatically, but only if both sides of migration support them. Thus we need to be able transfer the list of supported migration capabilities in migration cookie. Signed-off-by: Jiri Denemark Reviewed-by: J=EF=BF=BDn Tomko --- src/qemu/qemu_migration.c | 15 ++-- src/qemu/qemu_migration_cookie.c | 136 ++++++++++++++++++++++++++++++- src/qemu/qemu_migration_cookie.h | 15 ++++ src/qemu/qemu_migration_params.c | 20 +++++ src/qemu/qemu_migration_params.h | 3 + 5 files changed, 183 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 319b4d000a..f573bd3eba 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1917,6 +1917,7 @@ qemuMigrationSrcBeginPhase(virQEMUDriverPtr driver, goto cleanup; =20 if (qemuMigrationBakeCookie(mig, driver, vm, + QEMU_MIGRATION_SOURCE, cookieout, cookieoutlen, cookieFlags) < 0) goto cleanup; @@ -2429,8 +2430,9 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, goto stopjob; =20 done: - if (qemuMigrationBakeCookie(mig, driver, vm, cookieout, - cookieoutlen, cookieFlags) < 0) { + if (qemuMigrationBakeCookie(mig, driver, vm, + QEMU_MIGRATION_DESTINATION, + cookieout, cookieoutlen, cookieFlags) < 0)= { /* We could tear down the whole guest here, but * cookie data is (so far) non-critical, so that * seems a little harsh. We'll just warn for now. @@ -3523,8 +3525,9 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver, QEMU_MIGRATION_COOKIE_STATS; =20 if (qemuMigrationCookieAddPersistent(mig, &persistDef) < 0 || - qemuMigrationBakeCookie(mig, driver, vm, cookieout, - cookieoutlen, cookieFlags) < 0) { + qemuMigrationBakeCookie(mig, driver, vm, + QEMU_MIGRATION_SOURCE, + cookieout, cookieoutlen, cookieFlags) < 0)= { VIR_WARN("Unable to encode migration cookie"); } =20 @@ -5019,7 +5022,9 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver, priv->job.completed->status =3D QEMU_DOMAIN_JOB_STATUS_COMPLET= ED; } =20 - if (qemuMigrationBakeCookie(mig, driver, vm, cookieout, cookieoutl= en, + if (qemuMigrationBakeCookie(mig, driver, vm, + QEMU_MIGRATION_DESTINATION, + cookieout, cookieoutlen, QEMU_MIGRATION_COOKIE_STATS) < 0) VIR_WARN("Unable to encode migration cookie"); =20 diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_coo= kie.c index 5a1e299ca2..eca1b74d63 100644 --- a/src/qemu/qemu_migration_cookie.c +++ b/src/qemu/qemu_migration_cookie.c @@ -33,6 +33,7 @@ =20 #include "qemu_domain.h" #include "qemu_migration_cookie.h" +#include "qemu_migration_params.h" =20 =20 #define VIR_FROM_THIS VIR_FROM_QEMU @@ -50,7 +51,8 @@ VIR_ENUM_IMPL(qemuMigrationCookieFlag, "memory-hotplug", "cpu-hotplug", "cpu", - "allowReboot"); + "allowReboot", + "capabilities"); =20 =20 static void @@ -94,6 +96,18 @@ qemuMigrationCookieNBDFree(qemuMigrationCookieNBDPtr nbd) } =20 =20 +static void +qemuMigrationCookieCapsFree(qemuMigrationCookieCapsPtr caps) +{ + if (!caps) + return; + + virBitmapFree(caps->supported); + virBitmapFree(caps->automatic); + VIR_FREE(caps); +} + + void qemuMigrationCookieFree(qemuMigrationCookiePtr mig) { @@ -112,6 +126,7 @@ qemuMigrationCookieFree(qemuMigrationCookiePtr mig) VIR_FREE(mig->lockDriver); VIR_FREE(mig->jobInfo); virCPUDefFree(mig->cpu); + qemuMigrationCookieCapsFree(mig->caps); VIR_FREE(mig); } =20 @@ -550,6 +565,33 @@ qemuMigrationCookieAddAllowReboot(qemuMigrationCookieP= tr mig, } =20 =20 +static int +qemuMigrationCookieAddCaps(qemuMigrationCookiePtr mig, + virDomainObjPtr vm, + qemuMigrationParty party) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + + qemuMigrationCookieCapsFree(mig->caps); + if (VIR_ALLOC(mig->caps) < 0) + return -1; + + if (priv->migrationCaps) + mig->caps->supported =3D virBitmapNewCopy(priv->migrationCaps); + else + mig->caps->supported =3D virBitmapNew(0); + + mig->caps->automatic =3D qemuMigrationParamsGetAlwaysOnCaps(party); + + if (!mig->caps->supported || !mig->caps->automatic) + return -1; + + mig->flags |=3D QEMU_MIGRATION_COOKIE_CAPS; + + return 0; +} + + static void qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf, qemuMigrationCookieGraphicsPtr grap) @@ -710,6 +752,33 @@ qemuMigrationCookieStatisticsXMLFormat(virBufferPtr bu= f, } =20 =20 +static void +qemuMigrationCookieCapsXMLFormat(virBufferPtr buf, + qemuMigrationCookieCapsPtr caps) +{ + qemuMigrationCapability cap; + + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + + for (cap =3D 0; cap < QEMU_MIGRATION_CAP_LAST; cap++) { + bool supported =3D false; + bool automatic =3D false; + + ignore_value(virBitmapGetBit(caps->supported, cap, &supported)); + ignore_value(virBitmapGetBit(caps->automatic, cap, &automatic)); + if (supported) { + virBufferAsprintf(buf, "\n", + qemuMigrationCapabilityTypeToString(cap), + automatic ? "yes" : "no"); + } + } + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); +} + + static int qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver, virBufferPtr buf, @@ -793,6 +862,9 @@ qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver, if (mig->flags & QEMU_MIGRATION_COOKIE_ALLOW_REBOOT) qemuDomainObjPrivateXMLFormatAllowReboot(buf, mig->allowReboot); =20 + if (mig->flags & QEMU_MIGRATION_COOKIE_CAPS) + qemuMigrationCookieCapsXMLFormat(buf, mig->caps); + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); return 0; @@ -1067,6 +1139,59 @@ qemuMigrationCookieStatisticsXMLParse(xmlXPathContex= tPtr ctxt) } =20 =20 +static qemuMigrationCookieCapsPtr +qemuMigrationCookieCapsXMLParse(xmlXPathContextPtr ctxt) +{ + qemuMigrationCookieCapsPtr caps =3D NULL; + xmlNodePtr *nodes =3D NULL; + qemuMigrationCookieCapsPtr ret =3D NULL; + char *name =3D NULL; + char *automatic =3D NULL; + int cap; + size_t i; + int n; + + if (VIR_ALLOC(caps) < 0) + return NULL; + + if (!(caps->supported =3D virBitmapNew(QEMU_MIGRATION_CAP_LAST)) || + !(caps->automatic =3D virBitmapNew(QEMU_MIGRATION_CAP_LAST))) + goto cleanup; + + if ((n =3D virXPathNodeSet("./capabilities[1]/cap", ctxt, &nodes)) < 0) + goto cleanup; + + for (i =3D 0; i < n; i++) { + if (!(name =3D virXMLPropString(nodes[i], "name"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing migration capability name")); + goto cleanup; + } + + if ((cap =3D qemuMigrationCapabilityTypeFromString(name)) < 0) + VIR_DEBUG("unknown migration capability '%s'", name); + else + ignore_value(virBitmapSetBit(caps->supported, cap)); + + if ((automatic =3D virXMLPropString(nodes[i], "auto")) && + STREQ(automatic, "yes")) + ignore_value(virBitmapSetBit(caps->automatic, cap)); + + VIR_FREE(name); + VIR_FREE(automatic); + } + + VIR_STEAL_PTR(ret, caps); + + cleanup: + qemuMigrationCookieCapsFree(caps); + VIR_FREE(nodes); + VIR_FREE(name); + VIR_FREE(automatic); + return ret; +} + + static int qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig, virQEMUDriverPtr driver, @@ -1246,6 +1371,10 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr m= ig, qemuDomainObjPrivateXMLParseAllowReboot(ctxt, &mig->allowReboot) <= 0) goto error; =20 + if (flags & QEMU_MIGRATION_COOKIE_CAPS && + !(mig->caps =3D qemuMigrationCookieCapsXMLParse(ctxt))) + goto error; + virObjectUnref(caps); return 0; =20 @@ -1286,6 +1415,7 @@ int qemuMigrationBakeCookie(qemuMigrationCookiePtr mig, virQEMUDriverPtr driver, virDomainObjPtr dom, + qemuMigrationParty party, char **cookieout, int *cookieoutlen, unsigned int flags) @@ -1329,6 +1459,10 @@ qemuMigrationBakeCookie(qemuMigrationCookiePtr mig, if (flags & QEMU_MIGRATION_COOKIE_ALLOW_REBOOT) qemuMigrationCookieAddAllowReboot(mig, dom); =20 + if (flags & QEMU_MIGRATION_COOKIE_CAPS && + qemuMigrationCookieAddCaps(mig, dom, party) < 0) + return -1; + if (!(*cookieout =3D qemuMigrationCookieXMLFormatStr(driver, mig))) return -1; =20 diff --git a/src/qemu/qemu_migration_cookie.h b/src/qemu/qemu_migration_coo= kie.h index 4a25511a9a..08c5de8f06 100644 --- a/src/qemu/qemu_migration_cookie.h +++ b/src/qemu/qemu_migration_cookie.h @@ -19,6 +19,8 @@ #ifndef __QEMU_MIGRATION_COOKIE_H__ # define __QEMU_MIGRATION_COOKIE_H__ =20 +# include "qemu_migration_params.h" + typedef enum { QEMU_MIGRATION_COOKIE_FLAG_GRAPHICS, QEMU_MIGRATION_COOKIE_FLAG_LOCKSTATE, @@ -30,6 +32,7 @@ typedef enum { QEMU_MIGRATION_COOKIE_FLAG_CPU_HOTPLUG, QEMU_MIGRATION_COOKIE_FLAG_CPU, QEMU_MIGRATION_COOKIE_FLAG_ALLOW_REBOOT, + QEMU_MIGRATION_COOKIE_FLAG_CAPS, =20 QEMU_MIGRATION_COOKIE_FLAG_LAST } qemuMigrationCookieFlags; @@ -47,6 +50,7 @@ typedef enum { QEMU_MIGRATION_COOKIE_CPU_HOTPLUG =3D (1 << QEMU_MIGRATION_COOKIE_FLAG= _CPU_HOTPLUG), QEMU_MIGRATION_COOKIE_CPU =3D (1 << QEMU_MIGRATION_COOKIE_FLAG_CPU), QEMU_MIGRATION_COOKIE_ALLOW_REBOOT =3D (1 << QEMU_MIGRATION_COOKIE_FLA= G_ALLOW_REBOOT), + QEMU_MIGRATION_COOKIE_CAPS =3D (1 << QEMU_MIGRATION_COOKIE_FLAG_CAPS), } qemuMigrationCookieFeatures; =20 typedef struct _qemuMigrationCookieGraphics qemuMigrationCookieGraphics; @@ -92,6 +96,13 @@ struct _qemuMigrationCookieNBD { } *disks; }; =20 +typedef struct _qemuMigrationCookieCaps qemuMigrationCookieCaps; +typedef qemuMigrationCookieCaps *qemuMigrationCookieCapsPtr; +struct _qemuMigrationCookieCaps { + virBitmapPtr supported; + virBitmapPtr automatic; +}; + typedef struct _qemuMigrationCookie qemuMigrationCookie; typedef qemuMigrationCookie *qemuMigrationCookiePtr; struct _qemuMigrationCookie { @@ -132,6 +143,9 @@ struct _qemuMigrationCookie { =20 /* If flags & QEMU_MIGRATION_COOKIE_ALLOW_REBOOT */ virTristateBool allowReboot; + + /* If flags & QEMU_MIGRATION_COOKIE_CAPS */ + qemuMigrationCookieCapsPtr caps; }; =20 =20 @@ -139,6 +153,7 @@ int qemuMigrationBakeCookie(qemuMigrationCookiePtr mig, virQEMUDriverPtr driver, virDomainObjPtr dom, + qemuMigrationParty party, char **cookieout, int *cookieoutlen, unsigned int flags); diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index 2723288dfc..1b1e5829e8 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -153,6 +153,26 @@ static const qemuMigrationParamType qemuMigrationParam= Types[] =3D { verify(ARRAY_CARDINALITY(qemuMigrationParamTypes) =3D=3D QEMU_MIGRATION_PA= RAM_LAST); =20 =20 +virBitmapPtr +qemuMigrationParamsGetAlwaysOnCaps(qemuMigrationParty party) +{ + virBitmapPtr caps =3D NULL; + size_t i; + + if (!(caps =3D virBitmapNew(QEMU_MIGRATION_CAP_LAST))) + return NULL; + + for (i =3D 0; i < ARRAY_CARDINALITY(qemuMigrationParamsAlwaysOn); i++)= { + if (!(qemuMigrationParamsAlwaysOn[i].party & party)) + continue; + + ignore_value(virBitmapSetBit(caps, qemuMigrationParamsAlwaysOn[i].= cap)); + } + + return caps; +} + + static qemuMigrationParamsPtr qemuMigrationParamsNew(void) { diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_par= ams.h index ceba0eb68a..75a441e1e1 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -65,6 +65,9 @@ typedef enum { } qemuMigrationParty; =20 =20 +virBitmapPtr +qemuMigrationParamsGetAlwaysOnCaps(qemuMigrationParty party); + qemuMigrationParamsPtr qemuMigrationParamsFromFlags(virTypedParameterPtr params, int nparams, --=20 2.17.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list