All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/3] dump-guest-memory: Add blocker for migration
@ 2021-09-22 16:20 Peter Xu
  2021-09-22 16:20 ` [PATCH v3 1/3] migration: Make migration blocker work for snapshots too Peter Xu
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Peter Xu @ 2021-09-22 16:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Andrew Jones, Juan Quintela, Dr . David Alan Gilbert, peterx,
	Markus Armbruster, Leonardo Bras Soares Passos,
	Marc-André Lureau, David Gibson

v3:
- Patch 3: in qmp_dump_guest_memory(), keeps the RUN_STATE_INMIGRATE check
  [Marc-Andre]

v2:
- One more patch: "migration: Make migration blocker work for snapshots too"
- Move register of migration blocker to be before dump_init [Marc-Andre]
- Collected r-bs

Both dump-guest-memory and live migration have vm state cached internally.
Allowing them to happen together means the vm state can be messed up.  Simply
block live migration for dump-guest-memory.

One trivial thing to mention is we should still allow dump-guest-memory even if
-only-migratable is specified, because that flag should majorly be used to
guarantee not adding devices that will block migration by accident.  Dump guest
memory is not like that - it'll only block for the seconds when it's dumping.

Thanks,

Peter Xu (3):
  migration: Make migration blocker work for snapshots too
  migration: Add migrate_add_blocker_internal()
  dump-guest-memory: Block live migration

 dump/dump.c                 | 19 +++++++++++++++++++
 include/migration/blocker.h | 16 ++++++++++++++++
 migration/migration.c       | 24 +++++++++++++++---------
 3 files changed, 50 insertions(+), 9 deletions(-)

-- 
2.31.1



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v3 1/3] migration: Make migration blocker work for snapshots too
  2021-09-22 16:20 [PATCH v3 0/3] dump-guest-memory: Add blocker for migration Peter Xu
@ 2021-09-22 16:20 ` Peter Xu
  2021-11-01 12:27   ` Juan Quintela
  2021-09-22 16:20 ` [PATCH v3 2/3] migration: Add migrate_add_blocker_internal() Peter Xu
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Peter Xu @ 2021-09-22 16:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Andrew Jones, Juan Quintela, Dr . David Alan Gilbert, peterx,
	Markus Armbruster, Leonardo Bras Soares Passos,
	Marc-André Lureau, David Gibson

save_snapshot() checks migration blocker, which looks sane.  At the meantime we
should also teach the blocker add helper to fail if during a snapshot, just
like for migrations.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
 migration/migration.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/migration/migration.c b/migration/migration.c
index bb909781b7..6f7177daa0 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2048,15 +2048,16 @@ int migrate_add_blocker(Error *reason, Error **errp)
         return -EACCES;
     }
 
-    if (migration_is_idle()) {
-        migration_blockers = g_slist_prepend(migration_blockers, reason);
-        return 0;
+    /* Snapshots are similar to migrations, so check RUN_STATE_SAVE_VM too. */
+    if (runstate_check(RUN_STATE_SAVE_VM) || !migration_is_idle()) {
+        error_propagate_prepend(errp, error_copy(reason),
+                                "disallowing migration blocker "
+                                "(migration/snapshot in progress) for: ");
+        return -EBUSY;
     }
 
-    error_propagate_prepend(errp, error_copy(reason),
-                            "disallowing migration blocker "
-                            "(migration in progress) for: ");
-    return -EBUSY;
+    migration_blockers = g_slist_prepend(migration_blockers, reason);
+    return 0;
 }
 
 void migrate_del_blocker(Error *reason)
-- 
2.31.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v3 2/3] migration: Add migrate_add_blocker_internal()
  2021-09-22 16:20 [PATCH v3 0/3] dump-guest-memory: Add blocker for migration Peter Xu
  2021-09-22 16:20 ` [PATCH v3 1/3] migration: Make migration blocker work for snapshots too Peter Xu
@ 2021-09-22 16:20 ` Peter Xu
  2021-09-22 16:20 ` [PATCH v3 3/3] dump-guest-memory: Block live migration Peter Xu
  2021-10-15  1:34 ` [PATCH v3 0/3] dump-guest-memory: Add blocker for migration Peter Xu
  3 siblings, 0 replies; 8+ messages in thread
From: Peter Xu @ 2021-09-22 16:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Andrew Jones, Juan Quintela, Dr . David Alan Gilbert, peterx,
	Markus Armbruster, Leonardo Bras Soares Passos,
	Marc-André Lureau, David Gibson

