From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49743) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c7mGe-0001GM-BG for qemu-devel@nongnu.org; Fri, 18 Nov 2016 11:44:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c7mGb-0006Al-Gu for qemu-devel@nongnu.org; Fri, 18 Nov 2016 11:44:00 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:45664 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c7mGb-0006AT-Av for qemu-devel@nongnu.org; Fri, 18 Nov 2016 11:43:57 -0500 Received: from pps.filterd (m0098419.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.17/8.16.0.17) with SMTP id uAIGhuPO132405 for ; Fri, 18 Nov 2016 11:43:56 -0500 Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.149]) by mx0b-001b2d01.pphosted.com with ESMTP id 26t38qpkpq-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 18 Nov 2016 11:43:55 -0500 Received: from localhost by e31.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 18 Nov 2016 09:43:53 -0700 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Michael Roth In-Reply-To: <1479433227-29238-4-git-send-email-mdroth@linux.vnet.ibm.com> References: <1479433227-29238-1-git-send-email-mdroth@linux.vnet.ibm.com> <1479433227-29238-4-git-send-email-mdroth@linux.vnet.ibm.com> Date: Fri, 18 Nov 2016 10:08:59 -0600 Message-Id: <20161118160859.3756.30817@loki> Subject: Re: [Qemu-devel] [PATCH for-2.8 3/3] spapr: migration support for CAS-negotiated option vectors List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: duanj@linux.vnet.ibm.com, quintela@redhat.com, dgilbert@redhat.com, qemu-ppc@nongnu.org, bharata@linux.vnet.ibm.com, amit.shah@redhat.com, david@gibson.dropbear.id.au Quoting Michael Roth (2016-11-17 19:40:27) > With the additional of the OV5_HP_EVT option vector, we now have > certain functionality (namely, memory unplug) that checks at run-time > for whether or not the guest negotiated the option via CAS. Because > we don't currently migrate these negotiated values, we are unable > to unplug memory from a guest after it's been migrated until after > the guest is rebooted and CAS-negotiation is repeated. > = > This patch fixes this by adding CAS-negotiated options to the > migration stream. We do this using a subsection, since the > negotiated value of OV5_HP_EVT is the only option currently needed > to maintain proper functionality for a running guest. > = > Signed-off-by: Michael Roth > --- > hw/ppc/spapr.c | 68 +++++++++++++++++++++++++++++++++++++++= ++++++ > hw/ppc/spapr_ovec.c | 12 ++++++++ > include/hw/ppc/spapr_ovec.h | 4 +++ > 3 files changed, 84 insertions(+) > = > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 0cbab24..9e08aed 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -1267,6 +1267,70 @@ static bool version_before_3(void *opaque, int ver= sion_id) > return version_id < 3; > } > = > +static bool spapr_ov5_cas_needed(void *opaque) > +{ > + sPAPRMachineState *spapr =3D opaque; > + sPAPROptionVector *ov5_mask =3D spapr_ovec_new(); > + sPAPROptionVector *ov5_legacy =3D spapr_ovec_new(); > + sPAPROptionVector *ov5_removed =3D spapr_ovec_new(); > + bool cas_needed; > + > + /* Prior to the introduction of sPAPROptionVector, we had two option > + * vectors we dealt with: OV5_FORM1_AFFINITY, and OV5_DRCONF_MEMORY. > + * Both of these options encode machine topology into the device-tree > + * in such a way that the now-booted OS should still be able to inte= ract > + * appropriately with QEMU regardless of what options were actually > + * negotiatied on the source side. > + * > + * As such, we can avoid migrating the CAS-negotiated options if the= se > + * are the only options available on the current machine/platform. > + * Since these are the only options available for pseries-2.7 and > + * earlier, this allows us to maintain old->new/new->old migration > + * compatibility. > + * > + * For QEMU 2.8+, there are additional CAS-negotiatable options avai= lable > + * via default pseries-2.8 machines and explicit command-line parame= ters. > + * Some of these options, like OV5_HP_EVT, *do* require QEMU to be a= ware > + * of the actual CAS-negotiated values to continue working properly.= For > + * example, availability of memory unplug depends on knowing whether > + * OV5_HP_EVT was negotiated via CAS. > + * > + * Thus, for any cases where the set of available CAS-negotiatable > + * options extends beyond OV5_FORM1_AFFINITY and OV5_DRCONF_MEMORY, = we > + * include the CAS-negotiated options in the migration stream. > + */ > + spapr_ovec_set(ov5_mask, OV5_FORM1_AFFINITY); > + spapr_ovec_set(ov5_mask, OV5_DRCONF_MEMORY); > + > + /* spapr_ovec_diff returns true if bits were removed. we avoid using > + * the mask itself since in the future it's possible "legacy" bits m= ay be > + * removed via machine options, which could generate a false positive > + * that breaks migration. > + */ > + spapr_ovec_intersect(ov5_legacy, spapr->ov5, ov5_mask); > + cas_needed =3D spapr_ovec_diff(ov5_removed, spapr->ov5, ov5_legacy); > + > + spapr_ovec_cleanup(ov5_mask); > + spapr_ovec_cleanup(ov5_legacy); > + spapr_ovec_cleanup(ov5_removed); > + > + error_report("MIGRATION NEEDED: %d", cas_needed); Argh, sorry, I just noticed this stray debug comment that slipped in. Would you prefer a v2, or just removing it in-tree? > + > + return cas_needed; > +} > + > +static const VMStateDescription vmstate_spapr_ov5_cas =3D { > + .name =3D "spapr_option_vector_ov5_cas", > + .version_id =3D 1, > + .minimum_version_id =3D 1, > + .needed =3D spapr_ov5_cas_needed, > + .fields =3D (VMStateField[]) { > + VMSTATE_STRUCT_POINTER_V(ov5_cas, sPAPRMachineState, 1, > + vmstate_spapr_ovec, sPAPROptionVector), > + VMSTATE_END_OF_LIST() > + }, > +}; > + > static const VMStateDescription vmstate_spapr =3D { > .name =3D "spapr", > .version_id =3D 3, > @@ -1282,6 +1346,10 @@ static const VMStateDescription vmstate_spapr =3D { > VMSTATE_PPC_TIMEBASE_V(tb, sPAPRMachineState, 2), > VMSTATE_END_OF_LIST() > }, > + .subsections =3D (const VMStateDescription*[]) { > + &vmstate_spapr_ov5_cas, > + NULL > + } > }; > = > static int htab_save_setup(QEMUFile *f, void *opaque) > diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c > index c2a0d18..3eb1d59 100644 > --- a/hw/ppc/spapr_ovec.c > +++ b/hw/ppc/spapr_ovec.c > @@ -37,6 +37,17 @@ > */ > struct sPAPROptionVector { > unsigned long *bitmap; > + int32_t bitmap_size; /* only used for migration */ > +}; > + > +const VMStateDescription vmstate_spapr_ovec =3D { > + .name =3D "spapr_option_vector", > + .version_id =3D 1, > + .minimum_version_id =3D 1, > + .fields =3D (VMStateField[]) { > + VMSTATE_BITMAP(bitmap, sPAPROptionVector, 1, bitmap_size), > + VMSTATE_END_OF_LIST() > + } > }; > = > sPAPROptionVector *spapr_ovec_new(void) > @@ -45,6 +56,7 @@ sPAPROptionVector *spapr_ovec_new(void) > = > ov =3D g_new0(sPAPROptionVector, 1); > ov->bitmap =3D bitmap_new(OV_MAXBITS); > + ov->bitmap_size =3D OV_MAXBITS; > = > return ov; > } > diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h > index 6a06da3..355a344 100644 > --- a/include/hw/ppc/spapr_ovec.h > +++ b/include/hw/ppc/spapr_ovec.h > @@ -37,6 +37,7 @@ > #define _SPAPR_OVEC_H > = > #include "cpu.h" > +#include "migration/vmstate.h" > = > typedef struct sPAPROptionVector sPAPROptionVector; > = > @@ -64,4 +65,7 @@ sPAPROptionVector *spapr_ovec_parse_vector(target_ulong= table_addr, int vector); > int spapr_ovec_populate_dt(void *fdt, int fdt_offset, > sPAPROptionVector *ov, const char *name); > = > +/* migration */ > +extern const VMStateDescription vmstate_spapr_ovec; > + > #endif /* !defined (_SPAPR_OVEC_H) */ > -- = > 1.9.1 > = >=20