Commit 7e429d3624 for qemu.org
commit 7e429d3624c4ad911af533e2f8f914b12f36dadc
Author: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Date: Tue Aug 25 20:20:51 2026 +0300
hw/display/qxl: trace skipped stale loadvm commands
Emit a trace event when qxl_post_load() drops a cursor or surface
command whose guest address no longer resolves, so a migration that
lands on a stale tracked pointer is visible instead of silent.
Message-ID: <20260825172051.435372-4-andrey.drobyshev@virtuozzo.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index fb77f217b1..d5f9771f5a 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -2461,6 +2461,8 @@ static int qxl_post_load(void *opaque, int version)
}
if (!qxl_loadvm_cmd_valid(d, d->guest_surfaces.cmds[in],
QXL_CMD_SURFACE)) {
+ trace_qxl_post_load_stale_cmd(d->id, "surface",
+ d->guest_surfaces.cmds[in]);
continue;
}
cmds[out].cmd.data = d->guest_surfaces.cmds[in];
@@ -2468,12 +2470,15 @@ static int qxl_post_load(void *opaque, int version)
cmds[out].group_id = MEMSLOT_GROUP_GUEST;
out++;
}
- if (d->guest_cursor &&
- qxl_loadvm_cmd_valid(d, d->guest_cursor, QXL_CMD_CURSOR)) {
- cmds[out].cmd.data = d->guest_cursor;
- cmds[out].cmd.type = QXL_CMD_CURSOR;
- cmds[out].group_id = MEMSLOT_GROUP_GUEST;
- out++;
+ if (d->guest_cursor) {
+ if (qxl_loadvm_cmd_valid(d, d->guest_cursor, QXL_CMD_CURSOR)) {
+ cmds[out].cmd.data = d->guest_cursor;
+ cmds[out].cmd.type = QXL_CMD_CURSOR;
+ cmds[out].group_id = MEMSLOT_GROUP_GUEST;
+ out++;
+ } else {
+ trace_qxl_post_load_stale_cmd(d->id, "cursor", d->guest_cursor);
+ }
}
qxl_spice_loadvm_commands(d, cmds, out);
g_free(cmds);
diff --git a/hw/display/trace-events b/hw/display/trace-events
index 4bfc457fba..c5e7e42af2 100644
--- a/hw/display/trace-events
+++ b/hw/display/trace-events
@@ -82,6 +82,7 @@ qxl_io_unexpected_vga_mode(int qid, uint64_t addr, uint64_t val, const char *des
qxl_io_write(int qid, const char *mode, uint64_t addr, const char *aname, uint64_t val, unsigned size, int async) "%d %s addr=%"PRIu64 " (%s) val=%"PRIu64" size=%u async=%d"
qxl_memslot_add_guest(int qid, uint32_t slot_id, uint64_t guest_start, uint64_t guest_end) "%d %u: guest phys 0x%"PRIx64 " - 0x%" PRIx64
qxl_post_load(int qid, const char *mode) "%d %s"
+qxl_post_load_stale_cmd(int qid, const char *kind, uint64_t data) "%d skip stale %s cmd 0x%"PRIx64
qxl_pre_load(int qid) "%d"
qxl_pre_save(int qid) "%d"
qxl_reset_surfaces(int qid) "%d"