From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51490) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b5nCL-0007Vh-2f for qemu-devel@nongnu.org; Thu, 26 May 2016 00:47:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b5nCD-0007Lg-R9 for qemu-devel@nongnu.org; Thu, 26 May 2016 00:47:04 -0400 Date: Thu, 26 May 2016 14:01:05 +1000 From: David Gibson Message-ID: <20160526040105.GB17226@voom.fritz.box> References: <1462344751-28281-1-git-send-email-aik@ozlabs.ru> <1462344751-28281-11-git-send-email-aik@ozlabs.ru> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="/mvwczta11gu4fnM" Content-Disposition: inline In-Reply-To: <1462344751-28281-11-git-send-email-aik@ozlabs.ru> Subject: Re: [Qemu-devel] [PATCH qemu v16 10/19] spapr_iommu: Migrate full state List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy Cc: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, Alexander Graf , Alex Williamson , Paolo Bonzini --/mvwczta11gu4fnM Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, May 04, 2016 at 04:52:22PM +1000, Alexey Kardashevskiy wrote: > The source guest could have reallocated the default TCE table and > migrate bigger/smaller table. This adds reallocation in post_load() > if the default table size is different on source and destination. >=20 > This adds @bus_offset, @page_shift, @enabled to the migration stream. > These cannot change without dynamic DMA windows so no change in > behavior is expected now. >=20 > Signed-off-by: Alexey Kardashevskiy > David Gibson > --- > Changes: > v15: > * squashed "migrate full state" into this > * added missing tcet->mig_nb_table initialization in spapr_tce_table_pre_= save() > * instead of bumping the version, moved extra parameters to subsection >=20 > v14: > * new to the series > --- > hw/ppc/spapr_iommu.c | 67 ++++++++++++++++++++++++++++++++++++++++++++= ++++-- > include/hw/ppc/spapr.h | 2 ++ > trace-events | 2 ++ > 3 files changed, 69 insertions(+), 2 deletions(-) >=20 > diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c > index 9bcd3f6..52b1e0d 100644 > --- a/hw/ppc/spapr_iommu.c > +++ b/hw/ppc/spapr_iommu.c > @@ -137,33 +137,96 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(Memo= ryRegion *iommu, hwaddr addr, > return ret; > } > =20 > +static void spapr_tce_table_pre_save(void *opaque) > +{ > + sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(opaque); > + > + tcet->mig_table =3D tcet->table; > + tcet->mig_nb_table =3D tcet->nb_table; > + > + trace_spapr_iommu_pre_save(tcet->liobn, tcet->mig_nb_table, > + tcet->bus_offset, tcet->page_shift); > +} > + > +static void spapr_tce_table_do_enable(sPAPRTCETable *tcet); > +static void spapr_tce_table_do_disable(sPAPRTCETable *tcet); > + > static int spapr_tce_table_post_load(void *opaque, int version_id) > { > sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(opaque); > + uint32_t old_nb_table =3D tcet->nb_table; > =20 > if (tcet->vdev) { > spapr_vio_set_bypass(tcet->vdev, tcet->bypass); > } > =20 > + if (tcet->enabled) { > + if (tcet->nb_table !=3D tcet->mig_nb_table) { > + if (tcet->nb_table) { > + spapr_tce_table_do_disable(tcet); > + } > + tcet->nb_table =3D tcet->mig_nb_table; > + spapr_tce_table_do_enable(tcet); > + } > + > + memcpy(tcet->table, tcet->mig_table, > + tcet->nb_table * sizeof(tcet->table[0])); > + > + free(tcet->mig_table); > + tcet->mig_table =3D NULL; > + } else if (tcet->table) { > + /* Destination guest has a default table but source does not -> = free */ > + spapr_tce_table_do_disable(tcet); > + } > + > + trace_spapr_iommu_post_load(tcet->liobn, old_nb_table, tcet->nb_tabl= e, > + tcet->bus_offset, tcet->page_shift); > + > return 0; > } > =20 > +static bool spapr_tce_table_ex_needed(void *opaque) > +{ > + sPAPRTCETable *tcet =3D opaque; > + > + return tcet->bus_offset || tcet->page_shift !=3D 0xC; || !tcet->enabled ?? AFAICT you're assuming that the existing tcet on the destination will be enabled prior to an incoming migration. > +} > + > +static const VMStateDescription vmstate_spapr_tce_table_ex =3D { > + .name =3D "spapr_iommu_ex", > + .version_id =3D 1, > + .minimum_version_id =3D 1, > + .needed =3D spapr_tce_table_ex_needed, > + .fields =3D (VMStateField[]) { > + VMSTATE_BOOL(enabled, sPAPRTCETable), =2E.or could you encode enabled as !!mig_nb_table? > + VMSTATE_UINT64(bus_offset, sPAPRTCETable), > + VMSTATE_UINT32(page_shift, sPAPRTCETable), > + VMSTATE_END_OF_LIST() > + }, > +}; > + > static const VMStateDescription vmstate_spapr_tce_table =3D { > .name =3D "spapr_iommu", > .version_id =3D 2, > .minimum_version_id =3D 2, > + .pre_save =3D spapr_tce_table_pre_save, > .post_load =3D spapr_tce_table_post_load, > .fields =3D (VMStateField []) { > /* Sanity check */ > VMSTATE_UINT32_EQUAL(liobn, sPAPRTCETable), > - VMSTATE_UINT32_EQUAL(nb_table, sPAPRTCETable), > =20 > /* IOMMU state */ > + VMSTATE_UINT32(mig_nb_table, sPAPRTCETable), > VMSTATE_BOOL(bypass, sPAPRTCETable), > - VMSTATE_VARRAY_UINT32(table, sPAPRTCETable, nb_table, 0, vmstate= _info_uint64, uint64_t), > + VMSTATE_VARRAY_UINT32_ALLOC(mig_table, sPAPRTCETable, mig_nb_tab= le, 0, > + vmstate_info_uint64, uint64_t), > =20 > VMSTATE_END_OF_LIST() > }, > + .subsections =3D (const VMStateDescription*[]) { > + &vmstate_spapr_tce_table_ex, > + NULL > + } > }; > =20 > static MemoryRegionIOMMUOps spapr_iommu_ops =3D { > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h > index 0140810..d36dda2 100644 > --- a/include/hw/ppc/spapr.h > +++ b/include/hw/ppc/spapr.h > @@ -540,6 +540,8 @@ struct sPAPRTCETable { > uint64_t bus_offset; > uint32_t page_shift; > uint64_t *table; > + uint32_t mig_nb_table; > + uint64_t *mig_table; > bool bypass; > bool need_vfio; > int fd; > diff --git a/trace-events b/trace-events > index d96d344..dd50005 100644 > --- a/trace-events > +++ b/trace-events > @@ -1432,6 +1432,8 @@ spapr_iommu_pci_indirect(uint64_t liobn, uint64_t i= oba, uint64_t tce, uint64_t i > spapr_iommu_pci_stuff(uint64_t liobn, uint64_t ioba, uint64_t tce_value,= uint64_t npages, uint64_t ret) "liobn=3D%"PRIx64" ioba=3D0x%"PRIx64" tceva= lue=3D0x%"PRIx64" npages=3D%"PRId64" ret=3D%"PRId64 > spapr_iommu_xlate(uint64_t liobn, uint64_t ioba, uint64_t tce, unsigned = perm, unsigned pgsize) "liobn=3D%"PRIx64" 0x%"PRIx64" -> 0x%"PRIx64" perm= =3D%u mask=3D%x" > spapr_iommu_new_table(uint64_t liobn, void *table, int fd) "liobn=3D%"PR= Ix64" table=3D%p fd=3D%d" > +spapr_iommu_pre_save(uint64_t liobn, uint32_t nb, uint64_t offs, uint32_= t ps) "liobn=3D%"PRIx64" %"PRIx32" bus_offset=3D%"PRIx64" ps=3D%"PRIu32 > +spapr_iommu_post_load(uint64_t liobn, uint32_t pre_nb, uint32_t post_nb,= uint64_t offs, uint32_t ps) "liobn=3D%"PRIx64" %"PRIx32" =3D> %"PRIx32" bu= s_offset=3D%"PRIx64" ps=3D%"PRIu32 > =20 > # hw/ppc/ppc.c > ppc_tb_adjust(uint64_t offs1, uint64_t offs2, int64_t diff, int64_t seco= nds) "adjusted from 0x%"PRIx64" to 0x%"PRIx64", diff %"PRId64" (%"PRId64"s)" --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --/mvwczta11gu4fnM Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXRnUBAAoJEGw4ysog2bOSLRUQAL/kMTW/MP2jYrnrG+7PjDbD YYqzGt9g7GfdXNCk3e8SWNvOluZBBo2FngD16UGOC4Uv3QWK62xKnN3BX/nsONuj 8FJ+QmR5h1KclOJIaqq//kIsBig+wCx+zOTYqgyXcge78nCsO6zOJlynLciQhcAj YMTeoCk+SspSdZ6MRQ/K0vUjZPsLj8NgQNjQRJkuK/yhOhL4no35drgivpVgBjbh yl6UWTLIqGAd//93LzvQ0Eq9OpaEJJFN6aUQHX2lPbMmuhSAxeqA9E8H0mBFBPFe rGUQ0U1b3MvLwWGJi849yGoq/Yu3WDmx2w2pxpV1IydH46YBHfQYdaoK5tVhN4+g EFGe4cUU0jKSMS8shOkUUEymprrfwFXNstiMnqe7uRpDzvPAbvmhNwcxFmgHDkzJ 2SoovfM04JZhZX6naunyxP1y2yPp7yvobo9O3U1JdVdQqIcTWqCL1OC7tw34raqV ALOipLQH1Y3dqTp27sbZUqH60VfW0582+iREe1yqpkF0LuyN3Q+2zh1o231uo5Yr Ju14Ni4nzWcaUIOEf4BrqpVIX4qRxjzeT8JY+Sg0SRZUdYvKPZR/c6SHonpeHwRk IaYq7xcPWXjr9rfTSfMgcgOj6orec6n7zL3in0owdVRdkWCj8Cwcb1M327ozkQFV M/OwD00FjIOsf2V4nkIC =na4+ -----END PGP SIGNATURE----- --/mvwczta11gu4fnM--