Skip to content

Commit

Permalink
dump-guest-memory: add "detach" support
Browse files Browse the repository at this point in the history
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 <peterx@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Message-Id: <1455772616-8668-8-git-send-email-peterx@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
xzpeter authored and bonzini committed Feb 22, 2016
1 parent 63e27f2 commit 1fbeff7
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 1 deletion.
27 changes: 26 additions & 1 deletion dump.c
Expand Up @@ -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,
Expand All @@ -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.");
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions include/sysemu/dump.h
Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions include/sysemu/memory_mapping.h
Expand Up @@ -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 */
Expand All @@ -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;

Expand Down
3 changes: 3 additions & 0 deletions memory_mapping.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 1fbeff7

Please sign in to comment.