An internal version that removes -only-migratable implications.  It can be used
for temporary migration blockers like dump-guest-memory.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
 include/migration/blocker.h | 16 ++++++++++++++++
 migration/migration.c       | 21 +++++++++++++--------
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/include/migration/blocker.h b/include/migration/blocker.h
index acd27018e9..9cebe2ba06 100644
--- a/include/migration/blocker.h
+++ b/include/migration/blocker.h
@@ -25,6 +25,22 @@
  */
 int migrate_add_blocker(Error *reason, Error **errp);
 
+/**
+ * @migrate_add_blocker_internal - prevent migration from proceeding without
+ *                                 only-migrate implications
+ *
+ * @reason - an error to be returned whenever migration is attempted
+ *
+ * @errp - [out] The reason (if any) we cannot block migration right now.
+ *
+ * @returns - 0 on success, -EBUSY on failure, with errp set.
+ *
+ * Some of the migration blockers can be temporary (e.g., for a few seconds),
+ * so it shouldn't need to conflict with "-only-migratable".  For those cases,
+ * we can call this function rather than @migrate_add_blocker().
+ */
+int migrate_add_blocker_internal(Error *reason, Error **errp);
+
 /**
  * @migrate_del_blocker - remove a blocking error from migration
  *
diff --git a/migration/migration.c b/migration/migration.c
index 6f7177daa0..d6207c53f0 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2039,15 +2039,8 @@ void migrate_init(MigrationState *s)
     s->threshold_size = 0;
 }
 
-int migrate_add_blocker(Error *reason, Error **errp)
+int migrate_add_blocker_internal(Error *reason, Error **errp)
 {
-    if (only_migratable) {
-        error_propagate_prepend(errp, error_copy(reason),
-                                "disallowing migration blocker "
-                                "(--only-migratable) for: ");
-        return -EACCES;
-    }
-
     /* Snapshots are similar to migrations, so check RUN_STATE_SAVE_VM too. */
     if (runstate_check(RUN_STATE_SAVE_VM) || !migration_is_idle()) {
         error_propagate_prepend(errp, error_copy(reason),
@@ -2060,6 +2053,18 @@ int migrate_add_blocker(Error *reason, Error **errp)
     return 0;
 }
 
+int migrate_add_blocker(Error *reason, Error **errp)
+{
+    if (only_migratable) {
+        error_propagate_prepend(errp, error_copy(reason),
+                                "disallowing migration blocker "
+                                "(--only-migratable) for: ");
+        return -EACCES;
+    }
+
+    return migrate_add_blocker_internal(reason, errp);
+}
+
 void migrate_del_blocker(Error *reason)
 {
     migration_blockers = g_slist_remove(migration_blockers, reason);
-- 
2.31.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v3 3/3] dump-guest-memory: Block live migration
  2021-09-22 16:20 [PATCH v3 0/3] dump-guest-memory: Add blocker for migration Peter Xu
  2021-09-22 16:20 ` [PATCH v3 1/3] migration: Make migration blocker work for snapshots too Peter Xu
  2021-09-22 16:20 ` [PATCH v3 2/3] migration: Add migrate_add_blocker_internal() Peter Xu
@ 2021-09-22 16:20 ` Peter Xu
  2021-09-22 16:28   ` Marc-André Lureau
  2021-11-01 12:28   ` Juan Quintela
  2021-10-15  1:34 ` [PATCH v3 0/3] dump-guest-memory: Add blocker for migration Peter Xu
  3 siblings, 2 replies; 8+ messages in thread
From: Peter Xu @ 2021-09-22 16:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Andrew Jones, Juan Quintela, Dr . David Alan Gilbert, peterx,
	Markus Armbruster, Leonardo Bras Soares Passos,
	Marc-André Lureau, David Gibson

Both dump-guest-memory and live migration caches vm state at the beginning.
Either of them entering the other one will cause race on the vm state, and even
more severe on that (please refer to the crash report in the bug link).

Let's block live migration in dump-guest-memory, and that'll also block
dump-guest-memory if it detected that we're during a live migration.

Side note: migrate_del_blocker() can be called even if the blocker is not
inserted yet, so it's safe to unconditionally delete that blocker in
dump_cleanup (g_slist_remove allows no-entry-found case).

Suggested-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1996609
Signed-off-by: Peter Xu <peterx@redhat.com>
---
 dump/dump.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/dump/dump.c b/dump/dump.c
index ab625909f3..662d0a62cd 100644
--- a/dump/dump.c
+++ b/dump/dump.c
@@ -29,6 +29,7 @@
 #include "qemu/error-report.h"
 #include "qemu/main-loop.h"
 #include "hw/misc/vmcoreinfo.h"
+#include "migration/blocker.h"
 
 #ifdef TARGET_X86_64
 #include "win_dump.h"
@@ -47,6 +48,8 @@
 
 #define MAX_GUEST_NOTE_SIZE (1 << 20) /* 1MB should be enough */
 
+static Error *dump_migration_blocker;
+
 #define ELF_NOTE_SIZE(hdr_size, name_size, desc_size)   \
     ((DIV_ROUND_UP((hdr_size), 4) +                     \
       DIV_ROUND_UP((name_size), 4) +                    \
@@ -101,6 +104,7 @@ static int dump_cleanup(DumpState *s)
             qemu_mutex_unlock_iothread();
         }
     }
+    migrate_del_blocker(dump_migration_blocker);
 
     return 0;
 }
