aboutsummaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
authorJanosch Frank <frankja@linux.ibm.com>2023-11-09 12:04:43 +0000
committerThomas Huth <thuth@redhat.com>2023-11-14 10:42:32 +0100
commitd12a91e0baafce7b1cbacff7cf9339eeb0011732 (patch)
tree42c2e895a89e72ed227a682df9e79734dedf58c4 /target
parente72629e5149aba6f44122ea6d2a803ef136a0c6b (diff)
downloadqemu-d12a91e0baafce7b1cbacff7cf9339eeb0011732.zip
qemu-d12a91e0baafce7b1cbacff7cf9339eeb0011732.tar.gz
qemu-d12a91e0baafce7b1cbacff7cf9339eeb0011732.tar.bz2
target/s390x/arch_dump: Add arch cleanup function for PV dumps
PV dumps block vcpu runs until dump end is reached. If there's an error between PV dump init and PV dump end the vm will never be able to run again. One example of such an error is insufficient disk space for the dump file. Let's add a cleanup function that tries to do a dump end. The dump completion data is discarded but there's no point in writing it to a file anyway if there's a possibility that other PV dump data is missing. Signed-off-by: Janosch Frank <frankja@linux.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-ID: <20231109120443.185979-4-frankja@linux.ibm.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
Diffstat (limited to 'target')
-rw-r--r--target/s390x/arch_dump.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/target/s390x/arch_dump.c b/target/s390x/arch_dump.c
index bdb0bfa..7e8a1b4 100644
--- a/target/s390x/arch_dump.c
+++ b/target/s390x/arch_dump.c
@@ -433,6 +433,22 @@ static int arch_sections_write(DumpState *s, uint8_t *buff)
return 0;
}
+static void arch_cleanup(DumpState *s)
+{
+ g_autofree uint8_t *buff = NULL;
+ int rc;
+
+ if (!pv_dump_initialized) {
+ return;
+ }
+
+ buff = g_malloc(kvm_s390_pv_dmp_get_size_completion_data());
+ rc = kvm_s390_dump_completion_data(buff);
+ if (!rc) {
+ pv_dump_initialized = false;
+ }
+}
+
int cpu_get_dump_info(ArchDumpInfo *info,
const struct GuestPhysBlockList *guest_phys_blocks)
{
@@ -448,6 +464,7 @@ int cpu_get_dump_info(ArchDumpInfo *info,
info->arch_sections_add_fn = *arch_sections_add;
info->arch_sections_write_hdr_fn = *arch_sections_write_hdr;
info->arch_sections_write_fn = *arch_sections_write;
+ info->arch_cleanup_fn = *arch_cleanup;
}
return 0;
}