xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xenproject.org
Cc: Olaf Hering <olaf@aepfle.de>, Ian Jackson <iwj@xenproject.org>,
	Wei Liu <wl@xen.org>
Subject: [PATCH v20210601 37/38] tools: remove migration stream verify code
Date: Tue,  1 Jun 2021 18:11:17 +0200	[thread overview]
Message-ID: <20210601161118.18986-38-olaf@aepfle.de> (raw)
In-Reply-To: <20210601161118.18986-1-olaf@aepfle.de>

The verify code tries to make sure the transferred pages from the paused
domU were received correctly in the previous, final iteration. Every
page is transferred once again by the sender, the receiver compares the
content with what is already mapped into the not-yet started domU.

This does unfortunately not work because a domU has also a number of
pages in its grant table, so that frondend drivers can communicate with
the backend drivers. Since the backend drivers are unaware about the
ongoing saving of the domU, they will continue to write into the shared
pages. As a result the verification of the domU pages will fail.

This is not fixable, so remove the verification code.

The sending side will never send a REC_TYPE_VERIFY record again. It will
silently accept, and ignore the debug flag.

The receiving side will abort an almost complete migration in case it
sees a REC_TYPE_VERIFY record from an old sender. That record is sent at
the very end, it has no way to know in advance that verification was
requested.

Signed-off-by: Olaf Hering <olaf@aepfle.de>
---
 tools/libs/saverestore/common.h  |  7 ------
 tools/libs/saverestore/restore.c | 43 ++++----------------------------
 tools/libs/saverestore/save.c    | 43 --------------------------------
 3 files changed, 5 insertions(+), 88 deletions(-)

diff --git a/tools/libs/saverestore/common.h b/tools/libs/saverestore/common.h
index b323c1b71a..b8ca24e667 100644
--- a/tools/libs/saverestore/common.h
+++ b/tools/libs/saverestore/common.h
@@ -354,9 +354,6 @@ struct xc_sr_context
             /* Live migrate vs non live suspend. */
             bool live;
 
-            /* Further debugging information in the stream. */
-            bool debug;
-
             unsigned long p2m_size;
             size_t pages_sent;
             size_t overhead_sent;
@@ -418,10 +415,6 @@ struct xc_sr_context
             /* Bitmap of currently populated PFNs during restore. */
             struct xg_sr_bitmap populated_pfns;
 
-            /* Sender has invoked verify mode on the stream. */
-            bool verify;
-            void *verify_buf;
-
             struct xc_sr_restore_arrays *m;
             void *guest_mapping;
             uint32_t nr_mapped_pages;
diff --git a/tools/libs/saverestore/restore.c b/tools/libs/saverestore/restore.c
index d4657e8e57..9a7253a972 100644
--- a/tools/libs/saverestore/restore.c
+++ b/tools/libs/saverestore/restore.c
@@ -337,10 +337,7 @@ static int handle_incoming_page_data(struct xc_sr_context *ctx,
             continue;
 
         m->iov[iov_idx].iov_len = PAGE_SIZE;
-        if ( ctx->restore.verify )
-            m->iov[iov_idx].iov_base = ctx->restore.verify_buf + i * PAGE_SIZE;
-        else
-            m->iov[iov_idx].iov_base = m->guest_data[i];
+        m->iov[iov_idx].iov_base = m->guest_data[i];
         iov_idx++;
     }
 
@@ -369,15 +366,6 @@ static int handle_incoming_page_data(struct xc_sr_context *ctx,
 
         }
 
-        if ( ctx->restore.verify )
-        {
-            if ( memcmp(m->guest_data[i], m->iov[iov_idx].iov_base, PAGE_SIZE) )
-            {
-                ERROR("verify pfn %#"PRIpfn" failed (type %#"PRIx32")",
-                      m->pfns[i], m->types[i] >> XEN_DOMCTL_PFINFO_LTAB_SHIFT);
-            }
-        }
-
         iov_idx++;
     }
 
@@ -447,20 +435,7 @@ static int handle_buffered_page_data(struct xc_sr_context *ctx,
 
         }
 
-        if ( ctx->restore.verify )
-        {
-            if ( memcmp(m->guest_data[i], p, PAGE_SIZE) )
-            {
-                errno = EIO;
-                ERROR("verify pfn %#"PRIpfn" failed (type %#"PRIx32")",
-                      m->pfns[i], m->types[i] >> XEN_DOMCTL_PFINFO_LTAB_SHIFT);
-                goto err;
-            }
-        }
-        else
-        {
-            memcpy(m->guest_data[i], p, PAGE_SIZE);
-        }
+        memcpy(m->guest_data[i], p, PAGE_SIZE);
 
         idx++;
     }
