From: David Gibson <david@gibson.dropbear.id.au>
To: Alexey Kardashevskiy <aik@ozlabs.ru>
Cc: Alex Williamson <alex.williamson@redhat.com>,
qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
Alexander Graf <agraf@suse.de>
Subject: Re: [Qemu-devel] [PATCH qemu v15 07/17] spapr_iommu: Migrate full state
Date: Tue, 5 Apr 2016 15:58:43 +1000 [thread overview]
Message-ID: <20160405055843.GU16485@voom.fritz.box> (raw)
In-Reply-To: <1459762426-18440-8-git-send-email-aik@ozlabs.ru>
[-- Attachment #1: Type: text/plain, Size: 6605 bytes --]
On Mon, Apr 04, 2016 at 07:33:36PM +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.
>
> 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.
>
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
The mig_table stuff is kind of ugly, but I don't know of any better
way to do it with our current migration infrastructure.
> ---
> 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
>
> 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(-)
>
> 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(MemoryRegion *iommu, hwaddr addr,
> return ret;
> }
>
> +static void spapr_tce_table_pre_save(void *opaque)
> +{
> + sPAPRTCETable *tcet = SPAPR_TCE_TABLE(opaque);
> +
> + tcet->mig_table = tcet->table;
> + tcet->mig_nb_table = 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 = SPAPR_TCE_TABLE(opaque);
> + uint32_t old_nb_table = tcet->nb_table;
>
> if (tcet->vdev) {
> spapr_vio_set_bypass(tcet->vdev, tcet->bypass);
> }
>
> + if (tcet->enabled) {
> + if (tcet->nb_table != tcet->mig_nb_table) {
> + if (tcet->nb_table) {
> + spapr_tce_table_do_disable(tcet);
> + }
> + tcet->nb_table = 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 = 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_table,
> + tcet->bus_offset, tcet->page_shift);
> +
> return 0;
> }
>
> +static bool spapr_tce_table_ex_needed(void *opaque)
> +{
> + sPAPRTCETable *tcet = opaque;
> +
> + return tcet->bus_offset || tcet->page_shift != 0xC;
> +}
> +
> +static const VMStateDescription vmstate_spapr_tce_table_ex = {
> + .name = "spapr_iommu_ex",
> + .version_id = 1,
> + .minimum_version_id = 1,
> + .needed = spapr_tce_table_ex_needed,
> + .fields = (VMStateField[]) {
> + VMSTATE_BOOL(enabled, sPAPRTCETable),
> + VMSTATE_UINT64(bus_offset, sPAPRTCETable),
> + VMSTATE_UINT32(page_shift, sPAPRTCETable),
> + VMSTATE_END_OF_LIST()
> + },
> +};
> +
> static const VMStateDescription vmstate_spapr_tce_table = {
> .name = "spapr_iommu",
> .version_id = 2,
> .minimum_version_id = 2,
> + .pre_save = spapr_tce_table_pre_save,
> .post_load = spapr_tce_table_post_load,
> .fields = (VMStateField []) {
> /* Sanity check */
> VMSTATE_UINT32_EQUAL(liobn, sPAPRTCETable),
> - VMSTATE_UINT32_EQUAL(nb_table, sPAPRTCETable),
>
> /* 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_table, 0,
> + vmstate_info_uint64, uint64_t),
>
> VMSTATE_END_OF_LIST()
> },
> + .subsections = (const VMStateDescription*[]) {
> + &vmstate_spapr_tce_table_ex,
> + NULL
> + }
> };
>
> static MemoryRegionIOMMUOps spapr_iommu_ops = {
> 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;
> diff --git a/trace-events b/trace-events
> index 62dcbba..4335b9b 100644
> --- a/trace-events
> +++ b/trace-events
> @@ -1431,6 +1431,8 @@ spapr_iommu_pci_indirect(uint64_t liobn, uint64_t ioba, 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=%"PRIx64" ioba=0x%"PRIx64" tcevalue=0x%"PRIx64" npages=%"PRId64" ret=%"PRId64
> spapr_iommu_xlate(uint64_t liobn, uint64_t ioba, uint64_t tce, unsigned perm, unsigned pgsize) "liobn=%"PRIx64" 0x%"PRIx64" -> 0x%"PRIx64" perm=%u mask=%x"
> spapr_iommu_new_table(uint64_t liobn, void *table, int fd) "liobn=%"PRIx64" table=%p fd=%d"
> +spapr_iommu_pre_save(uint64_t liobn, uint32_t nb, uint64_t offs, uint32_t ps) "liobn=%"PRIx64" %"PRIx32" bus_offset=%"PRIx64" ps=%"PRIu32
> +spapr_iommu_post_load(uint64_t liobn, uint32_t pre_nb, uint32_t post_nb, uint64_t offs, uint32_t ps) "liobn=%"PRIx64" %"PRIx32" => %"PRIx32" bus_offset=%"PRIx64" ps=%"PRIu32
>
> # hw/ppc/ppc.c
> ppc_tb_adjust(uint64_t offs1, uint64_t offs2, int64_t diff, int64_t seconds) "adjusted from 0x%"PRIx64" to 0x%"PRIx64", diff %"PRId64" (%"PRId64"s)"
--
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
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-04-05 5:58 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-04 9:33 [Qemu-devel] [PATCH qemu v15 00/17] spapr: vfio: Enable Dynamic DMA windows (DDW) Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 01/17] memory: Fix IOMMU replay base address Alexey Kardashevskiy
2016-04-05 1:34 ` David Gibson
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 02/17] vmstate: Define VARRAY with VMS_ALLOC Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 03/17] vfio: Check that IOMMU MR translates to system address space Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 04/17] spapr_iommu: Move table allocation to helpers Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 05/17] spapr_iommu: Introduce "enabled" state for TCE table Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 06/17] spapr_iommu: Finish renaming vfio_accel to need_vfio Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 07/17] spapr_iommu: Migrate full state Alexey Kardashevskiy
2016-04-05 5:58 ` David Gibson [this message]
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 08/17] spapr_iommu: Add root memory region Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 09/17] spapr_pci: Reset DMA config on PHB reset Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 10/17] memory: Add reporting of supported page sizes Alexey Kardashevskiy
2016-04-06 5:52 ` David Gibson
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 11/17] vfio: spapr: Add SPAPR IOMMU v2 support (DMA memory preregistering) Alexey Kardashevskiy
2016-04-06 6:05 ` David Gibson
2016-04-20 8:51 ` Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 12/17] spapr_pci: Add and export DMA resetting helper Alexey Kardashevskiy
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 13/17] vfio: Add host side DMA window capabilities Alexey Kardashevskiy
2016-04-06 7:10 ` David Gibson
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 14/17] spapr_iommu, vfio, memory: Notify IOMMU about starting/stopping being used by VFIO Alexey Kardashevskiy
2016-04-07 0:40 ` David Gibson
2016-04-20 9:15 ` Alexey Kardashevskiy
2016-04-21 3:59 ` David Gibson
2016-04-21 4:22 ` Alexey Kardashevskiy
2016-04-26 2:28 ` Alexey Kardashevskiy
2016-04-27 6:39 ` David Gibson
2016-04-27 9:14 ` Alexey Kardashevskiy
2016-04-28 1:02 ` David Gibson
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 15/17] spapr_pci: Get rid of dma_loibn Alexey Kardashevskiy
2016-04-07 0:50 ` David Gibson
2016-04-07 7:10 ` Alexey Kardashevskiy
2016-04-08 1:34 ` David Gibson
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 16/17] vfio/spapr: Use VFIO_SPAPR_TCE_v2_IOMMU Alexey Kardashevskiy
2016-04-07 1:10 ` David Gibson
2016-04-20 9:43 ` Alexey Kardashevskiy
2016-04-21 4:03 ` David Gibson
2016-04-04 9:33 ` [Qemu-devel] [PATCH qemu v15 17/17] spapr_pci/spapr_pci_vfio: Support Dynamic DMA Windows (DDW) Alexey Kardashevskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160405055843.GU16485@voom.fritz.box \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=alex.williamson@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.