Skip to content

Commit

Permalink
DumpState: adding total_size and written_size fields
Browse files Browse the repository at this point in the history
Here, total_size is the size in bytes to be dumped (raw data, which
means before compression), while written_size are bytes handled (raw
size too).

Signed-off-by: Peter Xu <[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 1fbeff7 commit 2264c2c
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
32 changes: 32 additions & 0 deletions dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,8 @@ static void write_data(DumpState *s, void *buf, int length, Error **errp)
ret = fd_write_vmcore(buf, length, s);
if (ret < 0) {
error_setg(errp, "dump: failed to save memory");
} else {
s->written_size += length;
}
}

Expand Down Expand Up @@ -1324,6 +1326,7 @@ static void write_dump_pages(DumpState *s, Error **errp)
goto out;
}
}
s->written_size += s->dump_info.page_size;
}

ret = write_cache(&page_desc, NULL, 0, true);
Expand Down Expand Up @@ -1456,6 +1459,30 @@ bool dump_in_progress(void)
return (state->status == DUMP_STATUS_ACTIVE);
}

/* calculate total size of memory to be dumped (taking filter into
* acoount.) */
static int64_t dump_calculate_size(DumpState *s)
{
GuestPhysBlock *block;
int64_t size = 0, total = 0, left = 0, right = 0;

QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
if (s->has_filter) {
/* calculate the overlapped region. */
left = MAX(s->begin, block->target_start);
right = MIN(s->begin + s->length, block->target_end);
size = right - left;
size = size > 0 ? size : 0;
} else {
/* count the whole region in */
size = (block->target_end - block->target_start);
}
total += size;
}

return total;
}

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 All @@ -1467,6 +1494,7 @@ static void dump_init(DumpState *s, int fd, bool has_format,

s->has_format = has_format;
s->format = format;
s->written_size = 0;

/* kdump-compressed is conflict with paging and filter */
if (has_format && format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
Expand Down Expand Up @@ -1498,6 +1526,10 @@ static void dump_init(DumpState *s, int fd, bool has_format,

guest_phys_blocks_init(&s->guest_phys_blocks);
guest_phys_blocks_append(&s->guest_phys_blocks);
s->total_size = dump_calculate_size(s);
#ifdef DEBUG_DUMP_GUEST_MEMORY
fprintf(stderr, "DUMP: total memory to dump: %lu\n", s->total_size);
#endif

s->start = get_start_block(s);
if (s->start == -1) {
Expand Down
9 changes: 9 additions & 0 deletions include/sysemu/dump.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,15 @@ 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 */

int64_t total_size; /* total memory size (in bytes) to
* be dumped. When filter is
* enabled, this will only count
* those to be written. */
int64_t written_size; /* written memory size (in bytes),
* this could be used to calculate
* how much work we have
* finished. */
} DumpState;

uint16_t cpu_to_dump16(DumpState *s, uint16_t val);
Expand Down

0 comments on commit 2264c2c

Please sign in to comment.