@@ -2005,6 +2009,21 @@ void qmp_dump_guest_memory(bool paging, const char *file,
         return;
     }
 
+    if (!dump_migration_blocker) {
+        error_setg(&dump_migration_blocker,
+                   "Live migration disabled: dump-guest-memory in progress");
+    }
+
+    /*
+     * Allows even for -only-migratable, but forbid migration during the
+     * process of dump guest memory.
+     */
+    if (migrate_add_blocker_internal(dump_migration_blocker, errp)) {
+        /* Remember to release the fd before passing it over to dump state */
+        close(fd);
+        return;
+    }
+
     s = &dump_state_global;
     dump_state_prepare(s);
 
-- 
2.31.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 3/3] dump-guest-memory: Block live migration
  2021-09-22 16:20 ` [PATCH v3 3/3] dump-guest-memory: Block live migration Peter Xu
@ 2021-09-22 16:28   ` Marc-André Lureau
  2021-11-01 12:28   ` Juan Quintela
  1 sibling, 0 replies; 8+ messages in thread
From: Marc-André Lureau @ 2021-09-22 16:28 UTC (permalink / raw)
  To: Peter Xu
  Cc: Andrew Jones, Juan Quintela, Markus Armbruster, qemu-devel,
	Leonardo Bras Soares Passos, Dr . David Alan Gilbert,
	David Gibson

[-- Attachment #1: Type: text/plain, Size: 2636 bytes --]

On Wed, Sep 22, 2021 at 8:20 PM Peter Xu <peterx@redhat.com> wrote:

> Both dump-guest-memory and live migration caches vm state at the beginning.
> Either of them entering the other one will cause race on the vm state, and
> even
> more severe on that (please refer to the crash report in the bug link).
>
> Let's block live migration in dump-guest-memory, and that'll also block
> dump-guest-memory if it detected that we're during a live migration.
>
> Side note: migrate_del_blocker() can be called even if the blocker is not
> inserted yet, so it's safe to unconditionally delete that blocker in
> dump_cleanup (g_slist_remove allows no-entry-found case).
>
> Suggested-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1996609
> Signed-off-by: Peter Xu <peterx@redhat.com>
>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

---
>  dump/dump.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
>
> diff --git a/dump/dump.c b/dump/dump.c
> index ab625909f3..662d0a62cd 100644
> --- a/dump/dump.c
> +++ b/dump/dump.c
> @@ -29,6 +29,7 @@
>  #include "qemu/error-report.h"
>  #include "qemu/main-loop.h"
>  #include "hw/misc/vmcoreinfo.h"
> +#include "migration/blocker.h"
>
>  #ifdef TARGET_X86_64
>  #include "win_dump.h"
> @@ -47,6 +48,8 @@
>
>  #define MAX_GUEST_NOTE_SIZE (1 << 20) /* 1MB should be enough */
>
> +static Error *dump_migration_blocker;
> +
>  #define ELF_NOTE_SIZE(hdr_size, name_size, desc_size)   \
>      ((DIV_ROUND_UP((hdr_size), 4) +                     \
>        DIV_ROUND_UP((name_size), 4) +                    \
> @@ -101,6 +104,7 @@ static int dump_cleanup(DumpState *s)
>              qemu_mutex_unlock_iothread();
>          }
>      }
> +    migrate_del_blocker(dump_migration_blocker);
>
>      return 0;
>  }
> @@ -2005,6 +2009,21 @@ void qmp_dump_guest_memory(bool paging, const char
> *file,
>          return;
>      }
>
> +    if (!dump_migration_blocker) {
> +        error_setg(&dump_migration_blocker,
> +                   "Live migration disabled: dump-guest-memory in
> progress");
> +    }
> +
> +    /*
> +     * Allows even for -only-migratable, but forbid migration during the
> +     * process of dump guest memory.
> +     */
> +    if (migrate_add_blocker_internal(dump_migration_blocker, errp)) {
> +        /* Remember to release the fd before passing it over to dump
> state */
> +        close(fd);
> +        return;
> +    }
> +
>      s = &dump_state_global;
>      dump_state_prepare(s);
>
> --
> 2.31.1
>
>

[-- Attachment #2: Type: text/html, Size: 3735 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 0/3] dump-guest-memory: Add blocker for migration
  2021-09-22 16:20 [PATCH v3 0/3] dump-guest-memory: Add blocker for migration Peter Xu
                   ` (2 preceding siblings ...)
  2021-09-22 16:20 ` [PATCH v3 3/3] dump-guest-memory: Block live migration Peter Xu
@ 2021-10-15  1:34 ` Peter Xu
  3 siblings, 0 replies; 8+ messages in thread
