94 lines
3.1 KiB
Diff
94 lines
3.1 KiB
Diff
|
From d1c6d059f8936adf7b8c3e2b29b2eb290b0792ac Mon Sep 17 00:00:00 2001
|
||
|
From: Peter Xu <peterx@redhat.com>
|
||
|
Date: Wed, 22 Sep 2021 12:20:09 -0400
|
||
|
Subject: [PATCH 3/6] dump-guest-memory: Block live migration
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
RH-Author: Peter Xu <peterx@redhat.com>
|
||
|
RH-MergeRequest: 51: dump-guest-memory: Add blocker for migration
|
||
|
RH-Commit: [3/3] 711dcc0018f70bcb87496c5aa235633a6daf5c2d (peterx/qemu-kvm)
|
||
|
RH-Bugzilla: 1996609
|
||
|
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||
|
RH-Acked-by: quintela1 <quintela@redhat.com>
|
||
|
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||
|
|
||
|
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>
|
||
|
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
||
|
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||
|
(cherry picked from commit b7bc6b182883bb3097dde2a25d041f28bde2b89c)
|
||
|
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.27.0
|
||
|
|