[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v8 07/11] dump-guest-memory: add "detach" support
From: |
Peter Xu |
Subject: |
[Qemu-devel] [PATCH v8 07/11] dump-guest-memory: add "detach" support |
Date: |
Thu, 18 Feb 2016 13:16:52 +0800 |
If "detach" is provided, one thread is created to do the dump work,
while main thread will return immediately. For each GuestPhysBlock,
adding one more field "mr" to points to MemoryRegion that it
belongs, also ref the mr before use.
Signed-off-by: Peter Xu <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
---
dump.c | 27 ++++++++++++++++++++++++++-
include/sysemu/dump.h | 1 +
include/sysemu/memory_mapping.h | 4 ++++
memory_mapping.c | 3 +++
4 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/dump.c b/dump.c
index 923e3a5..9210a72 100644
--- a/dump.c
+++ b/dump.c
@@ -1643,6 +1643,20 @@ static void dump_process(DumpState *s, Error **errp)
dump_cleanup(s);
}
+static void *dump_thread(void *data)
+{
+ Error *err = NULL;
+ DumpState *s = (DumpState *)data;
+
+ dump_process(s, &err);
+
+ if (err) {
+ /* TODO: notify user the error */
+ error_free(err);
+ }
+ return NULL;
+}
+
void qmp_dump_guest_memory(bool paging, const char *file,
bool has_detach, bool detach,
bool has_begin, int64_t begin, bool has_length,
@@ -1653,6 +1667,7 @@ void qmp_dump_guest_memory(bool paging, const char *file,
int fd = -1;
DumpState *s;
Error *local_err = NULL;
+ bool detach_p = false;
if (runstate_check(RUN_STATE_INMIGRATE)) {
error_setg(errp, "Dump not allowed during incoming migration.");
@@ -1684,6 +1699,9 @@ void qmp_dump_guest_memory(bool paging, const char *file,
error_setg(errp, QERR_MISSING_PARAMETER, "begin");
return;
}
+ if (has_detach) {
+ detach_p = detach;
+ }
/* check whether lzo/snappy is supported */
#ifndef CONFIG_LZO
@@ -1733,7 +1751,14 @@ void qmp_dump_guest_memory(bool paging, const char *file,
return;
}
- dump_process(s, errp);
+ if (detach_p) {
+ /* detached dump */
+ qemu_thread_create(&s->dump_thread, "dump_thread", dump_thread,
+ s, QEMU_THREAD_DETACHED);
+ } else {
+ /* sync dump */
+ dump_process(s, errp);
+ }
}
DumpGuestMemoryCapability *qmp_query_dump_guest_memory_capability(Error **errp)
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
index 1da3ddb..06393c3 100644
--- a/include/sysemu/dump.h
+++ b/include/sysemu/dump.h
@@ -181,6 +181,7 @@ typedef struct DumpState {
bool has_format; /* whether format is provided */
DumpGuestMemoryFormat format; /* valid only if has_format == true */
+ QemuThread dump_thread; /* thread for detached dump */
} DumpState;
uint16_t cpu_to_dump16(DumpState *s, uint16_t val);
diff --git a/include/sysemu/memory_mapping.h b/include/sysemu/memory_mapping.h
index a75d59a..d46d879 100644
--- a/include/sysemu/memory_mapping.h
+++ b/include/sysemu/memory_mapping.h
@@ -16,6 +16,7 @@
#include "qemu/queue.h"
#include "qemu/typedefs.h"
+#include "exec/memory.h"
typedef struct GuestPhysBlock {
/* visible to guest, reflects PCI hole, etc */
@@ -27,6 +28,9 @@ typedef struct GuestPhysBlock {
/* points into host memory */
uint8_t *host_addr;
+ /* points to the MemoryRegion that this block belongs to */
+ MemoryRegion *mr;
+
QTAILQ_ENTRY(GuestPhysBlock) next;
} GuestPhysBlock;
diff --git a/memory_mapping.c b/memory_mapping.c
index 04db3ac..c8855de 100644
--- a/memory_mapping.c
+++ b/memory_mapping.c
@@ -178,6 +178,7 @@ void guest_phys_blocks_free(GuestPhysBlockList *list)
QTAILQ_FOREACH_SAFE(p, &list->head, next, q) {
QTAILQ_REMOVE(&list->head, p, next);
+ memory_region_unref(p->mr);
g_free(p);
}
list->num = 0;
@@ -241,6 +242,8 @@ static void guest_phys_blocks_region_add(MemoryListener
*listener,
block->target_start = target_start;
block->target_end = target_end;
block->host_addr = host_addr;
+ block->mr = section->mr;
+ memory_region_ref(section->mr);
QTAILQ_INSERT_TAIL(&g->list->head, block, next);
++g->list->num;
--
2.4.3
- [Qemu-devel] [PATCH v7 10/11] Dump: add hmp command "info dump", (continued)
- [Qemu-devel] [PATCH v7 10/11] Dump: add hmp command "info dump", Peter Xu, 2016/02/16
- [Qemu-devel] [PATCH v7 11/11] dump-guest-memory: add qmp event DUMP_COMPLETED, Peter Xu, 2016/02/16
- [Qemu-devel] [PATCH v7 00/11] Add basic "detach" support for dump-guest-memory, Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 01/11] dump-guest-memory: cleanup: removing dump_{error|cleanup}()., Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 02/11] dump-guest-memory: add "detach" flag for QMP/HMP interfaces., Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 03/11] dump-guest-memory: using static DumpState, add DumpStatus, Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 04/11] dump-guest-memory: add dump_in_progress() helper function, Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 05/11] dump-guest-memory: introduce dump_process() helper function., Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 06/11] dump-guest-memory: disable dump when in INMIGRATE state, Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 07/11] dump-guest-memory: add "detach" support,
Peter Xu <=
- [Qemu-devel] [PATCH v8 08/11] DumpState: adding total_size and written_size fields, Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 09/11] Dump: add qmp command "query-dump", Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 10/11] Dump: add hmp command "info dump", Peter Xu, 2016/02/18
- [Qemu-devel] [PATCH v8 11/11] dump-guest-memory: add qmp event DUMP_COMPLETED, Peter Xu, 2016/02/18
- Re: [Qemu-devel] [PATCH v7 00/11] Add basic "detach" support for dump-guest-memory, Peter Xu, 2016/02/18
- Re: [Qemu-devel] [PATCH v7 00/11] Add basic "detach" support for dump-guest-memory, Markus Armbruster, 2016/02/18
- Re: [Qemu-devel] [PATCH v7 00/11] Add basic "detach" support for dump-guest-memory, Paolo Bonzini, 2016/02/18