Skip to content

Commit

Permalink
dump-guest-memory: using static DumpState, add DumpStatus
Browse files Browse the repository at this point in the history
Instead of malloc/free each time for DumpState, make it
static. Added DumpStatus to show status for dump.

This is to be used for detached dump.

Signed-off-by: Peter Xu <[email protected]>
Reviewed-by: Fam Zheng <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
xzpeter authored and bonzini committed Feb 22, 2016
1 parent 228de9c commit baf28f5
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 5 deletions.
21 changes: 16 additions & 5 deletions dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -1442,6 +1442,14 @@ static void get_max_mapnr(DumpState *s)
s->max_mapnr = dump_paddr_to_pfn(s, last_block->target_end);
}

static DumpState dump_state_global = { .status = DUMP_STATUS_NONE };

static void dump_state_prepare(DumpState *s)
{
/* zero the struct, setting status to active */
*s = (DumpState) { .status = DUMP_STATUS_ACTIVE };
}

static void dump_init(DumpState *s, int fd, bool has_format,
DumpGuestMemoryFormat format, bool paging, bool has_filter,
int64_t begin, int64_t length, Error **errp)
Expand Down Expand Up @@ -1676,24 +1684,27 @@ void qmp_dump_guest_memory(bool paging, const char *file,
return;
}

s = g_malloc0(sizeof(DumpState));
s = &dump_state_global;
dump_state_prepare(s);

dump_init(s, fd, has_format, format, paging, has_begin,
begin, length, &local_err);
if (local_err) {
g_free(s);
error_propagate(errp, local_err);
s->status = DUMP_STATUS_FAILED;
return;
}

if (has_format && format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
create_kdump_vmcore(s, errp);
create_kdump_vmcore(s, &local_err);
} else {
create_vmcore(s, errp);
create_vmcore(s, &local_err);
}

s->status = (local_err ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED);
error_propagate(errp, local_err);

dump_cleanup(s);
g_free(s);
}

DumpGuestMemoryCapability *qmp_query_dump_guest_memory_capability(Error **errp)
Expand Down
2 changes: 2 additions & 0 deletions include/sysemu/dump.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@

#include "sysemu/dump-arch.h"
#include "sysemu/memory_mapping.h"
#include "qapi-types.h"

typedef struct QEMU_PACKED MakedumpfileHeader {
char signature[16]; /* = "makedumpfile" */
Expand Down Expand Up @@ -176,6 +177,7 @@ typedef struct DumpState {
off_t offset_page; /* offset of page part in vmcore */
size_t num_dumpable; /* number of page that can be dumped */
uint32_t flag_compress; /* indicate the compression format */
DumpStatus status; /* current dump status */
} DumpState;

uint16_t cpu_to_dump16(DumpState *s, uint16_t val);
Expand Down
18 changes: 18 additions & 0 deletions qapi-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -2218,6 +2218,24 @@
'*begin': 'int', '*length': 'int',
'*format': 'DumpGuestMemoryFormat'} }

##
# @DumpStatus
#
# Describe the status of a long-running background guest memory dump.
#
# @none: no dump-guest-memory has started yet.
#
# @active: there is one dump running in background.
#
# @completed: the last dump has finished successfully.
#
# @failed: the last dump has failed.
#
# Since 2.6
##
{ 'enum': 'DumpStatus',
'data': [ 'none', 'active', 'completed', 'failed' ] }

##
# @DumpGuestMemoryCapability:
#
Expand Down

0 comments on commit baf28f5

Please sign in to comment.