@@ -737,17 +712,9 @@ static int process_buffered_record(struct xc_sr_context *ctx, struct xc_sr_recor
         break;
 
     case REC_TYPE_VERIFY:
-        DPRINTF("Verify mode enabled");
-        ctx->restore.verify = true;
-        if ( !ctx->restore.verify_buf )
-        {
-            ctx->restore.verify_buf = malloc(MAX_BATCH_SIZE * PAGE_SIZE);
-            if ( !ctx->restore.verify_buf )
-            {
-                rc = -1;
-                PERROR("Unable to allocate verify_buf");
-            }
-        }
+        errno = EINVAL;
+        PERROR("Verify mode is obsolete");
+        rc = -1;
         break;
 
     case REC_TYPE_CHECKPOINT:
diff --git a/tools/libs/saverestore/save.c b/tools/libs/saverestore/save.c
index 523457eaba..2d34822509 100644
--- a/tools/libs/saverestore/save.c
+++ b/tools/libs/saverestore/save.c
@@ -707,41 +707,6 @@ static int suspend_and_send_dirty(struct xc_sr_context *ctx)
     return rc;
 }
 
-static int verify_frames(struct xc_sr_context *ctx)
-{
-    xc_interface *xch = ctx->xch;
-    xc_shadow_op_stats_t stats = { 0, ctx->save.p2m_size };
-    int rc;
-    struct xc_sr_record rec = { .type = REC_TYPE_VERIFY };
-
-    DPRINTF("Enabling verify mode");
-
-    rc = write_record(ctx, &rec);
-    if ( rc )
-        goto out;
-
-    xc_set_progress_prefix(xch, "Frames verify");
-    rc = send_all_pages(ctx);
-    if ( rc )
-        goto out;
-
-    if ( xc_shadow_control(
-             xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_PEEK,
-             &ctx->save.dirty_bitmap_hbuf, ctx->save.p2m_size,
-             NULL, 0, &stats) != ctx->save.p2m_size )
-    {
-        PERROR("Failed to retrieve logdirty bitmap");
-        rc = -1;
-        goto out;
-    }
-
-    DPRINTF("  Further stats: faults %u, dirty %u",
-            stats.fault_count, stats.dirty_count);
-
- out:
-    return rc;
-}
-
 /*
  * Send all domain memory.  This is the heart of the live migration loop.
  */
@@ -761,13 +726,6 @@ static int send_domain_memory_live(struct xc_sr_context *ctx)
     if ( rc )
         goto out;
 
-    if ( ctx->save.debug )
-    {
-        rc = verify_frames(ctx);
-        if ( rc )
-            goto out;
-    }
-
  out:
     return rc;
 }
@@ -1005,7 +963,6 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom,
     /* GCC 4.4 (of CentOS 6.x vintage) can' t initialise anonymous unions. */
     ctx.save.callbacks = callbacks;
     ctx.save.live  = !!(flags & XCFLAGS_LIVE);
