DumpState: adding total_size and written_size fields
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 <peterx@redhat.com> Message-Id: <1455772616-8668-9-git-send-email-peterx@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
1fbeff72c2
commit
2264c2c96e
32
dump.c
32
dump.c
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
@ -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)
|
||||
@ -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) {
|
||||
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user