From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53006) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aiCHv-0005FG-E3 for qemu-devel@nongnu.org; Mon, 21 Mar 2016 22:43:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aiCHs-00036X-3A for qemu-devel@nongnu.org; Mon, 21 Mar 2016 22:43:19 -0400 Date: Tue, 22 Mar 2016 12:23:06 +1100 From: David Gibson Message-ID: <20160322012306.GW23586@voom.redhat.com> References: <1458546426-26222-1-git-send-email-aik@ozlabs.ru> <1458546426-26222-8-git-send-email-aik@ozlabs.ru> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="qxpYSgLynlcP4boX" Content-Disposition: inline In-Reply-To: <1458546426-26222-8-git-send-email-aik@ozlabs.ru> Subject: Re: [Qemu-devel] [PATCH qemu v14 07/18] spapr_iommu: Realloc table during migration List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy Cc: Alex Williamson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org --qxpYSgLynlcP4boX Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Mar 21, 2016 at 06:46:55PM +1100, 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 > Signed-off-by: Alexey Kardashevskiy > --- > Changes: > v14: > * new to the series > --- > hw/ppc/spapr_iommu.c | 36 ++++++++++++++++++++++++++++++++++-- > include/hw/ppc/spapr.h | 2 ++ > 2 files changed, 36 insertions(+), 2 deletions(-) >=20 > diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c > index 9bcd3f6..549cd94 100644 > --- a/hw/ppc/spapr_iommu.c > +++ b/hw/ppc/spapr_iommu.c > @@ -137,6 +137,16 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(Memor= yRegion *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; Don't you need to set mig_nb_table here as well? I can't see anywhere else it's initialized. > +} > + > +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); > @@ -145,6 +155,26 @@ static int spapr_tce_table_post_load(void *opaque, i= nt version_id) > 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); > + } > + Clunky, but I don't know of a better way. > return 0; > } > =20 > @@ -152,15 +182,17 @@ static const VMStateDescription vmstate_spapr_tce_t= able =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, nb_table, = 0, > + vmstate_info_uint64, uint64_t), > =20 > VMSTATE_END_OF_LIST() > }, > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h > index 75b0b55..c1ea49c 100644 > --- a/include/hw/ppc/spapr.h > +++ b/include/hw/ppc/spapr.h > @@ -545,6 +545,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; --=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 --qxpYSgLynlcP4boX Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW8J56AAoJEGw4ysog2bOSQsMP/jtn+wo8eF3AnukrgdpsRekl 84iclQ+9XlterCBXRWiDcCG2AZTHOuKd9aaebD6YtySI38A3qN19y0r88C2b7DwI NhFjBPvS35t4X3egtf+RbmYjCXbXW5wdYpjysD8yV3dbJzrhHe3SRMIJ7WTDvDm4 GSYO9z2uepW5b+nSenzH7CjGL6r+u5RLwsUIRT7I+x9iXiEDtPzbm/XSVlOsGbOE BkQmHzT6ogbd+jZaisat9wz8efdwD1LSI71RP+Z7xKoVWrt7pvH4AmZ/TWxmzU5v LqWSWCthhuuFOKZKXk1PWJkUKTWO6RweZ42IMMXtT4VZY+liZRGxnsjDx8v/SKxN 2RMeKKIunSs3WJ6QlcNIiz1A6hADC5wR4W+TDJzPT8AVW1uRuyPS2NmIZ0HHaoj+ dsI8q+8k4mAgUBs+O5ZGWmyb1VSCFO1MARPJfzjPJHdLh3gwCzqMOpfByR9Cum6w PB2Xg89zUHIYFhwfF7/H2FAuREn3le/I9l45Vt+hlaXMCbb7VMQbbDs9zGsSivFW wAUD/GBh9sxjsk/0IZuDznmaxx/SMEVErV9mn6demMGuIdLdrCi3NzmLgBDzEw53 x77WP9pC1QNBTuv38yPr3ZLlTTnoxQ1Aa1YAJ2Yya2d0y3pC43HmKNkpTzvvyVL9 VWyfPBdABybnYppyYIoy =Vp0X -----END PGP SIGNATURE----- --qxpYSgLynlcP4boX--