@@ -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)
@@ -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;
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.wang@huawei.com> --- dump/dump.c | 23 +++++++++++++++++++++++ include/sysemu/dump.h | 2 ++ 2 files changed, 25 insertions(+)