Break saving pages or dump iterate when dump job in cancel state, make sure dump process exits as soon as possible.
Signed-off-by: Hogan Wang <hogan.w...@huawei.com> --- dump/dump.c | 23 +++++++++++++++++++++++ include/sysemu/dump.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/dump/dump.c b/dump/dump.c index 4d9658ffa2..a57c580b12 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -54,6 +54,8 @@ static Error *dump_migration_blocker; DIV_ROUND_UP((name_size), 4) + \ DIV_ROUND_UP((desc_size), 4)) * 4) +static bool dump_cancelling(void); + static inline bool dump_is_64bit(DumpState *s) { return s->dump_info.d_class == ELFCLASS64; @@ -118,6 +120,10 @@ static int fd_write_vmcore(const void *buf, size_t size, void *opaque) DumpState *s = opaque; size_t written_size; + if (dump_cancelling()) { + return -ECANCELED; + } + written_size = qemu_write_full(s->fd, buf, size); if (written_size != size) { return -errno; @@ -627,6 +633,10 @@ static void dump_iterate(DumpState *s, Error **errp) do { block = s->next_block; + if (dump_cancelling()) { + error_setg(errp, "dump: job cancelled"); + return; + } size = block->target_end - block->target_start; if (s->has_filter) { @@ -1321,6 +1331,10 @@ static void write_dump_pages(DumpState *s, Error **errp) * first page of page section */ while (get_next_page(&block_iter, &pfn_iter, &buf, s)) { + if (dump_cancelling()) { + error_setg(errp, "dump: job cancelled"); + goto out; + } /* check zero page */ if (buffer_is_zero(buf, s->dump_info.page_size)) { ret = write_cache(&page_desc, &pd_zero, sizeof(PageDescriptor), @@ -1540,6 +1554,15 @@ bool qemu_system_dump_in_progress(void) return (qatomic_read(&state->status) == DUMP_STATUS_ACTIVE); } +static bool dump_cancelling(void) +{ + DumpState *state = &dump_state_global; + if (state->job && job_is_cancelled(state->job)) { + return true; + } + return false; +} + /* calculate total size of memory to be dumped (taking filter into * acoount.) */ static int64_t dump_calculate_size(DumpState *s) diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h index ffc2ea1072..41bdbe595f 100644 --- a/include/sysemu/dump.h +++ b/include/sysemu/dump.h @@ -15,6 +15,7 @@ #define DUMP_H #include "qapi/qapi-types-dump.h" +#include "qemu/job.h" #define MAKEDUMPFILE_SIGNATURE "makedumpfile" #define MAX_SIZE_MDF_HEADER (4096) /* max size of makedumpfile_header */ @@ -154,6 +155,7 @@ typedef struct DumpState { GuestPhysBlockList guest_phys_blocks; ArchDumpInfo dump_info; MemoryMappingList list; + Job *job; uint32_t phdr_num; uint32_t shdr_num; bool resume; -- 2.33.0