From: Peter Xu @ 2021-10-15  1:34 UTC (permalink / raw)
  To: qemu-devel
  Cc: Andrew Jones, Juan Quintela, Markus Armbruster,
	Dr . David Alan Gilbert, Leonardo Bras Soares Passos,
	Marc-André Lureau, David Gibson

On Wed, Sep 22, 2021 at 12:20:06PM -0400, Peter Xu wrote:
> v3:
> - Patch 3: in qmp_dump_guest_memory(), keeps the RUN_STATE_INMIGRATE check
>   [Marc-Andre]

Ping - More comments?

If to go, should this go via dump or migration?  I think it belongs more to
migration more (and I got Marc-Andre's ack on all patches).. but leaving that
to maintainers.

Thanks,

-- 
Peter Xu



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 1/3] migration: Make migration blocker work for snapshots too
  2021-09-22 16:20 ` [PATCH v3 1/3] migration: Make migration blocker work for snapshots too Peter Xu
@ 2021-11-01 12:27   ` Juan Quintela
  0 siblings, 0 replies; 8+ messages in thread
From: Juan Quintela @ 2021-11-01 12:27 UTC (permalink / raw)
  To: Peter Xu
  Cc: Andrew Jones, Markus Armbruster, qemu-devel,
	Leonardo Bras Soares Passos, Marc-André Lureau,
	Dr . David Alan Gilbert, David Gibson

Peter Xu <peterx@redhat.com> wrote:
> save_snapshot() checks migration blocker, which looks sane.  At the meantime we
> should also teach the blocker add helper to fail if during a snapshot, just
> like for migrations.
>
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Signed-off-by: Peter Xu <peterx@redhat.com>

Reviewed-by: Juan Quintela <quintela@redhat.com>



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 3/3] dump-guest-memory: Block live migration
  2021-09-22 16:20 ` [PATCH v3 3/3] dump-guest-memory: Block live migration Peter Xu
  2021-09-22 16:28   ` Marc-André Lureau
@ 2021-11-01 12:28   ` Juan Quintela
  1 sibling, 0 replies; 8+ messages in thread
From: Juan Quintela @ 2021-11-01 12:28 UTC (permalink / raw)
  To: Peter Xu
  Cc: Andrew Jones, Markus Armbruster, qemu-devel,
	Leonardo Bras Soares Passos, Marc-André Lureau,
	Dr . David Alan Gilbert, David Gibson

Peter Xu <peterx@redhat.com> wrote:
> Both dump-guest-memory and live migration caches vm state at the beginning.
> Either of them entering the other one will cause race on the vm state, and even
> more severe on that (please refer to the crash report in the bug link).
>
> Let's block live migration in dump-guest-memory, and that'll also block
> dump-guest-memory if it detected that we're during a live migration.
>
> Side note: migrate_del_blocker() can be called even if the blocker is not
> inserted yet, so it's safe to unconditionally delete that blocker in
> dump_cleanup (g_slist_remove allows no-entry-found case).
>
> Suggested-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1996609
> Signed-off-by: Peter Xu <peterx@redhat.com>

Reviewed-by: Juan Quintela <quintela@redhat.com>



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-11-01 12:31 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-22 16:20 [PATCH v3 0/3] dump-guest-memory: Add blocker for migration Peter Xu
2021-09-22 16:20 ` [PATCH v3 1/3] migration: Make migration blocker work for snapshots too Peter Xu
2021-11-01 12:27   ` Juan Quintela
2021-09-22 16:20 ` [PATCH v3 2/3] migration: Add migrate_add_blocker_internal() Peter Xu
2021-09-22 16:20 ` [PATCH v3 3/3] dump-guest-memory: Block live migration Peter Xu
2021-09-22 16:28   ` Marc-André Lureau
2021-11-01 12:28   ` Juan Quintela
2021-10-15  1:34 ` [PATCH v3 0/3] dump-guest-memory: Add blocker for migration Peter Xu

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.