
Reported in the community forum[0].
For 6.1.0, there were a few changes to the coroutine-sleep API, but
the adaptations in f376b2b
("update and rebase to QEMU v6.1.0") made
a mistake.
Currently, target_close_wait is NULL when passed to
qemu_co_sleep_ns_wakeable(), which further passes it to
qemu_co_sleep(), but there, it is dereferenced when trying to access
the 'to_wake' member:
> Thread 1 "kvm" received signal SIGSEGV, Segmentation fault.
> qemu_co_sleep (w=0x0) at ../util/qemu-coroutine-sleep.c:57
To fix it, create a proper struct and pass its address instead. Also
call qemu_co_sleep_wake unconditionally, because the NULL check (for
the 'to_wake' member) is done inside the function itself.
This patch is based on what the QEMU commits introducing the changes
to the coroutine-sleep API did to the callers in QEMU:
eaee072085 ("coroutine-sleep: allow qemu_co_sleep_wake that wakes nothing")
29a6ea24eb ("coroutine-sleep: replace QemuCoSleepState pointer with struct in the API")
[0]: https://forum.proxmox.com/threads/112130/
Tested-by: Mira Limbeck <m.limbeck@proxmox.com>
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
36 lines
1.2 KiB
Diff
36 lines
1.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Stefan Reiter <s.reiter@proxmox.com>
|
|
Date: Wed, 26 May 2021 17:36:55 +0200
|
|
Subject: [PATCH] PVE: savevm-async: register yank before
|
|
migration_incoming_state_destroy
|
|
|
|
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
|
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|
---
|
|
migration/savevm-async.c | 5 +++++
|
|
1 file changed, 5 insertions(+)
|
|
|
|
diff --git a/migration/savevm-async.c b/migration/savevm-async.c
|
|
index 615a4484c8..161b4b9985 100644
|
|
--- a/migration/savevm-async.c
|
|
+++ b/migration/savevm-async.c
|
|
@@ -19,6 +19,7 @@
|
|
#include "qemu/timer.h"
|
|
#include "qemu/main-loop.h"
|
|
#include "qemu/rcu.h"
|
|
+#include "qemu/yank.h"
|
|
|
|
/* #define DEBUG_SAVEVM_STATE */
|
|
|
|
@@ -578,6 +579,10 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp)
|
|
dirty_bitmap_mig_before_vm_start();
|
|
|
|
qemu_fclose(f);
|
|
+
|
|
+ /* state_destroy assumes a real migration which would have added a yank */
|
|
+ yank_register_instance(MIGRATION_YANK_INSTANCE, &error_abort);
|
|
+
|
|
migration_incoming_state_destroy();
|
|
if (ret < 0) {
|
|
error_setg_errno(errp, -ret, "Error while loading VM state");
|