-    ctx.save.debug = !!(flags & XCFLAGS_DEBUG);
     ctx.save.recv_fd = recv_fd;
 
     if ( xc_domain_getinfo(xch, dom, 1, &ctx.dominfo) != 1 )


  parent reply	other threads:[~2021-06-01 16:13 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-01 16:10 [PATCH v20210601 00/38] leftover from 2020 Olaf Hering
2021-06-01 16:10 ` [PATCH v20210601 01/38] tools: add API to work with sevaral bits at once Olaf Hering
2021-06-02  6:19   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 02/38] xl: fix description of migrate --debug Olaf Hering
2021-06-02  6:09   ` Juergen Gross
2021-06-02 10:43     ` Olaf Hering
2021-06-02 11:43       ` Juergen Gross
2021-06-02 12:32   ` [PATCH v20210602 " Olaf Hering
2021-06-02 13:48     ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 03/38] tools: create libxensaverestore Olaf Hering
2021-06-01 16:10 ` [PATCH v20210601 04/38] tools: add readv_exact to libxenctrl Olaf Hering
2021-06-02  6:30   ` Juergen Gross
2021-06-02 10:57     ` Olaf Hering
2021-06-02 11:05       ` Olaf Hering
2021-06-02 11:41       ` Juergen Gross
2021-06-07  9:46         ` Olaf Hering
2021-06-07 11:31         ` Olaf Hering
2021-06-01 16:10 ` [PATCH v20210601 05/38] tools: add xc_is_known_page_type " Olaf Hering
2021-06-02  6:51   ` Juergen Gross
2021-06-02 11:10     ` Olaf Hering
2021-06-02 11:48       ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 06/38] tools: use xc_is_known_page_type Olaf Hering
2021-06-02  6:53   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 07/38] tools: unify type checking for data pfns in migration stream Olaf Hering
2021-06-02  6:59   ` Juergen Gross
2021-06-02 11:21     ` Olaf Hering
2021-06-02 12:03       ` Juergen Gross
2021-06-07 10:12         ` Olaf Hering
2021-06-07 10:22           ` Juergen Gross
2021-06-18 12:25     ` Olaf Hering
2021-06-01 16:10 ` [PATCH v20210601 08/38] tools: show migration transfer rate in send_dirty_pages Olaf Hering
2021-06-02  7:10   ` Juergen Gross
2021-06-08  8:58     ` Olaf Hering
2021-06-08 10:07       ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 09/38] tools/guest: prepare to allocate arrays once Olaf Hering
2021-06-02  7:29   ` Juergen Gross
2021-06-02 12:03     ` Olaf Hering
2021-06-02 12:09       ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 10/38] tools/guest: save: move batch_pfns Olaf Hering
2021-06-02  7:31   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 11/38] tools/guest: save: move mfns array Olaf Hering
2021-06-02  7:32   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 12/38] tools/guest: save: move types array Olaf Hering
2021-06-02  7:32   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 13/38] tools/guest: save: move errors array Olaf Hering
2021-06-02  7:33   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 14/38] tools/guest: save: move iov array Olaf Hering
2021-06-02  7:34   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 15/38] tools/guest: save: move rec_pfns array Olaf Hering
2021-06-02  7:35   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 16/38] tools/guest: save: move guest_data array Olaf Hering
2021-06-02  7:39   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 17/38] tools/guest: save: move local_pages array Olaf Hering
2021-06-02  7:47   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 18/38] tools/guest: restore: move pfns array Olaf Hering
2021-06-02  7:55   ` Juergen Gross
2021-06-01 16:10 ` [PATCH v20210601 19/38] tools/guest: restore: move types array Olaf Hering
2021-06-02  7:56   ` Juergen Gross
2021-06-01 16:11 ` [PATCH v20210601 20/38] tools/guest: restore: move mfns array Olaf Hering
2021-06-02  7:57   ` Juergen Gross
2021-06-01 16:11 ` [PATCH v20210601 21/38] tools/guest: restore: move map_errs array Olaf Hering
2021-06-02  7:58   ` Juergen Gross
2021-06-01 16:11 ` [PATCH v20210601 22/38] tools/guest: restore: move mfns array in populate_pfns Olaf Hering
2021-06-02  7:59   ` Juergen Gross
2021-06-01 16:11 ` [PATCH v20210601 23/38] tools/guest: restore: move pfns " Olaf Hering
2021-06-02  7:59   ` Juergen Gross
2021-06-01 16:11 ` [PATCH v20210601 24/38] tools/guest: restore: split record processing Olaf Hering
2021-06-02  9:57   ` Juergen Gross
2021-06-01 16:11 ` [PATCH v20210601 25/38] tools/guest: restore: split handle_page_data Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 26/38] tools/guest: restore: write data directly into guest Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 27/38] tools: recognize LIBXL_API_VERSION for 4.16 Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 28/38] tools: adjust libxl_domain_suspend to receive a struct props Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 29/38] tools: change struct precopy_stats to precopy_stats_t Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 30/38] tools: add callback to libxl for precopy_policy and precopy_stats_t Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 31/38] tools: add --max_iters to libxl_domain_suspend Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 32/38] tools: add --min_remaining " Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 33/38] tools: add --abort_if_busy " Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 34/38] tools: add API for expandable bitmaps Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 35/38] tools: use xg_sr_bitmap for populated_pfns Olaf Hering
2021-06-01 16:11 ` [PATCH v20210601 36/38] tools: use superpages during restore of HVM guest Olaf Hering
2021-06-01 16:11 ` Olaf Hering [this message]
2021-06-01 16:11 ` [PATCH v20210601 38/38] hotplug/Linux: fix starting of xenstored with restarting systemd Olaf Hering
2021-06-02  6:10 ` [PATCH v20210601 00/38] leftover from 2020 Juergen Gross
2021-06-02  6:54   ` Olaf Hering
2021-06-02  7:00     ` Juergen Gross
2021-06-02 12:07       ` Olaf Hering
2021-06-02 12:15         ` Juergen Gross

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=20210601161118.18986-38-olaf@aepfle.de \
    --to=olaf@aepfle.de \
    --cc=iwj@xenproject.org \
    --cc=wl@xen.org \
    --cc=xen-devel@lists.xenproject.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).