[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 1/3] dump: support cancel dump process
From: |
Hogan Wang |
Subject: |
[PATCH v3 1/3] dump: support cancel dump process |
Date: |
Sat, 30 Jul 2022 11:19:11 +0800 |
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(+)
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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH v3 1/3] dump: support cancel dump process,
Hogan Wang <=