|
@@ -29,6 +29,7 @@
|
|
#include "qemu/error-report.h"
|
|
#include "qemu/error-report.h"
|
|
#include "qemu/main-loop.h"
|
|
#include "qemu/main-loop.h"
|
|
#include "hw/misc/vmcoreinfo.h"
|
|
#include "hw/misc/vmcoreinfo.h"
|
|
|
|
+#include "migration/blocker.h"
|
|
|
|
|
|
#ifdef TARGET_X86_64
|
|
#ifdef TARGET_X86_64
|
|
#include "win_dump.h"
|
|
#include "win_dump.h"
|
|
@@ -47,6 +48,8 @@
|
|
|
|
|
|
#define MAX_GUEST_NOTE_SIZE (1 << 20) /* 1MB should be enough */
|
|
#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) \
|
|
#define ELF_NOTE_SIZE(hdr_size, name_size, desc_size) \
|
|
((DIV_ROUND_UP((hdr_size), 4) + \
|
|
((DIV_ROUND_UP((hdr_size), 4) + \
|
|
DIV_ROUND_UP((name_size), 4) + \
|
|
DIV_ROUND_UP((name_size), 4) + \
|
|
@@ -101,6 +104,7 @@ static int dump_cleanup(DumpState *s)
|
|
qemu_mutex_unlock_iothread();
|
|
qemu_mutex_unlock_iothread();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ migrate_del_blocker(dump_migration_blocker);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -2005,6 +2009,21 @@ void qmp_dump_guest_memory(bool paging, const char *file,
|
|
return;
|
|
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;
|
|
s = &dump_state_global;
|
|
dump_state_prepare(s);
|
|
dump_state_prepare(s);
|
|
|
|
|